{"id":51280377,"url":"https://github.com/almondyoung/macevery","last_synced_at":"2026-06-30T01:03:55.221Z","repository":{"id":364230672,"uuid":"1266987827","full_name":"almondyoung/macevery","owner":"almondyoung","description":"Rust experiments for macOS automation and everyday tooling.","archived":false,"fork":false,"pushed_at":"2026-06-12T07:10:05.000Z","size":68,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-12T08:15:53.451Z","etag":null,"topics":["automation","macos","rust","tooling"],"latest_commit_sha":null,"homepage":null,"language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/almondyoung.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-06-12T06:01:08.000Z","updated_at":"2026-06-12T07:08:25.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/almondyoung/macevery","commit_stats":null,"previous_names":["almondyoung/macevery"],"tags_count":3,"template":false,"template_full_name":null,"purl":"pkg:github/almondyoung/macevery","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/almondyoung%2Fmacevery","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/almondyoung%2Fmacevery/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/almondyoung%2Fmacevery/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/almondyoung%2Fmacevery/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/almondyoung","download_url":"https://codeload.github.com/almondyoung/macevery/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/almondyoung%2Fmacevery/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34948230,"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-29T02:00:05.398Z","response_time":58,"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":["automation","macos","rust","tooling"],"created_at":"2026-06-30T01:03:54.530Z","updated_at":"2026-06-30T01:03:55.210Z","avatar_url":"https://github.com/almondyoung.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# MacEvery\n\nMacEvery is an Everything-like local filename and path search app for macOS. It\nbuilds its own local index and searches that index instead of scanning the disk\non every query.\n\n## Features\n\n- Native macOS GUI built with SwiftUI/AppKit.\n- Rust CLI and reusable search core.\n- Recursive indexing of files, directories, symlinks, and `.app` bundles.\n- Local SQLite database at `~/.local/share/macevery/index.sqlite`.\n- FSEvents-based `watch` command for incremental index updates.\n- Local search service used by the GUI with Fastest, Balanced, Automatic, and\n  Low Memory backends.\n- Global `Ctrl+Space` hotkey to bring the search window forward.\n- Open, Reveal in Finder, Quick Look, Copy Path, Copy Name, Copy Parent Folder,\n  and Copy File actions.\n- Case-insensitive strict search by default, glob wildcards, and explicit fuzzy\n  search.\n- Inline filters such as `ext:pdf|docx`, `kind:dir`, `path:Downloads`,\n  `part:Downloads`, `!path:Library`, and `mtime:7d`.\n- Sortable result columns, draggable result rows, and a Full Disk Access status\n  shortcut in the GUI.\n- Structured index root and exclude editors in Settings.\n\n## Quick Start\n\n1. Download `MacEvery-macos.zip` from GitHub Releases.\n2. Unzip it and move `MacEvery.app` to `/Applications`.\n3. Open the app. If macOS blocks an unsigned build, right-click the app and\n   choose Open, or allow it in System Settings.\n4. Grant Full Disk Access if you want protected folders such as Mail, Messages,\n   Photos, and parts of `~/Library` to be indexed.\n5. Review index roots in Settings. The default roots are your home folder and\n   `/Applications`.\n6. Click Rebuild Index.\n7. Search from the main window, or press `Ctrl+Space` to bring MacEvery forward.\n\nMacEvery searches its local index. If a file is not indexed yet, rebuild or wait\nfor the FSEvents watcher to refresh it.\n\n## Build\n\nRequirements:\n\n- macOS 13 or later\n- Rust toolchain\n- Apple Command Line Tools or Xcode\n\nBuild the CLI and app:\n\n```bash\nmake release\nmake app\n```\n\nCreate a distributable unsigned app zip:\n\n```bash\nmake dist\n```\n\nThe packaged app is written to:\n\n```text\n.build/MacEvery.app\n```\n\nThe zip artifact is written to:\n\n```text\n.build/release/MacEvery-macos.zip\n```\n\nRun the GUI:\n\n```bash\nopen .build/MacEvery.app\n```\n\n## CLI\n\nCreate or rebuild an index:\n\n```bash\n./target/release/macevery index --rebuild ~ /Applications\n```\n\nSearch:\n\n```bash\n./target/release/macevery search \"invoice pdf\"\n./target/release/macevery search \"report\" --limit 50\n./target/release/macevery search \"*gpt*pdf\"\n./target/release/macevery search \"~leetcode\"\n./target/release/macevery search \"leetcode\" --fuzzy\n./target/release/macevery search \"pdf\" --ext pdf\n./target/release/macevery search \"node\" --kind dir\n./target/release/macevery search \"Downloads dmg\" --path\n./target/release/macevery search \"ext:pdf path:Downloads mtime:7d invoice\"\n./target/release/macevery search \"ext:pdf|docx !path:Library invoice\"\n./target/release/macevery search \"kind:dir code\"\n./target/release/macevery search \"part:Downloads \\\"quarterly report\\\"\"\n./target/release/macevery search \"screenshot\" --json\n```\n\nSearch is case-insensitive by default. Plain terms use strict basename/path\ncontains matching, so `leetcode` does not fuzzy-match unrelated names such as\n`sqlite_result_code.h`. `*` and `?` work as filename/path wildcards, so\n`*gpt*pdf` matches names such as `ChatGPT notes.PDF`. Fuzzy search is explicit:\nprefix the query with `~` or pass `--fuzzy`.\n\nInline filters can be typed directly into the GUI search box or CLI query:\n\n- `ext:pdf`, `extension:pdf`, or `ext:pdf|docx` limits results by extension.\n- `kind:file`, `kind:dir`, `kind:folder`, `kind:app`, `kind:symlink`,\n  `kind:other`, or `kind:file|dir` limits the file kind.\n- `path:Downloads` requires the path to contain `Downloads`.\n- `part:Downloads` or `segment:Downloads` requires an exact path component.\n- Prefix a filter with `!` or `-` to exclude it, such as `!path:Library`,\n  `!ext:tmp`, or `!kind:dir`.\n- `mtime:7d`, `mtime:24h`, `mtime:2w`, `mtime:3mo`, or `mtime:1y` limits\n  results to recently modified items.\n- Quoted values are supported, such as `path:\"Application Support\"`.\n\nOpen or reveal the top result:\n\n```bash\n./target/release/macevery open \"invoice pdf\"\n./target/release/macevery reveal \"invoice pdf\"\n```\n\nInspect or clean the database:\n\n```bash\n./target/release/macevery status\n./target/release/macevery status --json\n./target/release/macevery clean\n```\n\nStart incremental indexing for the already indexed roots:\n\n```bash\n./target/release/macevery watch\n```\n\nStart the local in-memory search service:\n\n```bash\n./target/release/macevery serve --backend memory\ncurl 'http://127.0.0.1:17649/search?q=invoice%20pdf\u0026limit=20'\n```\n\nSearch service backends:\n\n- `memory`: fastest. Loads full records into memory.\n- `compact`: balanced. Keeps an in-memory compressed index.\n- `sqlite`: low memory. Queries SQLite directly.\n- `auto`: chooses a backend from index size and memory budget.\n\nThe GUI defaults to `memory` because MacEvery is optimized for fast local use.\nSwitch to Balanced or Low Memory in Settings if background memory matters more.\nFor `auto`, set `MACEVERY_MEMORY_BUDGET_MB` to override the default budget.\n\nBenchmark the current index:\n\n```bash\n./target/release/macevery bench\n./target/release/macevery bench --json\n./target/release/macevery bench --queries queries.txt\n./target/release/macevery bench --rebuild ~/Documents /Applications\n```\n\nThe benchmark reports index size, database size, query p50/p95/p99, and the\nslowest queries. It is intended for comparing backend and query changes over\ntime.\n\n## GUI\n\nThe GUI does not live-scan the filesystem for search. It starts the bundled\n`macevery serve` process for low-latency search and `macevery watch` so FSEvents\ncan keep the index fresh. If the service is unavailable, the GUI falls back to\nthe CLI search path.\n\nOn first launch, MacEvery shows a compact setup panel for Full Disk Access,\nindex roots, and index rebuild. You can reopen those controls from the sidebar\nand Settings.\n\nKeyboard and actions:\n\n- Type to search live.\n- Press `Ctrl+Space` globally to bring MacEvery forward.\n- Enter opens the selected result.\n- Cmd+Enter reveals it in Finder.\n- Cmd+C copies the selected path.\n- Shift+Cmd+C copies the selected filename.\n- Space opens Quick Look through `qlmanage`.\n- Right-click a result for Open, Reveal, Quick Look, Copy Path, Copy Name, Copy\n  Parent Folder, and Copy File.\n- Click column headers to sort by name, path, kind, size, or modified time.\n- Drag a result row into Finder or another app to pass the file URL.\n- Rebuild Index starts a full reindex of configured roots.\n- The sidebar shows a best-effort Full Disk Access status and opens the macOS\n  privacy settings page.\n- Settings provides structured index root and exclude rule editors.\n\n## Known Limitations\n\n- Release artifacts may be unsigned unless signing secrets are configured.\n  Unsigned builds trigger macOS Gatekeeper warnings.\n- Full Disk Access is required for protected folders. Without it, those folders\n  may be skipped during indexing.\n- The index stores local file paths and metadata in SQLite and is not encrypted.\n- iCloud Drive, network volumes, and removable disks depend on macOS reporting\n  paths and FSEvents consistently.\n- FSEvents checkpointing is best-effort. Dropped event flags trigger root\n  rescans, but offline volume semantics are not yet modeled.\n- Unicode normalization is not fully normalized across NFC/NFD spellings yet.\n\n## Troubleshooting\n\nIf search returns nothing:\n\n```bash\n./target/release/macevery status\n./target/release/macevery index --rebuild ~ /Applications\n```\n\nIf a newly created or deleted file is stale, use Refresh in the GUI or restart\nthe watcher:\n\n```bash\n./target/release/macevery watch\n```\n\nIf the GUI cannot connect to the service, it should fall back to CLI search. You\ncan also verify the service manually:\n\n```bash\n./target/release/macevery serve --backend memory\ncurl 'http://127.0.0.1:17649/status'\n```\n\nIf the database looks corrupted or you want a clean rebuild:\n\n```bash\n./target/release/macevery clean\n./target/release/macevery index --rebuild ~ /Applications\n```\n\nIf protected folders are missing, grant Full Disk Access to MacEvery and rebuild\nthe index.\n\n## Homebrew\n\nA Homebrew cask is not published yet. The intended future install path is:\n\n```bash\nbrew install --cask almondyoung/tap/macevery\n```\n\nUntil then, use the release zip or build from source with `make dist`.\n\n## Release Signing\n\n`make app` ad-hoc signs local builds by default. To create Developer ID signed\nand notarized builds, provide signing and Apple notarization credentials:\n\n```bash\nexport MACEVERY_CODESIGN_IDENTITY=\"Developer ID Application: Your Name (TEAMID)\"\nexport APPLE_ID=\"name@example.com\"\nexport APPLE_TEAM_ID=\"TEAMID\"\nexport APPLE_APP_SPECIFIC_PASSWORD=\"xxxx-xxxx-xxxx-xxxx\"\nmake notarize\n```\n\nGitHub Releases use the same path when these repository secrets are configured:\n\n- `MACEVERY_CODESIGN_CERTIFICATE_P12`: base64-encoded Developer ID certificate\n  `.p12`.\n- `MACEVERY_CODESIGN_CERTIFICATE_PASSWORD`: password for the `.p12`.\n- `MACEVERY_CODESIGN_IDENTITY`: Developer ID Application identity name.\n- `APPLE_ID`, `APPLE_TEAM_ID`, `APPLE_APP_SPECIFIC_PASSWORD`: notarization\n  credentials.\n\nWithout those secrets, the release workflow still publishes an unsigned app zip.\n\n## Privacy\n\nThe index contains local file paths. It is stored locally and is not uploaded.\nThe current storage is not encrypted. Future hardening should add Full Disk\nAccess onboarding, database protection options, signed/notarized distribution,\nand explicit retention controls.\n\n## License\n\nMIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falmondyoung%2Fmacevery","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Falmondyoung%2Fmacevery","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Falmondyoung%2Fmacevery/lists"}