{"id":18002553,"url":"https://github.com/dvcrn/unisync","last_synced_at":"2025-06-10T22:38:37.483Z","repository":{"id":64298954,"uuid":"562360237","full_name":"dvcrn/unisync","owner":"dvcrn","description":"Sync app settings, configs and plists - powered by unison","archived":false,"fork":false,"pushed_at":"2023-10-12T14:12:53.000Z","size":167,"stargazers_count":8,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-03-21T12:21:29.783Z","etag":null,"topics":["macos"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/dvcrn.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}},"created_at":"2022-11-06T04:57:34.000Z","updated_at":"2025-01-09T14:12:38.000Z","dependencies_parsed_at":"2024-06-20T01:43:26.931Z","dependency_job_id":"b9cb7b2f-5451-46ab-baec-5df061a6e3a4","html_url":"https://github.com/dvcrn/unisync","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dvcrn%2Funisync","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dvcrn%2Funisync/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dvcrn%2Funisync/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/dvcrn%2Funisync/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/dvcrn","download_url":"https://codeload.github.com/dvcrn/unisync/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245618734,"owners_count":20645056,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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":["macos"],"created_at":"2024-10-29T23:22:35.765Z","updated_at":"2025-03-26T08:31:15.604Z","avatar_url":"https://github.com/dvcrn.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# unisync\n\nMackup inspired tool to sync application settings, powered by unison\n\n\u003c!-- TOC --\u003e\n* [unisync](#unisync)\n  * [What it is](#what-it-is)\n  * [How is this different from mackup?](#how-is-this-different-from-mackup)\n    * [Why?](#why)\n  * [Install](#install)\n  * [Usage](#usage)\n  * [Have unisync run automatically in the background](#have-unisync-run-automatically-in-the-background)\n  * [How to add support for new apps?](#how-to-add-support-for-new-apps)\n  * [How to re-generate config files from mackup?](#how-to-re-generate-config-files-from-mackup)\n  * [Troubleshooting \u0026 Caveats](#troubleshooting--caveats)\n  * [Credits](#credits)\n\u003c!-- TOC --\u003e\n\n## What it is\n\nunisync helps you keep your application settings (plists, config folders, licenses) synchronized across machines. It does this by using `unison` to diff files, then copies them into a synced folder of your choice\n\n## How is this different from mackup?\n\nunisync does not use symlinks like [mackup](https://github.com/lra/mackup). So instead of symlinking things into Dropbox/iCloud, unisync uses `unison` for diffing and copies the actual files.\n\n**Hint**: `unisync` actually embeds the entire mackup app library (with exception of `xdg_configuration_files` for now), so any app that works with mackup should also work with unisync.\n\n### Why?\n\nI like unison and ran into issues where symlinks randomly broke without me noticing it. I wanted the file content to be identical no matter where it is, including the actual application settings folder.\n\nThe sync folder in the cloud acts as a backup and source for diffing, but the apps would continue to work as is if those were deleted.\n\n## Install\n\nInstall `unison` and make sure it's in your path. On mac you can do:\n\n```\nbrew install unison\n```\n\nThen\n\n```\ngo install github.com/dvcrn/unisync@latest\n```\n\nCreate a config file in ~/.config/unisync/unisync.yaml:\n\n```yaml\ntargetPath: ~/.config/appconfigsync\npreferDirection: target\napps:\n  - dash\n  - raycast\n```\n\n- `preferDirection` specifies which direction should get picked on conflict. Set it to `target` to have the targetPath take precedence (aka, your dropbox folder). Set it to `local` to say that your local apps should take prededence and override the sync store. Defaults to `target`\n\n## Usage\n\n```\nCommands:\n  sync - run sync between all enabled apps\n  init-from-target - run/force initial sync, targetPath -\u003e appPath\n  init-from-local - run/force initial sync, local -\u003e targetPath\n  list - list available apps\n  info \u003cappname\u003e - show details of an app\n\nLaunchAgent management\n  install-agent - installs LaunchAgent to automatically run in the background\n  remove-agent - unload and remove agent\n\n```\n\nThe initial sync options **force** one way. For example if you want your local configuration to be overwritten on initial sync with whatever you have in your storage folder, run `init-from-target`\n\n## Have unisync run automatically in the background\n\n`unisync` comes with a LaunchAgent you can install, that will run `unisync` every 10 minutes:\n\n```\nunisync install-agent\n```\n\nThis will add and load a new LaunchAgent config into `Library/LaunchAgents/sh.d.unisync.plist` \n\n## How to add support for new apps?\n\nCheck out `apps/` in this repository. Apps are simple yaml files that explain what has to be copied:\n\n```yaml\nname: Raycast\nfriendlyName: raycast\nfiles:\n  - basePath: ~/Library/Preferences/\n    includedFiles:\n      - com.raycast.macos.plist\n    ignoredFiles:\n      - Name somethingToIgnore.plist\n```\n\n- `basePath` is the path that contains the files to sync. It can be `~/Library/Preferences/` when the file in question is just a preferences file, but also something like `~/Library/Application Support/Dash`\n- `includedFiles` are all files **within** basePath to process\n- `ignoredFiles` is the opposite of `includedFiles` - stuff you don't want to get processed. Has to be Name, Path, BelowPath or Regex\n\n## How to re-generate config files from mackup?\n\nThere is a handy make command that you can use, that'll update the git submodule, then run helper script\n\n```bash\nmake apps/mackup\n```\n\n## Troubleshooting \u0026 Caveats\n\n- Apps that are currently running will override the config files usually when they're quit\n- Mackup apps haven't been thorougly tested yet. Stuff could not working as intended\n\n## Credits\n\nA huge chunk of the apps is generated off the [mackup app library](https://github.com/lra/mackup/tree/master/mackup/applications), which in turn is thanks to a huge number of contributors. Thanks to all of you!\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdvcrn%2Funisync","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdvcrn%2Funisync","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdvcrn%2Funisync/lists"}