{"id":51055791,"url":"https://github.com/chenasraf/openupdater","last_synced_at":"2026-06-22T21:01:10.187Z","repository":{"id":366451194,"uuid":"1275595769","full_name":"chenasraf/OpenUpdater","owner":"chenasraf","description":"Open-source MacUpdater replacement. Keep all your macOS apps up to date","archived":false,"fork":false,"pushed_at":"2026-06-21T23:11:30.000Z","size":685,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2026-06-21T23:13:52.362Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Swift","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/chenasraf.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":".github/FUNDING.yml","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},"funding":{"github":"chenasraf","patreon":null,"open_collective":null,"ko_fi":"casraf","tidelift":null,"community_bridge":null,"liberapay":null,"issuehunt":null,"otechie":null,"custom":["https://www.paypal.com/cgi-bin/webscr?cmd=_donations\u0026business=TSH3C3ABGQM22\u0026currency_code=ILS\u0026source=url"]}},"created_at":"2026-06-20T22:45:37.000Z","updated_at":"2026-06-21T23:11:20.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/chenasraf/OpenUpdater","commit_stats":null,"previous_names":["chenasraf/openupdater"],"tags_count":2,"template":false,"template_full_name":null,"purl":"pkg:github/chenasraf/OpenUpdater","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chenasraf%2FOpenUpdater","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chenasraf%2FOpenUpdater/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chenasraf%2FOpenUpdater/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chenasraf%2FOpenUpdater/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/chenasraf","download_url":"https://codeload.github.com/chenasraf/OpenUpdater/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/chenasraf%2FOpenUpdater/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34665261,"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-22T02:00:06.391Z","response_time":106,"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-22T21:01:09.378Z","updated_at":"2026-06-22T21:01:10.171Z","avatar_url":"https://github.com/chenasraf.png","language":"Swift","funding_links":["https://github.com/sponsors/chenasraf","https://ko-fi.com/casraf","https://www.paypal.com/cgi-bin/webscr?cmd=_donations\u0026business=TSH3C3ABGQM22\u0026currency_code=ILS\u0026source=url"],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"docs/icon.png\" width=\"128\" alt=\"OpenUpdater app icon\" /\u003e\n  \u003ch1\u003eOpenUpdater\u003c/h1\u003e\n  \u003cp\u003e\u003cstrong\u003eKeep every Mac app up to date — from one open, community-driven source.\u003c/strong\u003e\u003c/p\u003e\n\u003c/div\u003e\n\nOpenUpdater is a lightweight macOS menubar app that scans the apps in your `/Applications` folder,\nfinds newer versions, and updates them in a click. It isn't limited to App Store or any single\npackage manager — it covers regular Mac apps: GitHub releases, Sparkle-based apps, and direct\ndownloads.\n\nOpenUpdater provides a crowdsourced, community-maintained set of update sources. Coverage grows as\npeople add recipes, so OpenUpdater can keep up with apps that have no built-in updater of their own.\n\n\u003cdiv align=\"center\"\u003e\n  \u003cimg src=\"docs/screenshots/screenshot-01.png\" width=\"820\" alt=\"OpenUpdater showing available updates\" /\u003e\n\u003c/div\u003e\n\n## Features\n\n- 🔍 **Automatic scanning** — reads your installed apps and checks each for a newer version.\n- 🔄 **Per-app re-scan** — re-check a single app on demand, so updates applied elsewhere are picked\n  up right away.\n- ⬆️ **One-click updates** — download, verify, and replace an app in place. Update one, several, or\n  all at once.\n- 🧩 **Works with many sources** — GitHub Releases, Sparkle appcasts (auto-detected), and direct\n  HTTP/JSON/XML/YAML version feeds.\n- 🪶 **Lives in your menubar** — a quick popover for a glance, plus a full window for the details.\n- 🔔 **Release notes** — jump straight to an app's changelog before you update.\n- 🙈 **Ignore lists** — silence an app entirely, or skip just one version you don't want.\n- 🧭 **Spot the gaps** — see which apps have no update source yet, and report them in a click to\n  help grow coverage.\n- 🧪 **Pre-releases** — opt into beta/pre-release builds on a per-app basis.\n- 🌿 **Release channels** — for apps with more than one stream (Firefox/Thunderbird ESR, LibreOffice\n  Fresh/Still, Blender LTS, …), pick which one to track per app.\n- 🔐 **Optional GitHub token** — raises GitHub's rate limit for faster, more reliable checks (stored\n  encrypted in your Keychain).\n\n## Installation\n\n1. Download the latest **`OpenUpdater.dmg`** from the\n   [Releases page](https://github.com/chenasraf/OpenUpdater/releases/latest).\n2. Open the DMG and drag **OpenUpdater** into your **Applications** folder.\n3. Launch it from Applications. OpenUpdater appears in your menubar (the two-arrows icon).\n\n\u003e [!NOTE]  \n\u003e The first time you open it, macOS may ask you to confirm. If it's blocked, right-click the app in\n\u003e Finder and choose **Open**, then confirm.\n\n**Requirements:** macOS 15 (Sequoia) or later.\n\n## Usage\n\n### The menubar\n\nClick the menubar icon for a quick popover listing available updates. From there you can check for\nupdates, open the full window, or quit.\n\nClosing the main window (⌘W) keeps OpenUpdater running quietly in the menubar so it can keep\nchecking in the background. To quit entirely, use **⌘Q** (it'll ask to confirm).\n\n### Checking and updating\n\n- The **Updates** tab lists every app with a newer version, showing the new version next to your\n  installed one.\n- Click **Update** on a row to update a single app.\n- Select multiple rows (click, ⌘-click, ⇧-click) and use **Update Selected** to update a batch, or\n  **Update All** to update everything at once.\n- A running update shows live progress; click the **✕** to cancel it.\n- The **Installed** tab shows all your apps and whether each is up to date.\n\nPress the refresh button (top-right) any time to check again.\n\n### Right-click options\n\nRight-click any app for more options:\n\n- **Re-scan App** — re-check just this app. Handy if you updated it elsewhere and want OpenUpdater\n  to notice the new version right away.\n- **Ignore this app** — stop showing updates for it.\n- **Ignore this version** — skip a specific version but keep getting future ones.\n- **Check for pre-releases** — include beta builds for that app.\n- **Release Channel** — for apps that publish more than one stream (e.g. Firefox Stable vs ESR,\n  LibreOffice Fresh vs Still, Blender Latest vs LTS), choose which one to follow. Only shown when a\n  recipe defines multiple channels.\n\nManage everything you've ignored under **Preferences → Ignore List**.\n\n### Preferences\n\nOpen **Preferences** (⌘,) to:\n\n- Add a **GitHub access token** to raise the update-check rate limit (optional; stored encrypted in\n  your Keychain).\n- Review and clear your **ignore list**.\n- See your **unsupported apps** — the ones with no update source yet. From here you can copy or\n  export their bundle IDs, or open a pre-filled GitHub issue to request support, which helps grow\n  the community registry.\n- Install or remove the optional **Background Helper** (see\n  [Installing updates](#installing-updates) below).\n\n## How it works\n\nFor each installed app, OpenUpdater figures out the latest version using the best available source:\n\n- **Sparkle** — apps that advertise a Sparkle feed are detected automatically, no configuration\n  needed.\n- **Update recipes** — a small YAML file per app describes where to look (a GitHub repo, a download\n  page, a version API, etc.). These recipes are the open, community-maintained registry at the heart\n  of the project.\n\nWhen you update, OpenUpdater downloads the new build, verifies it's the right app and validly\nsigned, then swaps it into place — sending the old version to the Trash.\n\n### Installing updates\n\nMost updates are a simple swap — replacing an app in `/Applications` with a newer copy — and need no\nspecial permissions. Two cases need administrator rights: an app that ships as a `.pkg` installer,\nand replacing an app you don't have write access to (e.g. one installed by another admin or sitting\nin a protected location). For those, OpenUpdater shows the standard macOS password prompt for that\none install.\n\nIf you'd rather not be asked each time, install the optional **Background Helper** from\n**Preferences → Background Helper**. It's a small privileged service that performs exactly those two\noperations — running `.pkg` installers and replacing protected apps — so that, once set up, updates\napply without a password prompt. Setup is one-time:\n\n1. Click **Install Helper…**.\n2. Approve **OpenUpdater** in **System Settings → General → Login Items \u0026 Extensions** when macOS\n   asks (the helper status then shows _Installed and enabled_).\n\nThe helper runs as a separate XPC daemon, registered through Apple's `SMAppService`. It only acts on\nrequests from OpenUpdater itself — every call is checked against the app's code signature before\nanything runs — and does nothing beyond installing/replacing apps. You can take it out at any time\nwith **Remove**, which unregisters the daemon; OpenUpdater falls back to the per-install password\nprompt. The helper is entirely optional — everything works without it.\n\n## Contributing\n\nOpenUpdater's coverage grows through community-maintained **update recipes** — that open registry of\nupdate sources is the whole point of the project. There are a few ways to help, and most need no\nfork.\n\n### Request an app (no fork needed)\n\nOpen an\n**[Add an app](https://github.com/chenasraf/OpenUpdater/issues/new?template=add_recipe.yml)** issue\nwith the app's name, bundle identifier, and where its releases live. A maintainer can turn that into\na recipe — and if you've drafted the YAML yourself, you can paste it right into the issue.\n\n\u003e Tip: the in-app **Preferences → Unsupported** tab lists every installed app that has no recipe\n\u003e yet. Each row's **⋯** menu can **Request on GitHub** (a pre-filled issue) or **Create Custom\n\u003e Recipe** (see below); **Report All…** files one issue for the whole list.\n\n### Build a recipe in the app (no fork, no rebuild)\n\nOpenUpdater can author and run recipes for you — no Xcode needed. Open **Preferences → Custom\nRecipes** (or pick **Create Custom Recipe** from an app's **⋯** menu in the **Unsupported** tab) to\nget an editable YAML pane with:\n\n- **Live validation** as you type, plus an **enable/disable** switch per recipe.\n- **Override built-in recipes** — a custom recipe with the same bundle id wins, so you can fix or\n  tweak coverage for an app without waiting for a release.\n- **Submit Recipe…**, which opens a pre-filled GitHub issue with your YAML attached so it can be\n  folded into the shared registry.\n\nCustom recipes live in `~/Library/Application Support/OpenUpdater/Recipes/` and take effect\nimmediately — this is the easiest way to write and test a recipe before contributing it. New drafts\nstart disabled until you fill in the details and flip them on.\n\n### Write a recipe (pull request)\n\nA recipe is a small YAML file telling OpenUpdater how to find an app's latest version (and, ideally,\nwhere to download it). One file per app.\n\n1. **Name the file after the bundle identifier:** `OpenUpdater/Recipes/\u003cbundle-id\u003e.yml` — e.g.\n   `com.github.wez.wezterm.yml`. Find an app's bundle id with:\n   ```sh\n   osascript -e 'id of app \"WezTerm\"'\n   ```\n2. **Pick a source type** (`check.type`). Most apps fit one of:\n   - `github_releases` — the newest release of a GitHub repo (most common).\n   - `sparkle` — a Sparkle appcast feed. Only needed when an app sets its feed in code; apps with a\n     static `SUFeedURL` are detected automatically, no recipe.\n   - `html` / `xml` — pull a version out of a page with a regex.\n   - `json` / `yaml` — read a version from an API or feed by key path.\n3. **Add a `download` block** so updates install in one click — or omit it for a \"check-only\" recipe\n   that just detects new versions and links out.\n4. **Keep real recipes comment-free.** The documented template is the single source of field docs:\n   [`docs/recipe-template.yml`](docs/recipe-template.yml).\n\nA minimal GitHub example:\n\n```yaml\nid: com.github.wez.wezterm\nname: WezTerm\nhomepage: https://wezterm.org\n\ncheck:\n  type: github_releases\n  repo: wezterm/wezterm\n  tag_pattern: '^\\d'\n\ndownload:\n  url: https://github.com/wezterm/wezterm/releases/download/{tag}/WezTerm-macos-{tag}.zip\n  format: zip\n\nchangelog:\n  url: https://github.com/wezterm/wezterm/releases/tag/{tag}\n```\n\nURL placeholders: `{tag}`, `{version}`, `{major}` / `{minor}` / `{patch}`, and `{arch}`. The\ntemplate documents every field, the arch mapping, version normalization, and tag filtering\n(`tag_pattern` / `tag_ignore` for skipping rolling tags like `nightly`).\n\nTo offer multiple **release channels** (ESR/LTS/Still, etc.), add a `channels` list — each channel's\n`check`/`download` overlay the base, and the user picks one per app. For sources that move over\ntime, a channel can derive part of its URL with `resolve` (look a value up from another page) and\n`select: latest` (take the highest of several matches) instead of hardcoding it. See the template\nfor both.\n\n### Bugs and ideas\n\nUse the\n**[bug report](https://github.com/chenasraf/OpenUpdater/issues/new?template=bug_report.yml)** or\n**[feature request](https://github.com/chenasraf/OpenUpdater/issues/new?template=feature_request.yml)**\ntemplates.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchenasraf%2Fopenupdater","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fchenasraf%2Fopenupdater","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fchenasraf%2Fopenupdater/lists"}