Showing preview only (457K chars total). Download the full file or copy to clipboard to get everything.
Repository: lra/mackup
Branch: master
Commit: 25961212bbcd
Files: 673
Total size: 333.2 KB
Directory structure:
gitextract_y1tjtpic/
├── .github/
│ ├── CONTRIBUTING.md
│ ├── PULL_REQUEST_TEMPLATE.md
│ └── workflows/
│ ├── install.yaml
│ ├── linelint.yaml
│ ├── markdown.yaml
│ ├── mypy.yaml
│ ├── ruff.yaml
│ ├── snap.yaml
│ └── test.yaml
├── .gitignore
├── .linelint.yml
├── .markdownlint.yaml
├── .markdownlintignore
├── INSTALL.md
├── LICENSE
├── Makefile
├── README.md
├── doc/
│ ├── .mackup/
│ │ ├── gnupg.cfg
│ │ ├── mackup.cfg
│ │ ├── my-own-files.cfg
│ │ └── ssh.cfg
│ ├── .mackup.cfg
│ ├── ARCHITECTURE.md
│ ├── README.md
│ ├── configuration_merge_guide.md
│ ├── develop.md
│ ├── release.md
│ └── syncing-private-keys.md
├── pyproject.toml
├── snap/
│ └── snapcraft.yaml
├── src/
│ └── mackup/
│ ├── __init__.py
│ ├── application.py
│ ├── applications/
│ │ ├── 1password-4.cfg
│ │ ├── 2do.cfg
│ │ ├── ack.cfg
│ │ ├── act.cfg
│ │ ├── activitywatch.cfg
│ │ ├── adium.cfg
│ │ ├── adobe-camera-raw.cfg
│ │ ├── aerc.cfg
│ │ ├── aerospace.cfg
│ │ ├── affinity-designer.cfg
│ │ ├── affinity-photo.cfg
│ │ ├── affinity-publisher.cfg
│ │ ├── airflow.cfg
│ │ ├── airmail.cfg
│ │ ├── akamai-cli.cfg
│ │ ├── alacritty.cfg
│ │ ├── aldente.cfg
│ │ ├── alt-tab.cfg
│ │ ├── amethyst.cfg
│ │ ├── ancient-domains-of-mystery.cfg
│ │ ├── androidstudio-13.cfg
│ │ ├── ansible.cfg
│ │ ├── appcleaner.cfg
│ │ ├── appcode-2.cfg
│ │ ├── appcode-3.cfg
│ │ ├── appcode-31.cfg
│ │ ├── appcode-32.cfg
│ │ ├── apple-music.cfg
│ │ ├── apptivate.cfg
│ │ ├── arara.cfg
│ │ ├── aria2c.cfg
│ │ ├── arm.cfg
│ │ ├── asciinema.cfg
│ │ ├── asdf.cfg
│ │ ├── aspell.cfg
│ │ ├── astyle.cfg
│ │ ├── atlantis.cfg
│ │ ├── atom.cfg
│ │ ├── audacious.cfg
│ │ ├── auskey.cfg
│ │ ├── autokey.cfg
│ │ ├── awareness.cfg
│ │ ├── aws.cfg
│ │ ├── azure.cfg
│ │ ├── b-ryan_powerline-shell.cfg
│ │ ├── bartender.cfg
│ │ ├── base.cfg
│ │ ├── bash-it.cfg
│ │ ├── bash.cfg
│ │ ├── bat.cfg
│ │ ├── bc.cfg
│ │ ├── beatport-pro.cfg
│ │ ├── beets.cfg
│ │ ├── bettersnaptool.cfg
│ │ ├── bettertouchtool.cfg
│ │ ├── beyond-compare.cfg
│ │ ├── bibdesk.cfg
│ │ ├── billings-pro-server-admin.cfg
│ │ ├── bitbar.cfg
│ │ ├── bitchx.cfg
│ │ ├── blackfire.cfg
│ │ ├── blender.cfg
│ │ ├── blesh.cfg
│ │ ├── boto.cfg
│ │ ├── boxer.cfg
│ │ ├── brackets.cfg
│ │ ├── brave.cfg
│ │ ├── btop.cfg
│ │ ├── bump.cfg
│ │ ├── bundler.cfg
│ │ ├── byobu.cfg
│ │ ├── caffeine.cfg
│ │ ├── calibre.cfg
│ │ ├── capture-one.cfg
│ │ ├── cartographica.cfg
│ │ ├── cerebro.cfg
│ │ ├── charles.cfg
│ │ ├── cheat.cfg
│ │ ├── chef.cfg
│ │ ├── chicken.cfg
│ │ ├── choosy.cfg
│ │ ├── chunkwm.cfg
│ │ ├── cider.cfg
│ │ ├── clashx.cfg
│ │ ├── clasp.cfg
│ │ ├── claude-code.cfg
│ │ ├── cleanshot.cfg
│ │ ├── clementine.cfg
│ │ ├── clion.cfg
│ │ ├── clipmenu.cfg
│ │ ├── clipy.cfg
│ │ ├── cloudapp.cfg
│ │ ├── coda-2.cfg
│ │ ├── codex.cfg
│ │ ├── colloquy.cfg
│ │ ├── colorschemer-studio-2.cfg
│ │ ├── colorslurp.cfg
│ │ ├── colorsync.cfg
│ │ ├── composer.cfg
│ │ ├── concentrate.cfg
│ │ ├── conky.cfg
│ │ ├── consular.cfg
│ │ ├── contexts.cfg
│ │ ├── controlplane.cfg
│ │ ├── copyq.cfg
│ │ ├── cord.cfg
│ │ ├── coteditor.cfg
│ │ ├── ctags.cfg
│ │ ├── curl.cfg
│ │ ├── cursor.cfg
│ │ ├── cvim.cfg
│ │ ├── cyberduck.cfg
│ │ ├── daisydisk.cfg
│ │ ├── dash.cfg
│ │ ├── datagrip.cfg
│ │ ├── day-o.cfg
│ │ ├── dbeaver.cfg
│ │ ├── dbvisualizer.cfg
│ │ ├── deal-alert.cfg
│ │ ├── deepin-dde-dock.cfg
│ │ ├── deepin-dde-file-manager.cfg
│ │ ├── deepin-terminal.cfg
│ │ ├── default-folder-x.cfg
│ │ ├── defaultkeybinding.cfg
│ │ ├── devilspie.cfg
│ │ ├── devilspie2.cfg
│ │ ├── dig.cfg
│ │ ├── divvy.cfg
│ │ ├── docker.cfg
│ │ ├── dolphin.cfg
│ │ ├── doom-emacs.cfg
│ │ ├── doublecmd.cfg
│ │ ├── doxie.cfg
│ │ ├── dozer.cfg
│ │ ├── draft.cfg
│ │ ├── droplr.cfg
│ │ ├── dropzone.cfg
│ │ ├── drush.cfg
│ │ ├── editorconfig.cfg
│ │ ├── electrum.cfg
│ │ ├── emacs.cfg
│ │ ├── enjoyable.cfg
│ │ ├── environmental-station-alpha.cfg
│ │ ├── eqmac-2.cfg
│ │ ├── eslint.cfg
│ │ ├── espanso.cfg
│ │ ├── exercism.cfg
│ │ ├── expandrive.cfg
│ │ ├── factorio.cfg
│ │ ├── factory-droid.cfg
│ │ ├── fantastical.cfg
│ │ ├── fasd.cfg
│ │ ├── fastlane.cfg
│ │ ├── fastscripts.cfg
│ │ ├── feeds.cfg
│ │ ├── filezilla.cfg
│ │ ├── finicky.cfg
│ │ ├── fish.cfg
│ │ ├── fisher.cfg
│ │ ├── flake8.cfg
│ │ ├── flameshot.cfg
│ │ ├── flexget.cfg
│ │ ├── flux.cfg
│ │ ├── focus.cfg
│ │ ├── fontconfig.cfg
│ │ ├── fontexplorer-x.cfg
│ │ ├── forge.cfg
│ │ ├── fork.cfg
│ │ ├── forklift.cfg
│ │ ├── franz.cfg
│ │ ├── gasmask.cfg
│ │ ├── gdb.cfg
│ │ ├── gearplayer.cfg
│ │ ├── geektool.cfg
│ │ ├── ghci.cfg
│ │ ├── ghidra.cfg
│ │ ├── ghostty.cfg
│ │ ├── ghostwriter.cfg
│ │ ├── gimp.cfg
│ │ ├── git-hooks.cfg
│ │ ├── git.cfg
│ │ ├── gitbox.cfg
│ │ ├── gitfox.cfg
│ │ ├── github-cli.cfg
│ │ ├── gitkraken.cfg
│ │ ├── gitup.cfg
│ │ ├── gmail-notifr.cfg
│ │ ├── gmailctl.cfg
│ │ ├── gmvault.cfg
│ │ ├── gnu-stow.cfg
│ │ ├── gnupg.cfg
│ │ ├── go2shell.cfg
│ │ ├── goku.cfg
│ │ ├── goland.cfg
│ │ ├── goldendict.cfg
│ │ ├── goodsync.cfg
│ │ ├── goshare.cfg
│ │ ├── gradle.cfg
│ │ ├── grandtotal-3.cfg
│ │ ├── grsync.cfg
│ │ ├── gstm.cfg
│ │ ├── hammerspoon.cfg
│ │ ├── handbrake.cfg
│ │ ├── hands-off.cfg
│ │ ├── hazel.cfg
│ │ ├── hero-lab.cfg
│ │ ├── heroku.cfg
│ │ ├── hexchat.cfg
│ │ ├── hexels.cfg
│ │ ├── hocus-focus.cfg
│ │ ├── homebrew.cfg
│ │ ├── homebridge.cfg
│ │ ├── houdini.cfg
│ │ ├── hstr.cfg
│ │ ├── htop.cfg
│ │ ├── httpie.cfg
│ │ ├── hub.cfg
│ │ ├── hyper.cfg
│ │ ├── hyperdock.cfg
│ │ ├── hyperswitch.cfg
│ │ ├── i2cssh.cfg
│ │ ├── i3.cfg
│ │ ├── idapro.cfg
│ │ ├── ideavim.cfg
│ │ ├── iina.cfg
│ │ ├── illustrator.cfg
│ │ ├── inkscape.cfg
│ │ ├── insomnia.cfg
│ │ ├── intellijidea.cfg
│ │ ├── ipython.cfg
│ │ ├── irssi.cfg
│ │ ├── istat-menus.cfg
│ │ ├── iterm2.cfg
│ │ ├── itermocil.cfg
│ │ ├── itsycal.cfg
│ │ ├── itunes-scripts.cfg
│ │ ├── jankyborders.cfg
│ │ ├── janus.cfg
│ │ ├── jitouch.cfg
│ │ ├── joplin.cfg
│ │ ├── jrnl.cfg
│ │ ├── jsbeautifier.cfg
│ │ ├── jshint.cfg
│ │ ├── julia.cfg
│ │ ├── jumpcut.cfg
│ │ ├── jupyter.cfg
│ │ ├── k9s.cfg
│ │ ├── kaggle.cfg
│ │ ├── kaleidoscope.cfg
│ │ ├── karabiner-elements.cfg
│ │ ├── karabiner.cfg
│ │ ├── kdenlive.cfg
│ │ ├── keepassx.cfg
│ │ ├── keepassxc.cfg
│ │ ├── keepingyouawake.cfg
│ │ ├── keka.cfg
│ │ ├── keybase.cfg
│ │ ├── keyboard-maestro.cfg
│ │ ├── keymo.cfg
│ │ ├── keyremap4macbook.cfg
│ │ ├── khd.cfg
│ │ ├── kiro.cfg
│ │ ├── kitty.cfg
│ │ ├── krew.cfg
│ │ ├── kubectl.cfg
│ │ ├── kwm.cfg
│ │ ├── latexit.cfg
│ │ ├── launchbar.cfg
│ │ ├── lazydocker.cfg
│ │ ├── lazygit.cfg
│ │ ├── ledger.cfg
│ │ ├── leiningen.cfg
│ │ ├── lf.cfg
│ │ ├── libreoffice.cfg
│ │ ├── liftoff.cfg
│ │ ├── light-table.cfg
│ │ ├── lightpaper.cfg
│ │ ├── lightroom-classic.cfg
│ │ ├── lightroom.cfg
│ │ ├── limechat.cfg
│ │ ├── liquidprompt.cfg
│ │ ├── littlesnitch.cfg
│ │ ├── livestreamer.cfg
│ │ ├── logitech-options.cfg
│ │ ├── logseq.cfg
│ │ ├── lollypop.cfg
│ │ ├── loopback.cfg
│ │ ├── luftrausers.cfg
│ │ ├── lunarvim.cfg
│ │ ├── macdive2.cfg
│ │ ├── macdown.cfg
│ │ ├── mackup.cfg
│ │ ├── macosx.cfg
│ │ ├── macvim.cfg
│ │ ├── magic-launch.cfg
│ │ ├── magicprefs.cfg
│ │ ├── magnet.cfg
│ │ ├── maid.cfg
│ │ ├── mail.cfg
│ │ ├── mailmate.cfg
│ │ ├── mailplane.cfg
│ │ ├── mako.cfg
│ │ ├── marked2.cfg
│ │ ├── marta.cfg
│ │ ├── matlab.cfg
│ │ ├── maven.cfg
│ │ ├── max.cfg
│ │ ├── mendeley.cfg
│ │ ├── menumeters.cfg
│ │ ├── mercurial.cfg
│ │ ├── mercurymover.cfg
│ │ ├── messages.cfg
│ │ ├── micro.cfg
│ │ ├── microsoft-remote-desktop.cfg
│ │ ├── mise.cfg
│ │ ├── mitmproxy.cfg
│ │ ├── mkcert.cfg
│ │ ├── mole.cfg
│ │ ├── monodevelop.cfg
│ │ ├── moom.cfg
│ │ ├── mosaic.cfg
│ │ ├── mou.cfg
│ │ ├── mpd.cfg
│ │ ├── mplayerx.cfg
│ │ ├── mps-youtube.cfg
│ │ ├── mpv.cfg
│ │ ├── mtmr.cfg
│ │ ├── multitouch.cfg
│ │ ├── mumu.cfg
│ │ ├── musicbrainz-picard.cfg
│ │ ├── mutespotifyads.cfg
│ │ ├── mycli.cfg
│ │ ├── myrepos.cfg
│ │ ├── mysql.cfg
│ │ ├── mysqlworkbench.cfg
│ │ ├── name-mangler.cfg
│ │ ├── nano.cfg
│ │ ├── navicat.cfg
│ │ ├── ncmpcpp.cfg
│ │ ├── neofetch.cfg
│ │ ├── neovim.cfg
│ │ ├── nethack.cfg
│ │ ├── netlify.cfg
│ │ ├── newsbeuter.cfg
│ │ ├── ngrok.cfg
│ │ ├── ni.cfg
│ │ ├── nomacs.cfg
│ │ ├── nosqlbooster-for-mongodb.cfg
│ │ ├── notion-enhancer.cfg
│ │ ├── nova.cfg
│ │ ├── npm.cfg
│ │ ├── npmrc.cfg
│ │ ├── nslogger.cfg
│ │ ├── nuget.cfg
│ │ ├── nushell.cfg
│ │ ├── nvalt.cfg
│ │ ├── nvm.cfg
│ │ ├── nvpy.cfg
│ │ ├── obs.cfg
│ │ ├── oci.cfg
│ │ ├── offlineimap.cfg
│ │ ├── ogdesign-eagle.cfg
│ │ ├── oh-my-fish.cfg
│ │ ├── oh-my-tmux.cfg
│ │ ├── omnifocus.cfg
│ │ ├── omnigraffle.cfg
│ │ ├── openbox.cfg
│ │ ├── opencode.cfg
│ │ ├── openemu.cfg
│ │ ├── opera.cfg
│ │ ├── p10k.cfg
│ │ ├── paintbrush.cfg
│ │ ├── pandoc.cfg
│ │ ├── pass.cfg
│ │ ├── pastebot.cfg
│ │ ├── path-finder.cfg
│ │ ├── pdfjam.cfg
│ │ ├── pear.cfg
│ │ ├── pentadactyl.cfg
│ │ ├── perl.cfg
│ │ ├── pgsql.cfg
│ │ ├── phoenix.cfg
│ │ ├── phoneview.cfg
│ │ ├── photoshop.cfg
│ │ ├── phpstorm.cfg
│ │ ├── picgo.cfg
│ │ ├── pidgin.cfg
│ │ ├── pip.cfg
│ │ ├── pixelsnap.cfg
│ │ ├── pixelsnap2.cfg
│ │ ├── planner.cfg
│ │ ├── plover.cfg
│ │ ├── pnpm.cfg
│ │ ├── pock.cfg
│ │ ├── podman.cfg
│ │ ├── poedit.cfg
│ │ ├── poetry.cfg
│ │ ├── pokerstars.cfg
│ │ ├── polybar.cfg
│ │ ├── popclip.cfg
│ │ ├── popcorn-time.cfg
│ │ ├── postico.cfg
│ │ ├── pow.cfg
│ │ ├── powerline.cfg
│ │ ├── prezto.cfg
│ │ ├── processing.cfg
│ │ ├── proselint.cfg
│ │ ├── proxychains.cfg
│ │ ├── proxyman.cfg
│ │ ├── prusa-slicer.cfg
│ │ ├── psysh.cfg
│ │ ├── punto-switcher.cfg
│ │ ├── pycharm.cfg
│ │ ├── pypi.cfg
│ │ ├── pyradio.cfg
│ │ ├── querious.cfg
│ │ ├── quicklook.cfg
│ │ ├── quicksilver.cfg
│ │ ├── quitter.cfg
│ │ ├── qutebrowser.cfg
│ │ ├── qv2ray.cfg
│ │ ├── r.cfg
│ │ ├── rails.cfg
│ │ ├── ranger.cfg
│ │ ├── rbenv.cfg
│ │ ├── rclone.cfg
│ │ ├── rectangle.cfg
│ │ ├── redshift-scheduler.cfg
│ │ ├── redshift.cfg
│ │ ├── remote-desktop-manager.cfg
│ │ ├── rhythmbox.cfg
│ │ ├── rime.cfg
│ │ ├── ripgrep.cfg
│ │ ├── robo3t.cfg
│ │ ├── rocket.cfg
│ │ ├── rofi.cfg
│ │ ├── royaltsx.cfg
│ │ ├── rstudio.cfg
│ │ ├── rtorrent.cfg
│ │ ├── rtx.cfg
│ │ ├── rubitrack5.cfg
│ │ ├── rubocop.cfg
│ │ ├── ruby-version.cfg
│ │ ├── ruby.cfg
│ │ ├── rubymine.cfg
│ │ ├── rust.cfg
│ │ ├── rustrover.cfg
│ │ ├── rvm.cfg
│ │ ├── s3cmd.cfg
│ │ ├── sabnzbd.cfg
│ │ ├── sbcl.cfg
│ │ ├── sbt.cfg
│ │ ├── scenario.cfg
│ │ ├── screen.cfg
│ │ ├── screenhero.cfg
│ │ ├── scrivener.cfg
│ │ ├── scroll-reverser.cfg
│ │ ├── secure-pipes.cfg
│ │ ├── securecrt.cfg
│ │ ├── seil.cfg
│ │ ├── selfcontrol.cfg
│ │ ├── sequel-pro.cfg
│ │ ├── shadowsocksx-ng.cfg
│ │ ├── shiftit.cfg
│ │ ├── shifty.cfg
│ │ ├── shimo.cfg
│ │ ├── showyedge.cfg
│ │ ├── shsh-blobs.cfg
│ │ ├── shuttle.cfg
│ │ ├── sizeup.cfg
│ │ ├── sizzy.cfg
│ │ ├── sketchybar.cfg
│ │ ├── skhd.cfg
│ │ ├── skim.cfg
│ │ ├── skitch.cfg
│ │ ├── slate.cfg
│ │ ├── slic3r.cfg
│ │ ├── slogger.cfg
│ │ ├── smartgit.cfg
│ │ ├── smooth-mouse.cfg
│ │ ├── soulver.cfg
│ │ ├── sourcetree.cfg
│ │ ├── spacelauncher.cfg
│ │ ├── spacemacs.cfg
│ │ ├── spacevim.cfg
│ │ ├── spamsieve.cfg
│ │ ├── spark.cfg
│ │ ├── spectacle.cfg
│ │ ├── spectrwm.cfg
│ │ ├── splice.cfg
│ │ ├── spotify-notifications.cfg
│ │ ├── spotify.cfg
│ │ ├── sqitch.cfg
│ │ ├── ssh.cfg
│ │ ├── starship.cfg
│ │ ├── startupizer2.cfg
│ │ ├── stata.cfg
│ │ ├── stats.cfg
│ │ ├── stay.cfg
│ │ ├── storyist-3.cfg
│ │ ├── streamdeck.cfg
│ │ ├── subler.cfg
│ │ ├── sublime-merge.cfg
│ │ ├── sublime-text-2.cfg
│ │ ├── sublime-text-3.cfg
│ │ ├── sublime-text.cfg
│ │ ├── subversion.cfg
│ │ ├── superduper.cfg
│ │ ├── surge.cfg
│ │ ├── swaywm.cfg
│ │ ├── swinsian.cfg
│ │ ├── swish.cfg
│ │ ├── switchhosts.cfg
│ │ ├── t.cfg
│ │ ├── tableplus.cfg
│ │ ├── taskpaper.cfg
│ │ ├── taskwarrior.cfg
│ │ ├── teamocil.cfg
│ │ ├── telegram_macos.cfg
│ │ ├── terminal.cfg
│ │ ├── terminator.cfg
│ │ ├── termite.cfg
│ │ ├── termux.cfg
│ │ ├── terraform.cfg
│ │ ├── textexpander.cfg
│ │ ├── textmate.cfg
│ │ ├── textual.cfg
│ │ ├── things.cfg
│ │ ├── tidy.cfg
│ │ ├── tig.cfg
│ │ ├── tiles.cfg
│ │ ├── tilix.cfg
│ │ ├── timeout.cfg
│ │ ├── tint2.cfg
│ │ ├── tinyfugue.cfg
│ │ ├── tmux.cfg
│ │ ├── tmuxinator.cfg
│ │ ├── tmuxp.cfg
│ │ ├── todotxt-cli.cfg
│ │ ├── toothfairy.cfg
│ │ ├── totalspaces2.cfg
│ │ ├── tower-2.cfg
│ │ ├── tower-3.cfg
│ │ ├── tower.cfg
│ │ ├── transmission.cfg
│ │ ├── transmit.cfg
│ │ ├── tripmode.cfg
│ │ ├── trizen.cfg
│ │ ├── tunnelblick.cfg
│ │ ├── tvnamer.cfg
│ │ ├── twitterrific.cfg
│ │ ├── typinator.cfg
│ │ ├── typora.cfg
│ │ ├── ubersicht.cfg
│ │ ├── ulauncher.cfg
│ │ ├── ventrilo.cfg
│ │ ├── verdaccio.cfg
│ │ ├── versions.cfg
│ │ ├── vim.cfg
│ │ ├── vimperator.cfg
│ │ ├── vimwiki.cfg
│ │ ├── viscosity.cfg
│ │ ├── vlc.cfg
│ │ ├── volt.cfg
│ │ ├── vs4mac.cfg
│ │ ├── vscode-insiders.cfg
│ │ ├── vscode-oss.cfg
│ │ ├── vscode.cfg
│ │ ├── vscodium.cfg
│ │ ├── wakatime.cfg
│ │ ├── warp.cfg
│ │ ├── waybar.cfg
│ │ ├── webstorm.cfg
│ │ ├── wezterm.cfg
│ │ ├── wget.cfg
│ │ ├── whatsapp.cfg
│ │ ├── windsurf.cfg
│ │ ├── wireshark.cfg
│ │ ├── witch.cfg
│ │ ├── wordgrinder.cfg
│ │ ├── workrave.cfg
│ │ ├── wp-cli.cfg
│ │ ├── x11.cfg
│ │ ├── xamarinstudio-5.cfg
│ │ ├── xbar.cfg
│ │ ├── xbindkeys.cfg
│ │ ├── xchat.cfg
│ │ ├── xcode.cfg
│ │ ├── xee.cfg
│ │ ├── xemacs.cfg
│ │ ├── xld.cfg
│ │ ├── xonsh.cfg
│ │ ├── xtrafinder.cfg
│ │ ├── yabai.cfg
│ │ ├── yarn.cfg
│ │ ├── yazi.cfg
│ │ ├── youtube-dl.cfg
│ │ ├── yummyftp.cfg
│ │ ├── zabbix-cli.cfg
│ │ ├── zathura.cfg
│ │ ├── zed.cfg
│ │ ├── zoom.cfg
│ │ ├── zoxide.cfg
│ │ └── zsh.cfg
│ ├── appsdb.py
│ ├── config.py
│ ├── constants.py
│ ├── mackup.py
│ ├── main.py
│ └── utils.py
└── tests/
├── README.md
├── __init__.py
├── fixtures/
│ ├── .mackup/
│ │ ├── legacy-test-app.cfg
│ │ └── priority-test-app.cfg
│ ├── Library/
│ │ ├── Application Support/
│ │ │ └── Box/
│ │ │ └── Box Sync/
│ │ │ └── sync_root_folder.txt
│ │ └── Mobile Documents/
│ │ └── com~apple~CloudDocs/
│ │ └── _blank_.md
│ ├── mackup-apps_to_ignore.cfg
│ ├── mackup-apps_to_ignore_and_sync.cfg
│ ├── mackup-apps_to_sync.cfg
│ ├── mackup-empty.cfg
│ ├── mackup-engine-dropbox.cfg
│ ├── mackup-engine-file_system-absolute.cfg
│ ├── mackup-engine-file_system-no_path.cfg
│ ├── mackup-engine-file_system.cfg
│ ├── mackup-engine-google_drive.cfg
│ ├── mackup-engine-icloud.cfg
│ ├── mackup-engine-unknown.cfg
│ ├── mackup-envarcheck.cfg
│ ├── mackup-old-config.cfg
│ └── xdg-config-home/
│ └── mackup/
│ ├── applications/
│ │ ├── priority-test-app.cfg
│ │ └── xdg-test-app.cfg
│ └── mackup.cfg
├── test_application.py
├── test_appsdb_xdg.py
├── test_backup_after_link_install.py
├── test_cli.py
├── test_config.py
├── test_config_file_option.py
├── test_constants.py
├── test_main.py
└── test_utils.py
================================================
FILE CONTENTS
================================================
================================================
FILE: .github/CONTRIBUTING.md
================================================
# How to contribute
You can:
- Add or improve the support of an application (Check the [TODO][TODO] and
[TOFIX][TOFIX] tasks and pick one)
- Improve the Mackup codebase
- You can triage issues which may include reproducing bug reports or asking for
vital information, such as version numbers or reproduction instructions. If
you would like to start triaging issues, one easy way to get started is to
[subscribe to mackup on CodeTriage](https://www.codetriage.com/lra/mackup).
[![Open Source Helpers][CODETRIAGE-IMG]][CODETRIAGE]
## Development Setup
Mackup uses [uv](https://docs.astral.sh/uv/) for fast, reliable Python package management. Here's how to get started:
### Prerequisites
- Python 3.9 or higher
- [uv](https://docs.astral.sh/uv/) installed
Install uv if you haven't already:
```bash
# On macOS
brew install uv
# On Linux
# Via pipx (recommended)
pipx install uv
# Or via Homebrew on Linux
brew install uv
# On Windows
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"
```
Alternatively, see the [official uv installation guide](https://docs.astral.sh/uv/getting-started/installation/) for more options.
### Setting Up Your Development Environment
1. Clone the repository:
```bash
git clone https://github.com/lra/mackup.git
cd mackup
```
2. Sync dependencies (creates a virtual environment automatically):
```bash
uv sync --dev
```
This will:
- Create a `.venv` directory with a virtual environment
- Install all project dependencies
- Install development dependencies (pytest, mypy, etc.)
### Running Tests and Checks
Use the provided Make targets for quick development workflow:
```bash
# Run all checks (recommended before committing)
make check
# Run tests only
make test
# Run type checking
make mypy
# Run code linting
make ruff
```
Or use `uv run` directly:
```bash
# Run tests
uv run pytest
# Run tests with verbose output
uv run pytest -v
# Run type checking
uv run mypy mackup/
# Run linting
ruff check .
```
### Code Quality Standards
All pull requests must pass:
- ✅ **Tests**: All pytest tests must pass
- ✅ **Type checking**: No mypy errors
- ✅ **Linting**: Code must pass ruff checks
- ✅ **Formatting**: Follow existing code style
Run `make check` before submitting your PR to ensure everything passes.
## Contributing Guidelines
To speed up Pull Request (PR) approval and merger into Mackup, please follow
these guidelines:
- Keep one application supported per PR
- Add the application to the list of supported applications in
[README.md][README.md]
- Sync configurations should follow the following principles:
- Syncing should not break the application, and PRs should be tested
- Syncing should not break any syncing functionality internal to the
application
- The configuration should sync the minimal set of data, so that syncing
happens quickly. Leave large app data out of the sync configuration.
- Do not sync any file or folder that represents some state, like session
data, cache, any file specific to the local workstation.
- Do not sync sensitive information, like clear passwords or private keys
Thank you for your contribution!
[TODO]: https://github.com/lra/mackup/labels/TODO
[TOFIX]: https://github.com/lra/mackup/labels/TOFIX
[CODETRIAGE]: https://www.codetriage.com/lra/mackup
[CODETRIAGE-IMG]: https://www.codetriage.com/lra/mackup/badges/users.svg
[README.md]: https://github.com/lra/mackup/blob/master/README.md
================================================
FILE: .github/PULL_REQUEST_TEMPLATE.md
================================================
### All submissions
* [ ] I have followed the [Contributing Guidelines](https://github.com/lra/mackup/blob/master/.github/CONTRIBUTING.md)
* [ ] I have checked to ensure there aren't other open [Pull Requests](https://github.com/lra/mackup/pulls) for the same update/change
### Adding/updating Application X Support
* [ ] This PR is only for one application
* [ ] It has been added to the list of supported applications in the [README](https://github.com/lra/mackup/blob/master/README.md)
* [ ] The configuration syncs the minimal set of data
* [ ] No file specific to the local workstation is synced
* [ ] No sensitive data is synced
### Improving the Mackup codebase
* [ ] My submission passes the [tests](https://github.com/lra/mackup/tree/master/tests)
* [ ] I have linted the code locally prior to submission
* [ ] I have written new tests as applicable
* [ ] I have added an explanation of what the changes do
================================================
FILE: .github/workflows/install.yaml
================================================
name: install
on:
push:
branches:
- master
pull_request:
jobs:
install-on-linux:
strategy:
matrix:
os:
- ubuntu-22.04
- ubuntu-22.04-arm
- ubuntu-24.04
- ubuntu-24.04-arm
python-version:
- "3.9"
- "3.10"
- "3.11"
- "3.12"
- "3.13"
- "3.14"
runs-on: ${{ matrix.os }}
container: python:${{ matrix.python-version }}
steps:
- uses: actions/checkout@v6
- run: pip install .
- run: mackup --help
install-on-macos:
strategy:
matrix:
os:
- macos-14
- macos-15
- macos-15-intel
runs-on: ${{ matrix.os }}
steps:
- uses: actions/checkout@v6
- run: pip install .
- run: mackup --help
================================================
FILE: .github/workflows/linelint.yaml
================================================
# Make sure that all text files end with a newline character.
# Configure your editor to end every file with a newline character.
# See <https://stackoverflow.com/a/729795>
name: linelint
on:
push:
branches:
- master
pull_request:
jobs:
linelint:
runs-on: ubuntu-latest
name: linelint
steps:
- name: Checkout
uses: actions/checkout@v6
- name: Linelint
uses: fernandrone/linelint@master
================================================
FILE: .github/workflows/markdown.yaml
================================================
name: markdown
on:
push:
branches:
- master
pull_request:
jobs:
markdownlint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: articulate/actions-markdownlint@v1
with:
config: .markdownlint.yaml
ignore: 'tests/'
================================================
FILE: .github/workflows/mypy.yaml
================================================
name: mypy
on:
push:
branches:
- master
pull_request:
jobs:
mypy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: astral-sh/setup-uv@v5
with:
python-version: "3.9"
- run: uv sync --all-extras --dev
- run: uv run mypy src/mackup/
================================================
FILE: .github/workflows/ruff.yaml
================================================
name: ruff
on:
push:
branches:
- master
pull_request:
jobs:
ruff:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: astral-sh/setup-uv@v5
- run: uv sync --all-extras --dev
- run: uv run ruff check .
================================================
FILE: .github/workflows/snap.yaml
================================================
name: snap
on:
push:
branches:
- master
pull_request:
jobs:
build-and-publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v6
- uses: snapcore/action-build@v1
id: build
- uses: snapcore/action-publish@v1
if: github.ref == 'refs/heads/master'
env:
SNAPCRAFT_STORE_CREDENTIALS: ${{ secrets.SNAPCRAFT_STORE_CREDENTIALS }}
with:
snap: ${{ steps.build.outputs.snap }}
release: edge
================================================
FILE: .github/workflows/test.yaml
================================================
name: test
on:
push:
branches:
- master
pull_request:
jobs:
pytest:
runs-on: ubuntu-latest
strategy:
matrix:
python-version:
- "3.9"
- "3.10"
- "3.11"
- "3.12"
- "3.13"
- "3.14"
steps:
- uses: actions/checkout@v6
- uses: astral-sh/setup-uv@v5
with:
python-version: ${{ matrix.python-version }}
- run: uv sync --all-extras --dev
- run: uv run pytest --cov=mackup --cov-report=term
================================================
FILE: .gitignore
================================================
# Generated when running Mackup
*.pyc
# Generated by make release
/dist/
# Ignore Claude stuff
/.claude/
# Coverage reports
.coverage
.coverage.*
htmlcov/
coverage.xml
*.cover
.hypothesis/
.pytest_cache/
================================================
FILE: .linelint.yml
================================================
# 'true' will fix files
autofix: false
# list of paths to ignore, uses gitignore syntaxes (executes before any rule)
ignore:
- tests/fixtures/Library/Application Support/Box/Box Sync/sync_root_folder.txt
- tests/fixtures/Library/Mobile Documents/com~apple~CloudDocs/_blank_.md
rules:
# checks if file ends in a newline character
end-of-file:
# set to true to enable this rule
enable: true
# set to true to disable autofix (if enabled globally)
disable-autofix: true
# if true also checks if file ends in a single newline character
single-new-line: true
================================================
FILE: .markdownlint.yaml
================================================
MD004:
style: "dash"
================================================
FILE: .markdownlintignore
================================================
tests/
================================================
FILE: INSTALL.md
================================================
# Detailed install instructions for Mackup
There are 2 ways to run mackup:
1. Install it with Homebrew (macOS and GNU/Linux)
2. Install it with PIP (macOS and GNU/Linux)
## Install
### With Homebrew
```bash
# Easy
brew install mackup
# Now just run it
mackup -h
```
### With Homebrew master branch for latest updates
Want to install the latest master release instead of waiting on the homebrew
package version?
[Homebrew reference](https://docs.brew.sh/Manpage#install-options-formulacask)
```bash
# Install master
brew install --HEAD
# Check if you are using the master or stale package
brew switch mackup <HEAD-XXXX>
mackup -h
```
### With Python's PIP
```bash
# Easy too
pip install mackup
# Now you can run it
mackup -h
```
## Upgrade
### Upgrade with Homebrew
```bash
brew update
brew upgrade
mackup -h
```
### Upgrade with Python's PIP
```bash
pip install --upgrade mackup
mackup -h
```
## Uninstall
### Uninstall with Homebrew
```bash
brew uninstall mackup
```
### Uninstall with Python's PIP
```bash
pip uninstall mackup
```
================================================
FILE: LICENSE
================================================
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) 2013 Laurent Raufaste
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
Mackup Copyright (C) 2013 Laurent Raufaste
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.
================================================
FILE: Makefile
================================================
lint:
markdownlint -c .markdownlint.yaml '**/*.md'
ruff:
ruff check .
ty:
uv run ty check
test:
uv run pytest
coverage:
uv run pytest --cov=mackup --cov-report=term --cov-report=html --cov-report=xml
coverage-report:
uv run coverage report
mypy:
uv run mypy src/mackup/
check: lint ruff mypy ty test
@echo "All checks passed!"
clean:
rm -rf src/mackup/__pycache__
rm -rf tests/__pycache__
rm -rf dist/
rm -rf htmlcov/
rm -rf .coverage
rm -rf coverage.xml
release: clean
uv build
uv publish
================================================
FILE: README.md
================================================
# Mackup™
[](https://github.com/lra/mackup/actions/workflows/test.yaml)
[](https://badge.fury.io/py/mackup)
[](https://pypi.org/project/mackup/)
[](https://github.com/astral-sh/ruff)
[](http://mypy-lang.org/)
[](https://github.com/lra/mackup/blob/master/LICENSE)
Backup and keep your application settings in sync.
## Table of contents
- [Mackup™](#mackup)
- [Table of contents](#table-of-contents)
- [Quickstart](#quickstart)
- [Usage](#usage)
- [What does it do](#what-does-it-do)
- [Copy mode](#copy-mode)
- [Link mode](#link-mode)
- [`mackup link install`](#mackup-link-install)
- [`mackup link`](#mackup-link)
- [`mackup link uninstall`](#mackup-link-uninstall)
- [Supported Storages](#supported-storages)
- [Unsupported Storages](#unsupported-storages)
- [Supported Applications](#supported-applications)
- [Can you support application X](#can-you-support-application-x)
- [Personalization \& configuration](#personalization--configuration)
- [Why did you do this](#why-did-you-do-this)
- [What platforms are supported](#what-platforms-are-supported)
- [What's up with the weird name](#whats-up-with-the-weird-name)
- [Architecture](#architecture)
- [Where can I find more information](#where-can-i-find-more-information)
## Quickstart
On macOS or Linux, if you want an easy install, you can install
[Homebrew](http://brew.sh/) and do:
```bash
# Install Mackup
brew install mackup
# Launch it and back up your files
mackup backup
```
If not running macOS or Linux, or you don't like Homebrew, you can use [pip](https://pip.pypa.io/en/stable/).
```bash
# Install Mackup with PIP
pip install --upgrade mackup
# Launch it and back up your files
mackup backup
```
You're all set and can back up from now on.
Next, on any new workstation, do:
```bash
# Install Mackup
brew install mackup
# Launch it and restore your files
mackup restore
```
Done!
You can find more detailed instructions in [INSTALL.md](INSTALL.md).
## Usage
`mackup backup`
Back up your application files. Copy your local config files into the Mackup folder.
`mackup restore`
Restore your application settings on a newly installed workstation.
Copy config files from the Mackup folder to your home folder.
`mackup link install`
Move your local config files into the Mackup folder,
and link them to their original place.
$${\color{red}warning}$$ _the `link` strategy [doesn't work correctly on macOS](#link-mode)_
`mackup link`
On another workstation, links local config files from the Mackup folder.
`mackup link uninstall`
Copy back any synced config file to its original place.
Removes the links and copies config files from the Mackup folder back into your
home.
`mackup list`
Display the list of applications supported by Mackup.
`mackup -h`
Get some help, obviously...
## What does it do
By only tracking pure configuration files, it keeps the crap out of your
freshly new installed workstation (no cache, temporary and locally specific
files are transferred).
Mackup makes setting up the environment easy and simple.
There are 2 modes of operations: copy mode and link mode.
### Copy mode
Copy mode is used to back up and restore your files.
The files are backed up into the configured Mackup folder,
which can be in Dropbox, iCloud, or wherever you configure it.
It is covered by the 2 commands:
- `mackup backup`
- `mackup restore`
### Link mode
> [!WARNING]
> If you are using Mackup on a current version of macOS, link mode will BREAK
YOUR PREFERENCES. macOS Sonoma (macOS 14) and later don't support symlinked
preferences, see [issue #2035](https://github.com/lra/mackup/issues/2035) for
additional information. [PR #2085](<https://github.com/lra/mackup/pull/2085>)
added copy mode, which should be used instead.
Link mode is used to move your config files into the Mackup folder,
and link them back to their original place.
This mode is useful if you are using multiple workstations,
and want to keep your application settings in sync at all times.
- Backs up your application settings in a safe directory (e.g. Dropbox)
- Syncs your application settings among all your workstations
- Restores your configuration on any fresh install in one command line
Let's take `git` as an example. Your settings for `git` are saved in your home
folder, in the `.gitconfig` file.
It is covered by the 3 commands:
- `mackup link install`
- `mackup link`
- `mackup link uninstall`
#### `mackup link install`
If you have Dropbox, these things happen when you launch `mackup link install`:
1. `cp ~/.gitconfig ~/Dropbox/Mackup/.gitconfig`
2. `rm ~/.gitconfig`
3. `ln -s ~/Dropbox/Mackup/.gitconfig ~/.gitconfig`
Now your `git` config is always backed up and up to date on all your workstations.
#### `mackup link`
When you launch `mackup link`, here's what it's really doing:
1. `ln -s ~/Dropbox/Mackup/.gitconfig ~/.gitconfig`
That's it, you got your `git` config setup on your new workstation.
`mackup` does the same for any supported application.
#### `mackup link uninstall`
You can revert all your files to their original state.
```bash
# Just run this
mackup link uninstall
```
This will remove the symlinks and copy back the files from the Mackup folder in
Dropbox to their original places in your home. The Mackup folder and the files
in it stay put, so that any other computer also running Mackup is unaffected.
## Supported Storages
- [Dropbox](https://www.dropbox.com/)
- [Google Drive](https://drive.google.com/)
- [iCloud](http://www.apple.com/icloud/)
- Anything able to sync a folder (e.g. [Git](http://git-scm.com/))
See the [README](doc/README.md) file in the doc directory for more info.
## Unsupported Storages
- [Box](https://www.box.com): No longer supported as it ignores dotfiles, see
<https://github.com/lra/mackup/issues/807>.
## Supported Applications
- [1Password 4](https://agilebits.com/onepassword)
- [2Do](http://www.2doapp.com/)
- [Ack](http://beyondgrep.com/)
- [act](https://github.com/nektos/act)
- [Adium](https://adium.im/)
- [Adobe Camera Raw](http://www.adobe.com/products/photoshop/extend.html)
- [Adobe Illustrator CC](https://www.adobe.com/products/illustrator.html)
- [Adobe Photoshop CC](http://www.adobe.com/products/photoshop.html)
- [Adobe Photoshop Lightroom CC](https://www.adobe.com/products/photoshop-lightroom.html)
- [Adobe Photoshop Lightroom Classic](https://www.adobe.com/de/products/photoshop-lightroom-classic.html)
- [aerc](https://aerc-mail.org/)
- [AeroSpace](https://github.com/nikitabobko/AeroSpace)
- [Affinity Designer](https://affinity.serif.com/designer)
- [Affinity Photo](https://affinity.serif.com/photo)
- [Affinity Publisher](https://affinity.serif.com/publisher)
- [Airflow](https://airflowapp.com/)
- [Airmail](http://airmailapp.com/)
- [Akamai-CLI](https://developer.akamai.com/cli)
- [Alacritty](https://github.com/jwilm/alacritty)
- [AlDente](https://apphousekitchen.com/)
- [AltTab](https://alt-tab-macos.netlify.app/)
- [Amethyst](https://ianyh.com/amethyst/)
- [Ancient Domains of Mystery](http://www.adom.de/home/index.html)
- [Android Studio](https://developer.android.com/sdk/)
- [Ansible](http://www.ansible.com/)
- [AppCleaner](http://freemacsoft.net/appcleaner/)
- [AppCode](http://www.jetbrains.com/objc/)
- [Apple Music](https://www.apple.com/apple-music/)
- [Apptivate](http://www.apptivateapp.com/)
- [Arara](https://github.com/cereda/arara)
- [aria2c](http://aria2.sourceforge.net/)
- [Arm](https://www.atagar.com/arm/)
- [Artistic Style](http://astyle.sourceforge.net)
- [asciinema](https://asciinema.org/)
- [asdf version manager](https://github.com/asdf-vm/asdf)
- [Aspell](http://aspell.net/)
- [Atlantis](http://www.riverdark.net/atlantis/)
- [Atom](https://atom.io/)
- [Audacious](http://audacious-media-player.org/)
- [AusKey](https://abr.gov.au/AUSkey/)
- [Autokey](https://code.google.com/p/autokey/)
- [Awareness](http://iamfutureproof.com/tools/awareness/)
- [AWS Command Line Interface](https://aws.amazon.com/cli/)
- [ActivityWatch](http://activitywatch.net/)
- [Bartender](http://www.macbartender.com/)
- [Bash it](https://github.com/Bash-it/bash-it)
- [Bash](http://www.gnu.org/software/bash/)
- [Base](https://menial.co.uk/base/)
- [Bat](https://github.com/sharkdp/bat)
- [Bc](https://www.gnu.org/software/bc/)
- [Beatport Pro](https://www.beatport.com/desktop)
- [Beets](http://beets.io/)
- [BetterSnapTool](http://www.boastr.net/)
- [BetterTouchTool](http://www.boastr.net/)
- [Beyond Compare](https://scootersoftware.com/)
- [BibDesk](http://bibdesk.sourceforge.net/)
- [Billings Pro Server Admin](https://www.marketcircle.com/billingspro/download/billingspro-server/)
- [BitBar](https://getbitbar.com/)
- [Bitchx](http://www.bitchx.org/)
- [Blackfire](https://blackfire.io/)
- [Blender](https://blender.org/)
- [ble.sh](https://github.com/akinomyoga/ble.sh)
- [Boto](https://github.com/boto/boto)
- [Boxer](http://boxerapp.com)
- [Brackets](http://brackets.io/)
- [Brave](https://brave.com/)
- [Btop](https://github.com/aristocratos/btop)
- [Bump](https://github.com/fabiospampinato/bump)
- [Bundler](http://bundler.io)
- [Byobu](http://byobu.co/)
- [Caffeine](http://lightheadsw.com/caffeine/)
- [Calibre](https://calibre-ebook.com/)
- [Capture One](http://www.phaseone.com/Imaging-Software/Capture-One.aspx)
- [Cartographica](https://www.macgis.com/)
- [Cerebro](https://cerebroapp.com/)
- [Charles](http://www.charlesproxy.com)
- [Cheat](https://github.com/chrisallenlane/cheat)
- [Chef](https://www.chef.io/chef/)
- [Chicken](http://sourceforge.net/projects/chicken/)
- [Choosy](https://www.choosyosx.com/)
- [chunkwm](https://github.com/koekeishiya/chunkwm)
- [Cider](https://github.com/msanders/cider)
- [ClashX](https://github.com/yichengchen/clashX)
- [Clasp](https://github.com/google/clasp)
- [Claude Code](https://www.claude.com/product/claude-code)
- [CleanShot](https://cleanshot.com/)
- [Clementine](https://www.clementine-player.org/)
- [CLion](https://www.jetbrains.com/clion/)
- [ClipMenu](http://www.clipmenu.com/)
- [Clipy](https://clipy-app.com/)
- [CloudApp](http://getcloudapp.com/)
- [Coda 2](http://panic.com/coda/)
- [Codex](https://openai.com/codex/)
- [Colloquy](http://colloquy.info/)
- [ColorSchemer Studio 2](http://www.colorschemer.com/osx_info.php)
- [ColorSlurp](http://colorslurp.com/)
- [ColorSync](https://en.wikipedia.org/wiki/ColorSync)
- [Composer](https://getcomposer.org/)
- [Concentrate](http://www.getconcentrating.com/)
- [Conky](https://github.com/brndnmtthws/conky)
- [Consular](https://github.com/achiu/consular)
- [Contexts](https://contexts.co)
- [ControlPlane](http://www.controlplaneapp.com/)
- [CopyQ](https://github.com/hluk/CopyQ)
- [CoRD](http://cord.sourceforge.net/)
- [CotEditor](http://coteditor.com/)
- [Ctags](http://ctags.sourceforge.net/)
- [Cursor](https://cursor.sh/)
- [cVim](https://github.com/1995eaton/chromium-vim)
- [Cyberduck](https://cyberduck.io/)
- [DaisyDisk](https://daisydiskapp.com)
- [DataGrip](https://www.jetbrains.com/datagrip/)
- [Dash](https://kapeli.com/dash)
- [Day-O](http://www.shauninman.com/archive/2011/10/20/day_o_mac_menu_bar_clock)
- [DBeaver](https://dbeaver.io/)
- [DbVisualizer](https://www.dbvis.com/)
- [Deal Alert](http://dealalertapp.com/)
- [Deepin-dde-dock](https://github.com/linuxdeepin/dde-dock)
- [Deepin-dde-file-manager](https://www.deepin.org/en/original/dde-file-manager/)
- [Deepin-Terminal](https://github.com/linuxdeepin/deepin-terminal)
- [Default Folder X](http://www.stclairsoft.com/DefaultFolderX/)
- [Devil's Pie 2](http://www.gusnan.se/devilspie2/)
- [Devil's Pie](<https://en.wikipedia.org/wiki/Devil's_Pie_(software)>)
- [dig](<http://en.wikipedia.org/wiki/Dig_(command)>)
- [Divvy](http://mizage.com/divvy/)
- [Docker](https://www.docker.com/)
- [Dolphin](https://dolphin-emu.org/)
- [Doom Emacs](https://github.com/hlissner/doom-emacs)
- [Double Commander](http://doublecmd.sourceforge.net/)
- [Doxie](http://www.getdoxie.com/)
- [Dozer](https://github.com/Mortennn/Dozer)
- [Draft](https://draft.sh/)
- [Droplr](https://droplr.com/)
- [Dropzone 3](https://aptonic.com/dropzone3/)
- [Drush](http://www.drush.org/)
- [Eagle (ogdesign)](https://eagle.cool/)
- [EditorConfig](http://editorconfig.org/)
- [Electrum](https://electrum.org/#home)
- [Elgato StreamDeck](https://www.elgato.com/en/welcome-to-stream-deck)
- [Emacs](http://www.gnu.org/software/emacs/)
- [Enjoyable](https://yukkurigames.com/enjoyable/)
- [Environmental Station Alpha](http://www.hempuli.com/esa/)
- [eqMac2](https://bitgapp.com/eqmac/)
- [ESLint](https://eslint.org/)
- [espanso](https://espanso.org)
- [Exercism](http://exercism.io/)
- [ExpanDrive](http://www.expandrive.com/)
- [Factorio](https://www.factorio.com)
- [Factory Droid](https://factory.ai/)
- [Fantastical](http://flexibits.com/fantastical)
- [fasd](https://github.com/clvv/fasd)
- [fastlane](https://fastlane.tools)
- [FastScripts](https://redsweater.com/fastscripts/)
- [Feeds](http://www.feedsapp.com/)
- [FileZilla](https://filezilla-project.org/)
- [Finicky](https://github.com/johnste/finicky)
- [Fish](http://fishshell.com/)
- [Fisher](https://github.com/jorgebucaran/fisher)
- [Flake8](https://flake8.pycqa.org/)
- [Flameshot](https://flameshot.org)
- [FlexGet](http://flexget.com/)
- [Flux](https://justgetflux.com/)
- [Focus](https://heyfocus.com)
- [Fontconfig](https://www.freedesktop.org/wiki/Software/fontconfig/)
- [FontExplorer X](http://www.fontexplorerx.com/)
- [Forge](http://www.slightlymagic.net/wiki/Forge)
- [Fork](https://git-fork.com/)
- [ForkLift](http://www.binarynights.com/forklift/)
- [Franz](https://meetfranz.com)
- [Gas Mask](https://github.com/2ndalpha/gasmask/)
- [gdb](https://www.gnu.org/software/gdb/)
- [Gear Player](https://www.gearmusicplayer.com/)
- [GeekTool](http://projects.tynsoe.org/en/geektool/)
- [GHCi](https://wiki.haskell.org/GHC/GHCi)
- [Ghidra](https://ghidra-sre.org)
- [Ghostty](https://ghostty.org/)
- [Ghostwriter](https://wereturtle.github.io/ghostwriter/)
- [Gimp](https://www.gimp.org/)
- [Git Hooks](https://github.com/git-hooks/git-hooks)
- [Git](http://git-scm.com/)
- [Gitbox](http://gitboxapp.com/)
- [GitFox](https://www.gitfox.app)
- [GitHub CLI](https://cli.github.com/)
- [GitKraken](https://www.gitkraken.com)
- [GitUp](http://gitup.co/)
- [Gmail Notifr](http://ashchan.com/projects/gmail-notifr)
- [gmailctl](https://github.com/mbrt/gmailctl)
- [GMVault](http://gmvault.org/)
- [Gnome SSH Tunnel Manager](http://sourceforge.net/projects/gstm/)
- [GnuPG](https://www.gnupg.org/)
- [GNU Stow](https://www.gnu.org/software/stow/)
- [Go2Shell](http://zipzapmac.com/Go2Shell)
- [Goku](https://github.com/yqrashawn/GokuRakuJoudo)
- [GoLand](https://www.jetbrains.com/go/)
- [Goldendict](http://goldendict.org/)
- [GoodSync](https://goodsync.com/)
- [GoShare](https://github.com/dictget/goshare)
- [Gradle](http://gradle.org)
- [GrandTotal 3](http://www.mediaatelier.com/GrandTotal4/)
- [grsync](http://www.opbyte.it/grsync/)
- [Hammerspoon](http://www.hammerspoon.org/)
- [HandBrake](https://handbrake.fr/)
- [Hands Off!](http://www.oneperiodic.com/products/handsoff/)
- [Hazel](http://www.noodlesoft.com/hazel.php)
- [Hero Lab](http://www.wolflair.com/index.php?context=hero_lab)
- [Heroku](https://www.heroku.com/)
- [HexChat](https://hexchat.github.io/)
- [Hexels](http://hexraystudios.com/hexels/)
- [Hocus Focus](http://hocusfoc.us/)
- [Homebridge](https://github.com/nfarina/homebridge)
- [Homebrew](https://brew.sh)
- [Houdini](http://uglyapps.co.uk/houdini/)
- [Hstr](https://github.com/dvorka/hstr)
- [HTML Tidy](https://www.html-tidy.org/)
- [Htop](http://htop.sourceforge.net/)
- [HTTPie](https://httpie.org/)
- [hub](https://hub.github.com)
- [Hyper.app](https://hyper.is/)
- [HyperDock](https://bahoom.com/hyperdock)
- [HyperSwitch](https://bahoom.com/hyperswitch)
- [i2cssh](https://github.com/wouterdebie/i2cssh)
- [i3](https://i3wm.org/)
- [IDA Pro](https://www.hex-rays.com/products/ida/)
- [IdeaVim](https://github.com/JetBrains/ideavim)
- [IINA](https://iina.io)
- [Inkscape](https://inkscape.org/)
- [Insomnia](https://insomnia.rest/)
- [IntelliJIDEA](http://www.jetbrains.com/idea/)
- [IPython](http://ipython.org/)
- [Irssi](http://www.irssi.org/)
- [iStat Menus](https://bjango.com/mac/istatmenus/)
- [Itsycal](https://github.com/sfsam/Itsycal)
- [iTerm2](https://www.iterm2.com/)
- [iTermocil](https://github.com/TomAnthony/itermocil)
- [iTunes Scripts](https://www.apple.com/)
- [JankyBorders](https://github.com/FelixKratz/JankyBorders)
- [Janus](https://github.com/carlhuda/janus)
- [Jitouch](http://www.jitouch.com/)
- [Joplin](https://joplinapp.org/)
- [jrnl](https://jrnl.sh)
- [JS Beautifier](https://github.com/beautify-web/js-beautify)
- [JSHint](http://jshint.com/)
- [Julia](http://julialang.org)
- [Jumpcut](http://jumpcut.sourceforge.net/)
- [Jupyter](http://jupyter.org/)
- [k9s](https://k9scli.io/)
- [Kaggle](https://kaggle.com/)
- [Kaleidoscope](http://www.kaleidoscopeapp.com/)
- [Karabiner Elements](https://github.com/tekezo/Karabiner-Elements)
- [Karabiner](https://pqrs.org/osx/karabiner/)
- [Kdenlive](https://kdenlive.org/)
- [KeePassX](http://www.keepassx.org/)
- [KeePassXC](https://keepassxc.org/)
- [KeepingYouAwake](https://github.com/newmarcel/KeepingYouAwake)
- [Keka](http://www.kekaosx.com/en/)
- [Keybase](https://keybase.io/)
- [Keyboard Maestro](http://www.keyboardmaestro.com)
- [Keymo](http://manytricks.com/keymo/)
- [KeyRemap4MacBook](https://pqrs.org/osx/karabiner/)
- [Khd](https://github.com/koekeishiya/khd/)
- [kitty](https://sw.kovidgoyal.net/kitty/)
- [Kiro](https://kiro.dev/)
- [Krew](https://github.com/kubernetes-sigs/krew)
- [Kubectl](https://kubernetes.io/docs/reference/kubectl/overview/)
- [Kwm](https://koekeishiya.github.io/kwm/)
- [LaTeXiT](http://www.chachatelier.fr/latexit/latexit-home.php?lang=en)
- [LaunchBar](https://www.obdev.at/products/launchbar/index.html)
- [lazydocker](https://github.com/jesseduffield/lazydocker)
- [lazygit](https://github.com/jesseduffield/lazygit)
- [Ledger](http://ledger-cli.org)
- [Leiningen](http://leiningen.org/)
- [lf](https://github.com/gokcehan/lf)
- [LibreOffice](https://www.libreoffice.org/)
- [Liftoff](https://github.com/thoughtbot/liftoff)
- [Light Table](http://lighttable.com/)
- [LightPaper](https://getlightpaper.com/)
- [LimeChat](http://limechat.net/mac/)
- [Liquid Prompt](https://github.com/nojhan/liquidprompt)
- [LittleSnitch](http://www.obdev.at/products/littlesnitch/)
- [Livestreamer](http://livestreamer.tanuki.se/)
- [Logitech Options](https://www.logitech.com/en-us/product/options)
- [Logseq](https://logseq.com/)
- [Lollypop](https://gnumdk.github.io/lollypop-web/)
- [Loopback](https://rogueamoeba.com/loopback/)
- [Luftrausers](http://luftrausers.com)
- [LunarVim](https://www.lunarvim.org/)
- [MacDive](http://www.mac-dive.com/)
- [MacDown](http://macdown.uranusjr.com/)
- [MacOSX](http://www.apple.com/osx/)
- [MacVim](https://github.com/macvim-dev/macvim)
- [Magic Launch](https://www.oneperiodic.com/products/magiclaunch/)
- [MagicPrefs](http://magicprefs.com/)
- [Magnet](https://magnet.crowdcafe.com/)
- [Maid](https://github.com/benjaminoakes/maid/)
- [Mail](https://support.apple.com/guide/mail/welcome/mac)
- [Mailmate](http://freron.com/)
- [Mailplane](http://mailplaneapp.com/)
- [mako](https://wayland.emersion.fr/mako/)
- [Marked 2](http://marked2app.com)
- [Marta](https://marta.yanex.org/)
- [MATLAB](http://www.mathworks.com/products/matlab/)
- [Maven](http://maven.apache.org)
- [Max](http://sbooth.org/Max/)
- [Mendeley Desktop](https://www.mendeley.com)
- [MenuMeters](http://www.ragingmenace.com/software/menumeters/)
- [Mercurial](https://www.mercurial-scm.org/)
- [MercuryMover](http://www.heliumfoot.com/mercurymover/)
- [Messages](http://www.apple.com/osx/apps/#messages)
- [Micro](https://github.com/zyedidia/micro)
- [Microsoft Azure CLI](https://github.com/Azure/azure-xplat-cli)
- [Microsoft Remote Desktop](https://itunes.apple.com/us/app/microsoft-remote-desktop-10/id1295203466)
- [mise-en-place](https://github.com/jdx/mise)
- [mitmproxy](https://mitmproxy.org/)
- [mkcert](https://github.com/FiloSottile/mkcert)
- [Mole](https://github.com/tw93/Mole)
- [MonoDevelop](http://www.monodevelop.com)
- [Moom](http://manytricks.com/moom/)
- [Mosaic](https://lightpillar.com/mosaic.html)
- [Mou](http://25.io/mou/)
- [mpd](http://www.musicpd.org)
- [MPlayerX](http://mplayerx.org)
- [MPS Youtube](https://github.com/mps-youtube/mps-youtube)
- [MPV](https://mpv.io/)
- [MTMR](https://github.com/Toxblh/MTMR)
- [Multitouch](https://multitouch.app/)
- [Mumu](https://getmumu.com)
- [MusicBrainz Picard](https://picard.musicbrainz.org/)
- [MuteSpotifyAds](https://github.com/simonmeusel/MuteSpotifyAds)
- [mycli](https://www.mycli.net/)
- [myrepos](https://github.com/joeyh/myrepos)
- [MySQL Workbench](https://www.mysql.com/products/workbench/)
- [MySQL](http://www.mysql.com/)
- [Name Mangler](http://manytricks.com/namemangler/)
- [Nano](http://www.nano-editor.org/)
- [Navicat](http://navicat.com/)
- [ncmpcpp](http://rybczak.net/ncmpcpp/)
- [Neofetch](https://github.com/dylanaraps/neofetch)
- [neovim](https://github.com/neovim/neovim)
- [Nethack](http://www.nethack.org)
- [Netlify](https://www.netlify.com/)
- [newsbeuter](http://newsbeuter.org/)
- [ngrok](https://ngrok.com/)
- [ni](https://github.com/antfu/ni/)
- [Nomacs](http://nomacs.org/)
- [NoSQLBooster for MongoDB](https://www.nosqlbooster.com/)
- [notion-enhancer](https://notion-enhancer.github.io/)
- [Nova](https://www.nova.app/)
- [npm](https://www.npmjs.com/)
- [npmrc](https://github.com/deoxxa/npmrc/)
- [NSLogger](https://github.com/fpillet/NSLogger)
- [nuget](https://www.nuget.org/)
- [Nushell](https://www.nushell.sh/)
- [nvALT](http://brettterpstra.com/projects/nvalt/)
- [nvm](https://github.com/nvm-sh/nvm)
- [nvpy](https://github.com/cpbotha/nvpy)
- [OBS](https://obsproject.com)
- [OfflineIMAP](https://www.offlineimap.org/)
- [Oh My Fish](https://github.com/bpinto/oh-my-fish)
- [Oh My Tmux](https://github.com/gpakosz/.tmux)
- [OmniFocus](https://www.omnigroup.com/omnifocus/)
- [OmniGraffle](https://www.omnigroup.com/omnigraffle/)
- [Openbox](http://openbox.org)
- [OpenCode](https://opencode.ai)
- [OpenEmu](http://openemu.org)
- [OpenSSH](http://www.openssh.com/)
- [Opera](http://www.opera.com)
- [Oracle Cloud Infrastructure CLI](https://docs.oracle.com/en-us/iaas/Content/API/Concepts/cliconcepts.htm)
- [Paintbrush](http://paintbrush.sourceforge.net/)
- [Pandoc](http://pandoc.org)
- [Pass](http://www.passwordstore.org/)
- [Pastebot](http://tapbots.com/software/pastebot/)
- [Path Finder](http://www.cocoatech.com/pathfinder/)
- [PDFjam](https://warwick.ac.uk/fac/sci/statistics/staff/academic-research/firth/software/pdfjam/)
- [Pear](http://pear.php.net/)
- [Pentadactyl](http://5digits.org/pentadactyl/)
- [Perl](https://www.perl.org/)
- [Phoenix](https://github.com/kasper/phoenix)
- [PhoneView](https://www.ecamm.com/mac/phoneview/)
- [PhpStorm](http://www.jetbrains.com/phpstorm/)
- [PicGo](https://github.com/Molunerfinn/PicGo)
- [Pidgin](https://www.pidgin.im)
- [PIP](http://www.pip-installer.org/)
- [PixelSnap](https://getpixelsnap.com/)
- [PixelSnap 2](https://getpixelsnap.com/)
- [Planner](https://useplanner.com/)
- [Plover](http://www.openstenoproject.org/plover/)
- [Pnpm](https://pnpm.js.org/)
- [Pock](https://pock.pigigaldi.com)
- [Podman](https://podman.io/)
- [Poedit](http://poedit.net/)
- [Poetry](https://python-poetry.org)
- [PokerStars](https://www.pokerstars.com/)
- [Polybar](https://polybar.github.io/)
- [PopClip](http://pilotmoon.com/popclip/)
- [Popcorn-Time](https://popcorntime.io/)
- [PostgreSQL](http://www.postgresql.org/)
- [Postico](https://eggerapps.at/postico/)
- [Pow](http://pow.cx/)
- [Powerlevel10k](https://github.com/romkatv/powerlevel10k)
- [Powerline](https://github.com/powerline/powerline)
- [Powerline-shell](https://github.com/b-ryan/powerline-shell)
- [Prezto](https://github.com/sorin-ionescu/prezto)
- [Processing](https://processing.org/)
- [Proselint](https://github.com/amperser/proselint)
- [ProxyChains NG](http://sourceforge.net/projects/proxychains-ng/)
- [ProxyChains](http://proxychains.sourceforge.net)
- [Proxyman](https://proxyman.io)
- [PrusaSlicer](https://www.prusa3d.com/prusaslicer/)
- [PsySH](https://psysh.org/)
- [Punto Switcher](https://punto.yandex.ru/)
- [PyCharm](https://www.jetbrains.com/pycharm/)
- [PyPI](https://pypi.python.org/pypi)
- [PyRadio](http://www.coderholic.com/pyradio/)
- [Querious](http://www.araelium.com/querious/)
- [Quicksilver](http://qsapp.com/)
- [Quitter](https://marco.org/apps)
- [Qutebrowser](http://qutebrowser.org/)
- [Qv2ray](https://qv2ray.net/)
- [R](http://www.r-project.org/)
- [Rails](http://rubyonrails.org/)
- [Ranger](https://ranger.github.io/)
- [Rbenv](https://www.github.com/rbenv/rbenv)
- [Rclone](https://rclone.org/)
- [Rectangle](https://rectangleapp.com/)
- [Redshift Scheduler](https://github.com/spantaleev/redshift-scheduler)
- [Redshift](http://jonls.dk/redshift/)
- [Remote Desktop Manager](https://remotedesktopmanager.com/)
- [Rhythmbox](https://wiki.gnome.org/Apps/Rhythmbox)
- [Rime](http://rime.im/)
- [ripgrep](https://github.com/BurntSushi/ripgrep)
- [Robo 3T](http://robomongo.org/)
- [Rocket](https://matthewpalmer.net/rocket/)
- [Rofi](https://github.com/DaveDavenport/rofi)
- [Royal TSX](http://www.royaltsx.com/ts/osx/features)
- [RStudio](https://www.rstudio.com/)
- [rTorrent](http://libtorrent.rakshasa.no/)
- [rtx](https://github.com/jdx/rtx)
- [rubiTrack 5](https://www.rubitrack.com)
- [Rubocop](https://github.com/bbatsov/rubocop)
- [Ruby Version Manager](https://rvm.io/)
- [Ruby Version](https://gist.github.com/fnichol/1912050)
- [Ruby](https://www.ruby-lang.org/)
- [RubyMine](http://www.jetbrains.com/ruby/)
- [Rust](https://www.rust-lang.org/)
- [RustRover](https://www.jetbrains.com/rust/)
- [S3cmd](http://s3tools.org/s3cmd)
- [SABnzbd](http://sabnzbd.org/)
- [SBCL](http://www.sbcl.org/)
- [SBT](http://www.scala-sbt.org/)
- [Scenario](http://www.lagentesoft.com/scenario/)
- [Screen](http://www.gnu.org/software/screen/)
- [Screenhero](https://screenhero.com)
- [Scrivener](http://www.literatureandlatte.com/scrivener.php)
- [Scroll Reverser](https://pilotmoon.com/scrollreverser/)
- [SecureCRT](https://www.vandyke.com/products/securecrt/)
- [Secure Pipes](http://www.opoet.com/)
- [Seil](https://pqrs.org/osx/karabiner/seil.html.en)
- [SelfControl](http://selfcontrolapp.com/)
- [Sequel Pro](http://www.sequelpro.com/)
- [ShadowsocksX-NG](https://github.com/shadowsocks/ShadowsocksX-NG)
- [ShiftIt](https://github.com/fikovnik/ShiftIt)
- [Shifty](https://shifty.natethompson.io/)
- [Shimo](https://www.feingeist.io/shimo/)
- [ShowyEdge](https://pqrs.org/osx/ShowyEdge/index.html.en)
- [SHSH Blobs](https://en.wikipedia.org/wiki/SHSH_blob)
- [Shuttle](http://fitztrev.github.io/shuttle/)
- [SizeUp](http://www.irradiatedsoftware.com/sizeup/)
- [Sizzy](https://sizzy.co/)
- [SketchyBar](https://felixkratz.github.io/SketchyBar/)
- [skhd](https://github.com/koekeishiya/skhd/)
- [Skim](http://skim-app.sourceforge.net/)
- [Skitch](https://evernote.com/skitch/)
- [Slate](https://github.com/jigish/slate)
- [Slic3r](http://slic3r.org)
- [Slogger](http://brettterpstra.com/projects/slogger/)
- [SmartGit](http://www.syntevo.com/smartgit/)
- [Smooth Mouse](http://smoothmouse.com/)
- [Soulver](http://www.acqualia.com/soulver/)
- [SourceTree](https://www.sourcetreeapp.com/)
- [SpaceLauncher](https://spacelauncherapp.com)
- [Spacemacs](https://github.com/syl20bnr/spacemacs)
- [SpaceVim](https://github.com/SpaceVim/SpaceVim)
- [SpamSieve](https://c-command.com/spamsieve)
- [Spark](http://www.shadowlab.org/softwares/spark.php)
- [Spectacle](https://www.spectacleapp.com/)
- [Spectrwm](https://github.com/conformal/spectrwm/wiki)
- [Splice](https://splice.com/)
- [Spotify Notifications](http://spotify-notifications.citruspi.io/)
- [Spotify](https://www.spotify.com/)
- [Sqitch](https://sqitch.org/)
- [Starship](https://starship.rs/)
- [Startupizer2](http://appledoc.gentlebytes.com/startupizer/)
- [Stata](http://www.stata.com/)
- [Stats](https://github.com/exelban/stats)
- [Stay](https://cordlessdog.com/stay/)
- [Storyist](http://storyist.com/)
- [Subler](https://subler.org)
- [Sublime Merge](https://www.sublimemerge.com/)
- [Sublime Text](http://www.sublimetext.com/)
- [Subversion](http://subversion.apache.org/)
- [SuperDuper!](http://www.shirt-pocket.com/SuperDuper/SuperDuperDescription.html)
- [Surge](http://surge.run/manual/)
- [Sway](https://swaywm.org/)
- [Swinsian](http://swinsian.com/)
- [Swish](https://highlyopinionated.co/swish/)
- [SwitchHosts](https://github.com/oldj/SwitchHosts)
- [T](http://sferik.github.io/t/)
- [TablePlus](https://tableplus.io)
- [TaskPaper](https://www.taskpaper.com)
- [Taskwarrior](http://taskwarrior.org/)
- [Teamocil](https://github.com/remi/teamocil)
- [Telegram for macOS](https://macos.telegram.org)
- [Terminal](http://www.apple.com/osx/apps/)
- [Terminator](https://launchpad.net/terminator/)
- [termite](https://github.com/thestinger/termite)
- [Termux](https://termux.dev/)
- [Terraform](https://developer.hashicorp.com/terraform)
- [TextExpander](https://smilesoftware.com/textexpander)
- [TextMate](http://macromates.com/)
- [Textual](http://www.codeux.com/textual/)
- [Things](https://culturedcode.com/things/)
- [Tig](https://github.com/jonas/tig)
- [Tiles](https://www.sempliva.com/tiles/)
- [Tilix](https://github.com/gnunn1/tilix)
- [Timeout](https://www.dejal.com/timeout/)
- [tint2](https://code.google.com/p/tint2/)
- [TinyFugue](http://tinyfugue.sourceforge.net)
- [Tmux](http://tmux.sourceforge.net/)
- [Tmuxp](https://github.com/tony/tmuxp)
- [Tmuxinator](https://github.com/tmuxinator/tmuxinator)
- [Todo.txt CLI](http://todotxt.com/)
- [ToothFairy](https://c-command.com/toothfairy/)
- [TotalSpaces2](http://totalspaces.binaryage.com/)
- [Tower](http://www.git-tower.com/)
- [Transmission](http://www.transmissionbt.com/)
- [Transmit](http://panic.com/transmit/)
- [TripMode](https://www.tripmode.ch)
- [Trizen](https://github.com/trizen/trizen)
- [Tunnelblick](https://tunnelblick.net)
- [tvnamer](https://github.com/dbr/tvnamer)
- [Twitterrific](http://twitterrific.com/)
- [Typinator](http://www.ergonis.com/products/typinator/)
- [Typora](https://typora.io)
- [uTorrent](http://www.utorrent.com/)
- [ulauncher](https://ulauncher.io/)
- [Ventrilo](http://www.ventrilo.com/)
- [Verdaccio](https://verdaccio.org/)
- [Versions](http://www.versionsapp.com)
- [Vim](http://www.vim.org/)
- [Vimperator](http://www.vimperator.org/vimperator)
- [Vimwiki](https://vimwiki.github.io/)
- [Viscosity](http://www.sparklabs.com/viscosity/)
- [Visual Studio Code](https://code.visualstudio.com/)
- [Visual Studio Code - Insiders](https://code.visualstudio.com/insiders)
- [Visual Studio Code - OSS](https://github.com/Microsoft/vscode)
- [VSCodium](https://vscodium.com/)
- [Visual Studio for Mac](https://www.visualstudio.com/vs/visual-studio-mac/)
- [VLC](http://www.videolan.org/)
- [Volt](https://github.com/vim-volt/volt)
- [Wakatime](https://wakatime.com/)
- [Warp](https://www.warp.dev)
- [waybar](https://github.com/Alexays/Waybar)
- [WebStorm](https://www.jetbrains.com/webstorm/)
- [WezTerm](https://wezfurlong.org/wezterm/)
- [Wget](https://www.gnu.org/software/wget/)
- [WhatsApp Web](https://web.whatsapp.com/)
- [Windsurf](https://www.codeium.com)
- [Wireshark 2](https://www.wireshark.org)
- [Witch](http://manytricks.com/witch/)
- [WordGrinder](https://cowlark.com/wordgrinder/)
- [WordPress WP-CLI](http://wp-cli.org/)
- [Workrave](http://www.workrave.org/)
- [X11](http://www.x.org/)
- [Xee](https://theunarchiver.com/xee)
- [Xamarin Studio](https://xamarin.com/studio)
- [xbar](https://xbarapp.com/)
- [XBindKeys](http://www.nongnu.org/xbindkeys/)
- [Xchat](http://xchat.org/)
- [Xcode](https://developer.apple.com/xcode/)
- [XEmacs](http://www.xemacs.org/)
- [XLD](http://tmkk.undo.jp/xld/)
- [Xonsh](https://xon.sh)
- [XtraFinder](http://www.trankynam.com/xtrafinder/)
- [yabai](https://github.com/koekeishiya/yabai)
- [yarn](https://yarnpkg.com)
- [yazi](https://github.com/sxyazi/yazi)
- [youtube-dl](https://ytdl-org.github.io/youtube-dl/)
- [Yummy FTP](http://www.yummysoftware.com/)
- [zabbix-cli](https://github.com/usit-gd/zabbix-cli)
- [zathura](https://pwmt.org/projects/zathura/)
- [zed](https://zed.dev/)
- [Zoom](http://zoom.com/)
- [zoxide](https://github.com/ajeetdsouza/zoxide)
- [Zsh](http://zsh.sourceforge.net/)
- [Übersicht](http://tracesof.net/uebersicht/)
## Can you support application X
We can [with your help](doc#get-official-support-for-an-application) ;)
## Personalization & configuration
Have an application that shouldn't be generally supported but that you use?
Or some personal files you want to sync, e.g. various config files in a `~/.config/`
directory or your personal `~/.gitignore`?
- Create a `~/.mackup` directory to [sync an application or any file or directory](doc#add-support-for-an-application-or-any-file-or-directory)
## Why did you do this
Yesterday, I had a talk with [Zach Zaro](http://zacharyzaro.com/), complaining
about the pain it is to reconfigure our Macbook each time we get a new one or
install from scratch. That's a talk we have already had months ago.
I change my workstation every X months. Each time I either lose my apps'
configurations, or I just waste a bunch of hours getting setup like I was on my
old box. I also spend a lot of time reconfiguring the same stuff again on all my
workstations (home, work).
Boring...
Some people tried to solve the problem on the application layer, like
[Github's Boxen](https://boxen.github.com/),
but it solves a different problem, from my point of view. I don't spend a lot
of time installing or downloading stuff. I spend time configuring it.
For years, I've used a personal shell script that was copying known config
files into Subversion, Git or Dropbox, and linked them into my home. But I felt
a lot of us had the same problem: Making a more generic tool could help others
and I could get help from others to support more apps in the tool.
So here comes Mackup, the little tool that will sync all your application
configs to Dropbox (or Google Drive, or anything).
And it's [GPL](http://www.gnu.org/licenses/gpl.html), of course.
## What platforms are supported
- macOS
- GNU/Linux
## What's up with the weird name
Mackup is just a portmanteau of Mac and Backup. It is simple, short, and easy to
remember, and it corresponds with the whole idea of Mackup: the simpler – the better!
(And I suck at naming stuff, but who doesn't.)
## Architecture
Want to understand how Mackup works internally? Check out the
[Architecture Guide](doc/ARCHITECTURE.md) which includes:
- Visual architecture diagram
- Component breakdown
- Data flow diagrams
- Design decisions
- Extension points for contributors
Perfect for contributors who want to understand the codebase or users
curious about how their configs are managed.
## Where can I find more information
In the [doc](doc) directory.
================================================
FILE: doc/.mackup/gnupg.cfg
================================================
[application]
name = GnuPG
[configuration_files]
.gnupg/gpg-agent.conf
.gnupg/gpg.conf
.gnupg/secring.gpg
.gnupg/trustdb.gpg
.gnupg/pubring.gpg
.gnupg/pubring.kbx
================================================
FILE: doc/.mackup/mackup.cfg
================================================
[application]
name = Mackup
[configuration_files]
.mackup.cfg
.mackup
================================================
FILE: doc/.mackup/my-own-files.cfg
================================================
[application]
name = Files and directories I want to sync
[configuration_files]
bin
src/mackup
================================================
FILE: doc/.mackup/ssh.cfg
================================================
[application]
name = SSH
[configuration_files]
.ssh
================================================
FILE: doc/.mackup.cfg
================================================
#
# Sample Mackup configuration file
#
# You can specify the storage type Mackup will use to store your configuration
# files.
# For now you have 3 options: "dropbox", "google_drive" and "file_system".
# If none is specified, Mackup will try to use the default: "dropbox".
# With the "dropbox" storage engine, Mackup will automatically figure out your
# Dropbox folder.
[storage]
engine = dropbox
# If you choose the "google_drive" storage engine instead, Mackup will figure
# out where your Google Drive is and store your configuration files in it.
# [storage]
# engine = google_drive
# If you want to specify another directory, you can use the "file_system"
# engine and Mackup won't try to detect any path for you: it will store your
# files where you explicitly told him to, using the "path" setting.
# The "path" can be absolute (from the / of your drive) or relative to your
# home directory.
# The "path" setting is mandatory when using the "file_system" engine.
# Note: you don't need to escape spaces or wrap the path in quotes.
# [storage]
# engine = file_system
# path = some/folder/in/your/home
# # or
# path = /some/folder/in/your/root
# # or
# path = /some path/in/your/root
# You can customize the directory name in which Mackup stores your file. By
# default, if not specified, Mackup creates a "Mackup" directory in the storage
# engine you chose, e.g. "~/Dropbox/Mackup".
directory = Mackup
# List of applications you want to explicitly sync
# One application name per line
# If this list is empty, Mackup will try to sync all the supported
# applications.
#
# To see a list of supported application names, launch mackup list
# Use the names listed below.
#
# For example, to sync Irssi, Ventrilo and XEmacs, add:
[applications_to_sync]
irssi
ventrilo
xemacs
# List of applications you want to ignore
# One application name per line
# If an application is ignored, it will be ignored even if it's been explicitly
# allowed in the [Allowed Applications].
#
# To see a list of supported application names, launch mackup list
# Use the names listed below.
#
# For example, to not sync SSH and Adium, add:
[applications_to_ignore]
ssh
adium
================================================
FILE: doc/ARCHITECTURE.md
================================================
# Mackup Architecture
This document explains how Mackup works internally to help contributors
understand the codebase.
## Visual Overview

## Core Concepts
Mackup is a tool that backs up and syncs application configuration files
across multiple machines using a cloud storage service (Dropbox, Google Drive,
iCloud) or any file system location.
### Operation Modes
Mackup has two main operation modes:
#### 1. Copy Mode (Recommended)
Copy mode is used for backing up and restoring files:
- **`mackup backup`**: Copies configuration files from your home directory
to the Mackup folder
- **`mackup restore`**: Copies configuration files from the Mackup folder
back to your home directory
This is a one-time operation used when setting up a new machine or creating
an initial backup.
#### 2. Link Mode (Legacy - Not recommended for macOS Sonoma+)
Link mode creates persistent symlinks between your home directory and the
Mackup folder:
- **`mackup link install`**: Moves files to Mackup folder and creates
symlinks back to original locations
- **`mackup link`**: Creates symlinks from Mackup folder to home directory
(on additional machines)
- **`mackup link uninstall`**: Removes symlinks and copies files back to
original locations
⚠️ **Warning**: Link mode is broken on macOS Sonoma (14) and later due to
changes in how macOS handles symlinked preferences. Use copy mode instead.
## Component Architecture
### 1. Command Line Interface (`main.py`)
Entry point for the application. Parses command-line arguments using
`docopt` and dispatches to the appropriate operation.
**Key Functions:**
- Argument parsing and validation
- Help text display
- Operation dispatch
### 2. Configuration Manager (`config.py`)
Reads and parses the `.mackup.cfg` configuration file.
**Configuration Sources (in order of precedence):**
1. `~/.mackup.cfg`
2. `$MACKUP_CONFIG` environment variable
3. `$XDG_CONFIG_HOME/mackup/mackup.cfg` or `~/.config/mackup/mackup.cfg`
**Configuration Options:**
- Storage engine (dropbox, google_drive, icloud, file_system)
- Storage path and directory name
- Applications to sync/ignore
- Custom directory name
### 3. Application Database (`appsdb.py`)
Manages the database of supported applications and their configuration files.
**Sources:**
- Built-in application configs (`mackup/applications/*.cfg`)
- User-defined custom configs (`~/.mackup/*.cfg`)
**Application Config Format:**
```ini
[application]
name = Application Name
[configuration_files]
.config_file
folder/
[xdg_configuration_files]
app/config
```
### 4. Application Handler (`application.py`)
Handles the operations (backup, restore, link) for individual applications.
**Key Operations:**
- File discovery and validation
- Copy operations with permission preservation
- Symlink creation and management
- XDG directory handling
- Conflict detection
### 5. Core Engine (`mackup.py`)
Orchestrates the overall backup/restore/link operations across all
applications.
**Workflow:**
1. Load configuration
2. Determine storage location
3. Load application database
4. Filter applications based on config
5. Execute operation on each application
6. Handle errors and report status
### 6. Utilities (`utils.py`)
Common utility functions used throughout the codebase:
- File system operations (copy, delete, symlink)
- Path manipulation and resolution
- XDG directory detection
- Error handling and user prompts
- Storage engine detection (Dropbox, Google Drive, iCloud)
## Data Flow
### Backup Flow
```text
User runs: mackup backup
↓
main.py parses command
↓
config.py loads .mackup.cfg
↓
appsdb.py loads application definitions
↓
mackup.py iterates through applications
↓
application.py for each app:
- Finds config files in home directory
- Copies to Mackup storage folder
- Preserves permissions and timestamps
↓
Files now in: ~/Dropbox/Mackup/ (or chosen storage)
```
### Restore Flow
```text
User runs: mackup restore
↓
main.py parses command
↓
config.py loads .mackup.cfg
↓
appsdb.py loads application definitions
↓
mackup.py iterates through applications
↓
application.py for each app:
- Finds files in Mackup storage folder
- Copies to home directory
- Preserves permissions and timestamps
↓
Config files now in home directory
```
### Link Install Flow (Legacy)
```text
User runs: mackup link install
↓
main.py parses command
↓
config.py loads .mackup.cfg
↓
appsdb.py loads application definitions
↓
mackup.py iterates through applications
↓
application.py for each app:
- Moves config files to Mackup storage folder
- Creates symlinks from original location to storage
↓
Files in storage: ~/Dropbox/Mackup/
Symlinks in home: ~/.config → ~/Dropbox/Mackup/.config
```
## Key Design Decisions
### 1. Symlinks vs Copies
**Original Design (Link Mode):**
- Symlinks allowed real-time sync across machines
- Changes immediately reflected in cloud storage
- Single source of truth
**Current Recommendation (Copy Mode):**
- macOS Sonoma+ broke symlink support for preferences
- Copy mode is more reliable across platforms
- Trade-off: manual sync required (re-run backup/restore)
### 2. Application Database
- **Centralized definitions**: All supported apps in
`mackup/applications/`
- **User extensibility**: Custom apps via `~/.mackup/*.cfg`
- **Simple format**: INI-style configuration files
- **Override capability**: User configs override built-in ones
### 3. Storage Abstraction
- **Multiple backends**: Dropbox, Google Drive, iCloud, file system
- **Auto-detection**: Automatically finds storage paths
- **Flexibility**: Custom paths for any sync solution
### 4. XDG Support
- **Standards compliance**: Respects XDG Base Directory Specification
- **Flexibility**: Handles non-standard `$XDG_CONFIG_HOME`
- **Separate section**: `[xdg_configuration_files]` in app configs
## File Structure
```text
mackup/
├── main.py # CLI entry point
├── mackup.py # Core orchestration engine
├── config.py # Configuration management
├── appsdb.py # Application database
├── application.py # Per-application operations
├── utils.py # Utility functions
├── constants.py # Constants and defaults
└── applications/ # Built-in app configs
├── git.cfg
├── vim.cfg
├── ssh.cfg
└── ... (600+ more)
```
## Extension Points
### Adding a New Application
Create `mackup/applications/myapp.cfg`:
```ini
[application]
name = My Application
[configuration_files]
.myapprc
.myapp/
[xdg_configuration_files]
myapp/config.yml
```
Submit PR with the new config file.
### Adding a New Storage Backend
1. Extend `config.py` to detect new storage location
2. Add storage type to `constants.py`
3. Implement path detection in `utils.py`
4. Update documentation
### Custom File Sync
Users can sync any files by creating `~/.mackup/custom.cfg`:
```ini
[application]
name = My Custom Files
[configuration_files]
.custom_file
custom_directory/
```
## Testing Strategy
The codebase includes comprehensive unit tests:
- **`tests/test_application.py`**: Application operations
- **`tests/test_config.py`**: Configuration parsing
- **`tests/test_utils.py`**: Utility functions
- **`tests/test_cli.py`**: Command-line interface
- **`tests/test_main.py`**: Main entry point
Tests use temporary directories and mock file systems to avoid affecting
the actual system.
## Error Handling
Mackup includes several safety mechanisms:
1. **Confirmation prompts**: Asks before destructive operations
2. **Conflict detection**: Warns if files exist in both locations
3. **Dry-run capability**: Can preview operations (future enhancement)
4. **Graceful degradation**: Continues with other apps if one fails
5. **Clear error messages**: Helps users understand what went wrong
## Performance Considerations
- **Sequential processing**: Processes one application at a time
- **File-by-file operations**: No batch operations for reliability
- **No caching**: Reads fresh data on each run
- **Minimal dependencies**: Only requires `docopt-ng` for CLI parsing
## Future Enhancements
Potential improvements to the architecture:
1. **Progress indicators**: Show progress during long operations
2. **Dry-run mode**: Preview changes without executing
3. **Incremental sync**: Only sync changed files
4. **Parallel processing**: Speed up operations on multi-app backups
5. **Conflict resolution**: Better handling of file conflicts
6. **Rollback capability**: Undo operations if something goes wrong
## Contributing
See [CONTRIBUTING.md](../.github/CONTRIBUTING.md) and
[develop.md](develop.md) for guidelines on contributing to Mackup.
================================================
FILE: doc/README.md
================================================
# Configuration
> 💡 **New to Mackup?** Check out the
> [Architecture Guide](ARCHITECTURE.md) to understand how Mackup works
> under the hood.
All the configuration is done in a file named `.mackup.cfg` stored at the
root of your home folder. This location can be overridden via environment
variables or the `--config-file` command-line option.
To configure Mackup, create a file named `.mackup.cfg` in your home
directory.
```bash
vi ~/.mackup.cfg
```
## Configuration file location
Config files are searched in the following order. If none is found, Mackup will
use the default config location of `~/.mackup.cfg`
- `~/.mackup.cfg`
- `$MACKUP_CONFIG`
- `$XDG_CONFIG_HOME/mackup/mackup.cfg` or `~/.config/mackup/mackup.cfg`
You can also specify a custom config file location using the `--config-file`
command-line option:
```bash
mackup --config-file ~/.mackup-custom.cfg backup
```
The path can be absolute or relative to your home directory. Note that the
config file must be located within your home directory for security reasons.
## Storage
You can specify the storage type Mackup will use to store your configuration
files.
For now, you have 4 options: `dropbox`, `google_drive`, `icloud` and `file_system`.
If none is specified, Mackup will try to use the default: `dropbox`.
With the `dropbox` storage engine, Mackup will automatically figure out your
Dropbox folder.
### Dropbox
```ini
[storage]
engine = dropbox
```
### Google Drive
If you choose the `google_drive` storage engine instead, Mackup will figure out
where your Google Drive is and store your configuration files in it.
```ini
[storage]
engine = google_drive
```
### iCloud
If you choose the `iCloud` storage engine, Mackup will store your
configuration files in the `~/Library/Mobile\ Documents/com\~apple\~CloudDocs/`
folder.
```ini
[storage]
engine = icloud
```
You can check if your files are synced using:
```sh
brctl monitor com.apple.CloudDocs
```
### File System
If you want to specify another directory, you can use the `file_system` engine
and Mackup won't try to detect any path for you: it will store your files where
you explicitly told it to, using the `path` setting.
The `path` can be absolute (from the `/` of your drive) or relative to your
home directory.
The `path` setting is mandatory when using the `file_system` engine.
```ini
[storage]
engine = file_system
path = some/folder/in/your/home
# or path = /some/folder/in/your/root
```
Note: you don't need to escape spaces or wrap the path in quotes.
For example, the following paths are valid:
```ini
path = some/path in your/home
path = /some path/in/your/root
```
### Custom Directory Name
You can customize the directory name in which Mackup stores your files. By
default, if not specified, Mackup creates a `Mackup` directory in the storage
engine you chose, e.g. `~/Dropbox/Mackup`.
```ini
[storage]
directory = Mackup
```
For example:
```ini
[storage]
engine = file_system
path = dotfiles
directory = backup
```
This will store your files in the `~/dotfiles/backup` directory in your home.
You can also select a subfolder:
```ini
[storage]
engine = icloud
directory = .config/mackup
```
### Switching Storage
If you ever change your mind and switch storage solutions after Mackup is
already setup (ex: from `dropbox` to `icloud`), complete the following steps.
1. Run `mackup uninstall` on all computers
2. Copy your Mackup files to the new storage location
3. Change the storage provider details in your `.mackup.cfg` file (see above)
4. Run `mackup backup` on the main computer and `mackup restore` on all others
## Applications
### Only sync one or two applications
In your home folder, create a file named `.mackup.cfg` and add the application
names to allow in the `[applications_to_sync]` section, one per line.
```ini
# Example, to only sync SSH and Adium:
[applications_to_sync]
ssh
adium
```
Use `mackup list` to get a list of valid application names. Don't use fancy
names (with spaces) here.
A [sample](.mackup.cfg) of this file is available in this folder. Just copy it
to your home folder:
```bash
cp mackup/doc/.mackup.cfg ~/
```
### Don't sync an application
In your home folder, create a file named `.mackup.cfg` and add the application
names to ignore in the `[applications_to_ignore]` section, one per line.
```ini
# Example, to not sync SSH and Adium:
[applications_to_ignore]
ssh
adium
```
Use `mackup list` to get a list of valid application names. Don't use fancy
names (with spaces) here.
A [sample](.mackup.cfg) of this file is available in this folder. Just copy it
to your home folder:
```bash
cp mackup/doc/.mackup.cfg ~/
```
### Get official support for an application
Open a [new issue](https://github.com/lra/mackup/issues) and ask for it, or
fork Mackup and open a
[Pull Request](https://help.github.com/articles/using-pull-requests).
The stock application configs are in the `mackup/applications` directory.
Remember to follow the guidelines in [CONTRIBUTING.md](https://github.com/lra/mackup/blob/master/.github/CONTRIBUTING.md)
to get your Pull Request merged faster.
### Add support for an application or (almost) any file or directory
You can customize the Mackup engine and add support for unsupported
applications or just custom files and directories you'd like to sync.
NOTE: Files and directories to be synced should be rooted at $HOME.
Let's say that you'd like to add support for Nethack (config file:
`.nethackrc`), for the `bin` and `.hidden` directories and for the
`.gitignore` file you keep in your home.
In your home, create a `.mackup` directory and add a config file for the
application you'd like to support:
```bash
mkdir ~/.mackup
touch ~/.mackup/nethack.cfg
touch ~/.mackup/my-files.cfg
```
#### Custom applications directory location
Custom application configs are searched in the following order:
1. `~/.mackup/` (legacy location, takes priority)
2. `$XDG_CONFIG_HOME/mackup/applications/` or `~/.config/mackup/applications/`
If the same application config exists in both locations, the legacy location
(`~/.mackup/`) takes priority.
For XDG-compliant setups, you can use:
```bash
mkdir -p ~/.config/mackup/applications
touch ~/.config/mackup/applications/nethack.cfg
```
Edit those files:
```bash
$ nano ~/.mackup/nethack.cfg
[application]
name = Nethack
[configuration_files]
.nethackrc
```
```bash
$ nano ~/.mackup/my-files.cfg
[application]
name = My personal synced files and dirs
[configuration_files]
bin
.hidden
.gitignore
```
Note that Mackup assumes the file paths listed here are relative to your home
directory.
You can run mackup to see if they are listed:
```bash
$ mackup list
Supported applications:
[...]
- my-files
- nethack
[...]
```
All good, you can now sync your newly configured files:
```bash
mackup backup
```
If you override an application config that is already supported by Mackup, your
new config for this application will replace the one provided by Mackup.
You can find some sample configs in this directory.
### Locally test an application before submitting a Pull Request
You can add and test an application by following these steps:
- fork this project
- create a branch _(usually containing the name of the application)_
- add the appropriate application config file in the `mackup/applications` folder
- from the top-most folder _(mackup)_ run `make develop` that replaces the
currently installed mackup with the local modified one
- simply run `mackup backup` to test if everything is ok
- if everything works as expected:
- run `make undevelop` to revert to the official version
- commit and push the change to your fork and then create the Pulls Request
### Add support for an application using the XDG directory
For applications storing their configuration under the `~/.config` folder, you
should not hardcode it. The `.config` folder is the default location but it can
be named differently on other users' systems by setting the `XDG_CONFIG_HOME`
environment variable.
See <https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html>
Mackup supports this mechanism and provides a dedicated `xdg_configuration_files`
section for those applications.
If any path starts with `.config`, remove the `.config` part and move the path
to a dedicated `xdg_configuration_files` section.
Instead of:
```ini
[application]
name = Git
[configuration_files]
.gitconfig
.config/git/config
.config/git/ignore
.config/git/attributes
```
Use this:
```ini
[application]
name = Git
[configuration_files]
.gitconfig
[xdg_configuration_files]
git/config
git/ignore
git/attributes
```
================================================
FILE: doc/configuration_merge_guide.md
================================================
# Guide for Merging Configurations Across Machines
This guide is for users who want to combine configuration settings for two or
more machines.
For example, you might have some bash settings on Machine A (like useful
command aliases) that are not on Machine B. You also have some settings on
Machine B that you would like to move over to Machine A.
The problem is that if you use Mackup to send Machine A's bash configuration
settings to Machine B, you will permanently lose any configurations on Machine
B that you wanted to keep. Mackup obviously has no idea which features you want
to keep and which ones you don't, so you'll have to do a bit of work to merge
the different configuration files yourself before using Mackup.
## Step 0: Read Through This Entire Guide First
It will probably save you some pain in the long run.
## Step 1: Determine Which Configuration Files to Merge
First, pick the app you wish to keep in sync. Then determine which
configuration files will be synced for that application by doing the following:
1. [Install Mackup](./../INSTALL.md)
2. Create a `.mackup.cfg` file in your home directory
3. Add the following two lines to `.mackup.cfg`. Replace **bash**
in the example below with the name of your application.
```text
[applications_to_sync]
bash
```
You can get a list of supported apps by running `mackup list`.
1. Save the file
2. Run the following command:
`mackup --dry-run --verbose backup`
This command will let you see what mackup will do behind the scenes when it
backs up your application's configuration files so you can readily see what
configuration files Mackup will sync. Make note of these files.
## Step 2: Prepare Your Workstations for Syncing
Now that you've identified which files you have to merge, choose one of the two
approaches below for merging the configuration files. **Method 1** has you do all
the configuration file merges first and then pushes them out with Mackup.
With **Method 2**, you'll push out the configuration files from one machine to the
others and then merge in your configuration changes gradually over time.
Which method should you use? It doesn't really matter. Method 1 is more work up
front in exchange for less work later. Method 2 is less work up front but more
work later.
Method 1 is probably best if you have very dissimilar configurations and have
few machines. Method 2 is probably best if you have a machine that is very
close to working the way you want and just need a few configuration settings
from other machines.
### Method 1: Backup Merge-Push Approach
1. Create a backup of each machine's configuration files for the app you wish
to sync.
2. Choose a machine that will serve as the initial "master". It doesn't really
matter which one.
3. Edit your configuration files on the master machine so that they
represent the ideal version of the file you wish to distribute out to your
other machines.
#### Method 1 Example
Let's say we have two machines, A and B, and we want to sync our bash configuration
across the machines. We decide that Machine A will serve as our master.
First, backup the bash configuration files (there are a few of them)
for your application on all machines.
##### Method 1: Sample backup commands for Machine A
```bash
mkdir ~/bash_backup
cp ~/.bash_profile ~/bash_backup/bash_profile.bak
cp ~/.bash_login ~/bash_backup/bash_login.bak
...plus any other bash config files you want to keep
```
##### Method 1: Sample backup commands for Machine B
```bash
mkdir ~/bash_backup
cp ~/.bash_profile ~/bash_backup/bash_profile.bak
cp ~/.bash_login ~/bash_backup/bash_login.bak
...plus any other bash config files you want to keep
```
Machine A will be our master so we now edit the existing configuration files
on Machine A. We will use the vim text editor to do this for each of our
configuration files:
```bash
vim .bash_profile
vim .bash_login
```
When editing these configuration files on Machine A, copy and paste the settings
from Machine B that you want to keep. In essence, you are manually merging the
configuration files together. Once you are satisfied the configuration files
have all the settings you want and need, you are ready to push out your changes
from the master machine.
### Method 2: Backup Push-Merge Approach
1. Choose a machine that will serve as the initial "master". You'll probably
want to choose the machine you use most and like its configuration
settings the best.
2. For each machine that isn't the "master" (i.e. "slaves"), back up all the
configuration files for each app that you want to sync. That's it for now.
However, there will be more work for you later.
#### Method 2 Example
Let's say we have two machines, A and B, and we want to sync our bash configuration
across the machines. We decide that Machine A will serve as our master.
Since A is our master, we only need to backup the bash configuration files on
Machine B:
##### Method 2: Sample backup commands for Machine B
```bash
mkdir ~/bash_backup
cp ~/.bash_profile ~/bash_backup/bash_profile.bak
cp ~/.bash_login ~/bash_backup/bash_login.bak
...plus any other bash config files you want to keep
```
If you have other machines you are syncing with the master, back those up, too.
## Step 3: Push Out the Configuration Files with Mackup
Now you are ready to use Mackup to push out the changes. You should have Mackup
already installed and the `.mackup.cfg` file in place according to the
instructions provided above. If not, do that before proceeding.
Run the following command on the master machine:
`mackup backup`
On each of the other "slave" machines, run:
`mackup restore`
If you used Method 1 in Step 2 above, you are done. You may discover
that you didn't quite merge the files exactly the way you wanted but don't
worry, that's why you created the configuration file backups. You can grab
snippets from these backup configuration files and add them in to the live
configuration files and then easily push the changes out to all your
machines using mackup.
If you used Method 2, you'll need to merge in new features over time. As you
discover features you need to add, you'll need to take the appropriate snippets
of configuration code from the backup configuration files you created and
insert them into the appropriate configuration file. Remember it does not matter
which machine's configuration file you update as these configuration files are
now shared across all machines.
================================================
FILE: doc/develop.md
================================================
# Develop
```sh
# Install the tool for dependency management and packaging in Python
pipx install uv
# You can now edit files and see the impact of your changes
uv run mackup --version
make test
```
## Running Tests with Coverage
To run tests with coverage reporting:
```sh
# Run tests with coverage
make coverage
# View coverage report in terminal
make coverage-report
# Open HTML coverage report
open htmlcov/index.html
```
## Code Quality Checks
The project includes several code quality tools:
```sh
# Run all checks (ruff, mypy, pytest)
make check
# Run individual checks
make ruff # Code linting
make mypy # Type checking
make test # Unit tests
make coverage # Tests with coverage
```
## Coverage Configuration
Coverage is configured in `pyproject.toml` with:
- Branch coverage enabled
- Test files excluded from coverage
- HTML and XML reports generated
- 67%+ coverage currently achieved
You can view detailed coverage reports by running `make coverage` and opening
`htmlcov/index.html` in your browser.
================================================
FILE: doc/release.md
================================================
# Release
1. Increment the version in [pyproject.toml](../pyproject.toml)
1. Run `uv sync -U`
1. `git commit` with the message `Mackup X.Y.Z`
1. `git tag <version>`
1. `git push`
1. `git push --tags`
1. Do a release at <https://github.com/lra/mackup/releases>
1. `make release`
================================================
FILE: doc/syncing-private-keys.md
================================================
# Syncing private keys
By default private keys for OpenSSH and GnuPG are NOT sycned.
You can sync your private keys if you want.
For example, to sync your entire OpenSSH `.ssh` directory,
create a `~/.mackup/ssh.cfg` file with the following content:
```ini
[application]
name = SSH
[configuration_files]
.ssh
```
================================================
FILE: pyproject.toml
================================================
[project]
name = "mackup"
version = "0.10.2"
description = "Backup and keep your application settings in sync."
readme = "README.md"
dependencies = [
"docopt-ng>=0.9.0",
]
requires-python = ">= 3.9"
authors = [
{ name = "Laurent Raufaste", email = "analogue@glop.org" }
]
license = "GPL-3.0-or-later"
license-files = ["LICENSE"]
classifiers = [
"Development Status :: 5 - Production/Stable",
"Environment :: Console",
"Intended Audience :: Developers",
"Intended Audience :: System Administrators",
"License :: OSI Approved :: GNU General Public License v3 or later (GPLv3+)",
"Operating System :: MacOS :: MacOS X",
"Operating System :: POSIX :: Linux",
"Programming Language :: Python :: 3",
"Programming Language :: Python :: 3.9",
"Programming Language :: Python :: 3.10",
"Programming Language :: Python :: 3.11",
"Programming Language :: Python :: 3.12",
"Programming Language :: Python :: 3.13",
"Programming Language :: Python :: 3.14",
"Programming Language :: Python :: 3 :: Only",
"Topic :: System :: Archiving :: Backup",
"Topic :: Utilities",
]
[project.scripts]
mackup = "mackup.main:main"
[project.urls]
Repository = "https://github.com/lra/mackup.git"
Issues = "https://github.com/lra/mackup/issues"
Changelog = "https://github.com/lra/mackup/releases"
[dependency-groups]
dev = [
"pytest>=8.4.2",
"pytest-cov>=6.0.0",
"coverage[toml]>=7.6.0",
"mypy>=1.13.0",
"ruff>=0.14.4",
"ty>=0.0.16",
]
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
[tool.mypy]
python_version = "3.9"
warn_return_any = true
warn_unused_configs = true
disallow_untyped_defs = true
disallow_incomplete_defs = true
check_untyped_defs = true
no_implicit_optional = true
warn_redundant_casts = true
warn_unused_ignores = true
warn_no_return = true
warn_unreachable = true
strict_equality = true
show_error_codes = true
[tool.coverage.run]
source = ["src/mackup"]
branch = true
omit = [
"*/tests/*",
"*/__pycache__/*",
"*/.venv/*",
]
[tool.coverage.report]
precision = 2
show_missing = true
skip_covered = false
exclude_lines = [
"pragma: no cover",
"def __repr__",
"raise AssertionError",
"raise NotImplementedError",
"if __name__ == .__main__.:",
"if TYPE_CHECKING:",
"class .*\\bProtocol\\):",
"@(abc\\.)?abstractmethod",
]
[tool.coverage.html]
directory = "htmlcov"
[tool.pytest]
strict = true
minversion = "9.0"
testpaths = ["tests"]
pythonpath = ["src"]
addopts = ["-ra"]
# https://docs.astral.sh/ruff/rules/
[tool.ruff.lint]
select = [
"A", # flake8-builtins
"ASYNC", # flake8-async
"B", # flake8-bugbear
"C4", # flake8-comprehensions
"C90", # mccabe
"COM", # flake8-commas
"DTZ", # flake8-datetimez
"E", # pycodestyle error
"EXE", # flake8-executable
"F", # pyflakes
"FA", # flake8-future-annotations
"FLY", # flynt, for f-strings
"FURB", # refurb
"G", # flake8-logging-format
"I", # isort
"ICN", # flake8-import-conventions
"INP", # flake8-no-pep420
"INT", # flake8-gettext
"N", # pep8-naming
"PERF", # perflint
"PIE", # flake8-pie
"PLC", # pylint convention
"PLE", # pylint error
"PLR", # pylint refactor
"PLW", # pylint warning
"PT", # flake8-pytest-style
"PYI", # flake8-pyi
"Q", # flake8-quotes
"RSE", # flake8-raise
"RUF", # ruff
"SIM", # flake8-simplify
"SLF", # flake8-self
"SLOT", # flake8-slots
"TCH", # flake8-type-checking
"TID", # flake8-tidy-imports
"UP", # pyupgrade
"W", # pycodestyle warning
]
ignore = [
"C901", # mccabe complexity - too complex functions
"FA100", # future annotations - would change behavior
"PLR0912", # too many branches
"PLR0915", # too many statements
"PTH", # use pathlib - os.path is fine for this codebase
"SIM115", # use context manager for open - some cases require this
"SLF001", # private member access - needed for testing
]
================================================
FILE: snap/snapcraft.yaml
================================================
name: mackup
base: core24
adopt-info: mackup
title: Mackup
summary: Keep your application settings in sync
description: |
Back ups your application settings in a safe directory (e.g. Dropbox).
Syncs your application settings among all your workstations.
Restores your configuration on any fresh install in one command line.
license: GPL-3.0-or-later
contact: analogue@glop.org
website: https://github.com/lra/mackup
source-code: https://github.com/lra/mackup
issues: https://github.com/lra/mackup/issues
grade: stable
confinement: classic
apps:
mackup:
command: bin/mackup
parts:
mackup:
plugin: python
source: .
stage-packages:
- python3.12-minimal
- libpython3.12-minimal
- libpython3.12-stdlib
override-pull: |
craftctl default
VERSION=$(python3 -c 'import tomllib; print(tomllib.load(open("pyproject.toml", "rb"))["project"]["version"])')
craftctl set version="$VERSION"
================================================
FILE: src/mackup/__init__.py
================================================
"""The Mackup Package."""
================================================
FILE: src/mackup/application.py
================================================
"""
Application Profile.
An Application Profile contains all the information about an application in
Mackup. Name, files, ...
"""
import os
from . import utils
from .mackup import Mackup
class ApplicationProfile:
"""Instantiate this class with application specific data."""
def __init__(
self, mackup: Mackup, files: set[str], dry_run: bool, verbose: bool,
) -> None:
"""
Create an ApplicationProfile instance.
Args:
mackup (Mackup)
files (list)
"""
assert isinstance(mackup, Mackup)
assert isinstance(files, set)
self.mackup: Mackup = mackup
self.files: list[str] = sorted(files)
self.dry_run: bool = dry_run
self.verbose: bool = verbose
def get_filepaths(self, filename: str) -> tuple[str, str]:
"""
Get home and mackup filepaths for given file
Args:
filename (str)
Returns:
home_filepath, mackup_filepath (str, str)
"""
return (
os.path.join(os.environ["HOME"], filename),
os.path.join(self.mackup.mackup_folder, filename),
)
def copy_files_to_mackup_folder(self) -> None:
"""
Backup the application config files to the Mackup folder.
Algorithm:
for config_file
if config_file exists and is a real file/folder
if home/file is a symlink pointing to mackup/file
skip (already backed up via link install)
if exists mackup/file
are you sure?
if sure
rm mackup/file
cp home/file mackup/file
"""
for filename in self.files:
(home_filepath, mackup_filepath) = self.get_filepaths(filename)
# If config_file exists and is a real file/folder
if (os.path.isfile(home_filepath) or os.path.isdir(home_filepath)):
# Check if home file is a symlink pointing to mackup file
# (already backed up via link install)
if (
os.path.islink(home_filepath)
and os.path.exists(mackup_filepath)
and os.path.samefile(home_filepath, mackup_filepath)
):
if self.verbose:
print(
f"Skipping {home_filepath}\n"
f" already linked to\n {mackup_filepath}",
)
continue
if self.verbose:
print(
f"Backing up\n {home_filepath}\n to\n {mackup_filepath} ...",
)
else:
print(f"Backing up {filename} ...")
if self.dry_run:
continue
# If exists mackup/file
if os.path.lexists(mackup_filepath):
# Name it right
file_type: str
if os.path.isfile(mackup_filepath):
file_type = "file"
elif os.path.isdir(mackup_filepath):
file_type = "folder"
elif os.path.islink(mackup_filepath):
file_type = "link"
else:
raise ValueError(f"Unsupported file: {mackup_filepath}")
# Ask the user if he really wants to replace it
if utils.confirm(
f"A {file_type} named {mackup_filepath} already exists in the"
" Mackup folder.\nAre you sure that you want to"
" replace it? (use --force to skip this prompt)",
):
# If confirmed, delete the file in Mackup
utils.delete(mackup_filepath)
else:
continue
# Copy the file
try:
utils.copy(home_filepath, mackup_filepath)
except PermissionError as e:
print(
f"Error: Unable to copy file from {home_filepath} to "
f"{mackup_filepath} due to permission issue: {e}",
)
def copy_files_from_mackup_folder(self) -> None:
"""
Recover the application config files from the Mackup folder.
Algorithm:
for config_file
if config_file exists in mackup and is a real file/folder
if exists home/file
are you sure?
if sure
rm home/file
cp mackup/file home/file
"""
for filename in self.files:
(home_filepath, mackup_filepath) = self.get_filepaths(filename)
# If config_file exists in mackup and is a real file/folder
if (os.path.isfile(mackup_filepath) or os.path.isdir(mackup_filepath)):
if self.verbose:
print(
f"Recovering\n {mackup_filepath}\n to\n {home_filepath} ...",
)
else:
print(f"Recovering {filename} ...")
if self.dry_run:
continue
# If exists home/file
if os.path.lexists(home_filepath):
# Name it right
if os.path.isfile(home_filepath):
file_type = "file"
elif os.path.isdir(home_filepath):
file_type = "folder"
elif os.path.islink(home_filepath):
file_type = "link"
else:
raise ValueError(f"Unsupported file: {home_filepath}")
# Ask the user if he really wants to replace it
if utils.confirm(
f"A {file_type} named {home_filepath} already exists in your"
" home folder.\nAre you sure that you want to"
" replace it?",
):
# If confirmed, delete the existing home file
utils.delete(home_filepath)
else:
continue
# Copy the file
try:
utils.copy(mackup_filepath, home_filepath)
except PermissionError as e:
print(
f"Error: Unable to copy file from {mackup_filepath} to "
f"{home_filepath} due to permission issue: {e}",
)
def link_install(self) -> None:
"""
Create the application config file links.
Algorithm:
if exists home/file
if home/file is a real file
if exists mackup/file
are you sure?
if sure
rm mackup/file
mv home/file mackup/file
link mackup/file home/file
else
mv home/file mackup/file
link mackup/file home/file
"""
# For each file used by the application
for filename in self.files:
(home_filepath, mackup_filepath) = self.get_filepaths(filename)
# If the file exists and is not already a link pointing to Mackup
if (os.path.isfile(home_filepath) or os.path.isdir(home_filepath)) and not (
os.path.islink(home_filepath)
and (os.path.isfile(mackup_filepath) or os.path.isdir(mackup_filepath))
and os.path.samefile(home_filepath, mackup_filepath)
):
if self.verbose:
print(
f"Backing up\n {home_filepath}\n to\n {mackup_filepath} ...",
)
else:
print(f"Linking {filename} ...")
if self.dry_run:
continue
# Check if we already have a backup
if os.path.exists(mackup_filepath):
# Name it right
if os.path.isfile(mackup_filepath):
file_type = "file"
elif os.path.isdir(mackup_filepath):
file_type = "folder"
elif os.path.islink(mackup_filepath):
file_type = "link"
else:
raise ValueError(f"Unsupported file: {mackup_filepath}")
# Ask the user if he really wants to replace it
if utils.confirm(
f"A {file_type} named {mackup_filepath} already exists in the"
" backup.\nAre you sure that you want to"
" replace it?",
):
# Delete the file in Mackup
utils.delete(mackup_filepath)
# Copy the file
utils.copy(home_filepath, mackup_filepath)
# Delete the file in the home
utils.delete(home_filepath)
# Link the backuped file to its original place
utils.link(mackup_filepath, home_filepath)
else:
# Copy the file
utils.copy(home_filepath, mackup_filepath)
# Delete the file in the home
utils.delete(home_filepath)
# Link the backuped file to its original place
utils.link(mackup_filepath, home_filepath)
elif self.verbose:
if os.path.exists(home_filepath):
print(
f"Doing nothing\n {home_filepath}\n "
f"is already backed up to\n {mackup_filepath}",
)
elif os.path.islink(home_filepath):
print(
f"Doing nothing\n {home_filepath}\n "
"is a broken link, you might want to fix it.",
)
else:
print(f"Doing nothing\n {home_filepath}\n does not exist")
def link(self) -> None:
"""
Link the application config files.
Algorithm:
if exists mackup/file
if exists home/file
are you sure?
if sure
rm home/file
link mackup/file home/file
else
link mackup/file home/file
"""
# For each file used by the application
for filename in self.files:
(home_filepath, mackup_filepath) = self.get_filepaths(filename)
# If the file exists and is not already pointing to the mackup file
# and the folder makes sense on the current platform (Don't sync
# any subfolder of ~/Library on GNU/Linux)
file_or_dir_exists: bool = os.path.isfile(mackup_filepath) or os.path.isdir(
mackup_filepath,
)
pointing_to_mackup: bool = (
os.path.islink(home_filepath)
and os.path.exists(mackup_filepath)
and os.path.samefile(mackup_filepath, home_filepath)
)
supported: bool = utils.can_file_be_synced_on_current_platform(filename)
if file_or_dir_exists and not pointing_to_mackup and supported:
if self.verbose:
print(
f"Restoring\n linking {home_filepath}\n"
f" to {mackup_filepath} ...",
)
else:
print(f"Restoring {filename} ...")
if self.dry_run:
continue
# Check if there is already a file in the home folder
if os.path.exists(home_filepath):
# Name it right
if os.path.isfile(home_filepath):
file_type = "file"
elif os.path.isdir(home_filepath):
file_type = "folder"
elif os.path.islink(home_filepath):
file_type = "link"
else:
raise ValueError(f"Unsupported file: {home_filepath}")
if utils.confirm(
f"You already have a {file_type} at {home_filepath}.\n"
"Do you want to replace it with your backup?",
):
utils.delete(home_filepath)
utils.link(mackup_filepath, home_filepath)
else:
utils.link(mackup_filepath, home_filepath)
elif self.verbose:
if os.path.exists(home_filepath):
print(
f"Doing nothing\n {mackup_filepath}\n"
f" already linked by\n {home_filepath}",
)
elif os.path.islink(home_filepath):
print(
f"Doing nothing\n {home_filepath}\n "
"is a broken link, you might want to fix it.",
)
else:
print(
f"Doing nothing\n {mackup_filepath}\n does not exist",
)
def link_uninstall(self) -> None:
"""
Removes links and copy config files from the remote folder locally.
Algorithm:
for each file in config
if mackup/file exists
if home/file exists
delete home/file
copy mackup/file home/file
"""
# For each file used by the application
for filename in self.files:
(home_filepath, mackup_filepath) = self.get_filepaths(filename)
# If the mackup file exists
if os.path.isfile(mackup_filepath) or os.path.isdir(mackup_filepath):
# Check if there is a corresponding file in the home folder
if os.path.exists(home_filepath):
# If the home file is not a link or does not point to the
# mackup file, display a warning and skip it.
if not os.path.islink(home_filepath) or not os.path.samefile(
home_filepath, mackup_filepath,
):
print(
f'Warning: the file in your home "{home_filepath}" '
f"does not point to the original file in Mackup "
f"{mackup_filepath}, skipping...",
)
continue
if self.verbose:
print(
f"Reverting {mackup_filepath}\n at {home_filepath} ...",
)
else:
print(f"Reverting {filename} ...")
if self.dry_run:
continue
# If there is, delete it as we are gonna copy the Dropbox
# one there
utils.delete(home_filepath)
# Copy the Dropbox file to the home folder
utils.copy(mackup_filepath, home_filepath)
elif self.verbose:
print(f"Doing nothing, {mackup_filepath} does not exist")
================================================
FILE: src/mackup/applications/1password-4.cfg
================================================
[application]
name = 1Password 4
[configuration_files]
Library/Preferences/com.agilebits.onepassword4.plist
Library/Preferences/ws.agile.1Password.plist
================================================
FILE: src/mackup/applications/2do.cfg
================================================
[application]
name = 2Do
[configuration_files]
Library/Preferences/com.guidedways.TodoMac.plist
================================================
FILE: src/mackup/applications/ack.cfg
================================================
[application]
name = Ack
[configuration_files]
.ackrc
================================================
FILE: src/mackup/applications/act.cfg
================================================
[application]
name = act
[configuration_files]
.actrc
================================================
FILE: src/mackup/applications/activitywatch.cfg
================================================
[application]
name = Activity Watch
[configuration_files]
Library/Application Support/activitywatch
================================================
FILE: src/mackup/applications/adium.cfg
================================================
[application]
name = Adium
[configuration_files]
Library/Application Support/Adium 2.0
Library/Preferences/com.adiumX.adiumX.plist
================================================
FILE: src/mackup/applications/adobe-camera-raw.cfg
================================================
[application]
name = Adobe Camera Raw
[configuration_files]
Library/Application Support/Adobe/CameraRaw
================================================
FILE: src/mackup/applications/aerc.cfg
================================================
[application]
name = aerc
[configuration_files]
Library/Preferences/aerc
================================================
FILE: src/mackup/applications/aerospace.cfg
================================================
[application]
name = aerospace
[configuration_files]
.aerospace.toml
[xdg_configuration_files]
aerospace/aerospace.toml
================================================
FILE: src/mackup/applications/affinity-designer.cfg
================================================
[application]
name = Affinity Designer
[configuration_files]
Library/Containers/Affinity Designer/Data/Library/Application Support/user
================================================
FILE: src/mackup/applications/affinity-photo.cfg
================================================
[application]
name = Affinity Photo
[configuration_files]
Library/Containers/Affinity Photo/Data/Library/Application Support/user
================================================
FILE: src/mackup/applications/affinity-publisher.cfg
================================================
[application]
name = Affinity Publisher
[configuration_files]
Library/Containers/Affinity Publisher/Data/Library/Application Support/user
================================================
FILE: src/mackup/applications/airflow.cfg
================================================
[application]
name = Airflow
[configuration_files]
Library/Preferences/com.bitcavehq.Airflow.plist
Library/Application Support/Airflow
================================================
FILE: src/mackup/applications/airmail.cfg
================================================
[application]
name = Airmail
[configuration_files]
Library/Containers/it.bloop.airmail2/Container.plist
================================================
FILE: src/mackup/applications/akamai-cli.cfg
================================================
[application]
name = Akamai-CLI
[configuration_files]
.edgerc
================================================
FILE: src/mackup/applications/alacritty.cfg
================================================
[application]
name = Alacritty
[configuration_files]
.alacritty.yml
.alacritty.toml
[xdg_configuration_files]
alacritty/alacritty.yml
alacritty/alacritty.toml
================================================
FILE: src/mackup/applications/aldente.cfg
================================================
[application]
name = AlDente
[configuration_files]
Library/Application Support/AlDente
Library/Preferences/com.apphousekitchen.aldente-pro.plist
================================================
FILE: src/mackup/applications/alt-tab.cfg
================================================
[application]
name = AltTab
[configuration_files]
Library/Preferences/com.lwouis.alt-tab-macos.plist
================================================
FILE: src/mackup/applications/amethyst.cfg
================================================
[application]
name = Amethyst
[configuration_files]
Library/Preferences/com.amethyst.Amethyst.plist
[xdg_configuration_files]
amethyst/amethyst.yml
================================================
FILE: src/mackup/applications/ancient-domains-of-mystery.cfg
================================================
[application]
name = Ancient Domains of Mystery
[configuration_files]
.adom.data
================================================
FILE: src/mackup/applications/androidstudio-13.cfg
================================================
[application]
name = Android Studio 1.3
[configuration_files]
Library/Application Support/AndroidStudio1.3
Library/Preferences/AndroidStudio1.3
================================================
FILE: src/mackup/applications/ansible.cfg
================================================
[application]
name = Ansible
[configuration_files]
.ansible
.ansible.cfg
================================================
FILE: src/mackup/applications/appcleaner.cfg
================================================
[application]
name = AppCleaner
[configuration_files]
Library/Preferences/net.freemacsoft.AppCleaner.plist
Library/Preferences/net.freemacsoft.AppCleaner-SmartDelete.plist
================================================
FILE: src/mackup/applications/appcode-2.cfg
================================================
[application]
name = AppCode 2
[configuration_files]
Library/Application Support/appCode20
Library/Preferences/appCode20
================================================
FILE: src/mackup/applications/appcode-3.cfg
================================================
[application]
name = AppCode 3
[configuration_files]
Library/Application Support/appCode30
Library/Preferences/appCode30
================================================
FILE: src/mackup/applications/appcode-31.cfg
================================================
[application]
name = AppCode 3.1
[configuration_files]
Library/Application Support/appCode31
Library/Preferences/appCode31
================================================
FILE: src/mackup/applications/appcode-32.cfg
================================================
[application]
name = AppCode 3.2
[configuration_files]
Library/Application Support/AppCode32
Library/Preferences/AppCode32
================================================
FILE: src/mackup/applications/apple-music.cfg
================================================
[application]
name = Apple Music
[configuration_files]
Library/Music/Scripts
Library/Preferences/com.apple.Music.eq.plist
Library/Preferences/com.apple.Music.plist
================================================
FILE: src/mackup/applications/apptivate.cfg
================================================
[application]
name = Apptivate
[configuration_files]
Library/Application Support/Apptivate/hotkeys
================================================
FILE: src/mackup/applications/arara.cfg
================================================
[application]
name = Arara
[configuration_files]
.araraconfig.yaml
araraconfig.yaml
================================================
FILE: src/mackup/applications/aria2c.cfg
================================================
[application]
name = aria2c
[configuration_files]
.aria2
[xdg_configuration_files]
aria2
================================================
FILE: src/mackup/applications/arm.cfg
================================================
[application]
name = Arm
[configuration_files]
.arm/armrc
================================================
FILE: src/mackup/applications/asciinema.cfg
================================================
[application]
name = asciinema
[xdg_configuration_files]
asciinema
================================================
FILE: src/mackup/applications/asdf.cfg
================================================
[application]
name = asdf
[configuration_files]
.asdfrc
.default-gems
.default-npm-packages
.default-python-packages
.default-golang-pkgs
.default-mix-commands
.tool-versions
================================================
FILE: src/mackup/applications/aspell.cfg
================================================
[application]
name = Aspell
[configuration_files]
.aspell.conf
.aspell.en.prepl
.aspell.en.pws
================================================
FILE: src/mackup/applications/astyle.cfg
================================================
[application]
name = Artistic Style
[configuration_files]
.astylerc
================================================
FILE: src/mackup/applications/atlantis.cfg
================================================
[application]
name = Atlantis
[configuration_files]
Library/Application Support/Atlantis
================================================
FILE: src/mackup/applications/atom.cfg
================================================
[application]
name = Atom
[configuration_files]
Library/Preferences/com.github.atom.plist
.atom/config.cson
.atom/init.coffee
.atom/keymap.cson
.atom/keymaps
.atom/snippets.cson
.atom/styles.less
================================================
FILE: src/mackup/applications/audacious.cfg
================================================
[application]
name = Audacious
[xdg_configuration_files]
audacious/config
audacious/plugin-registry
audacious/playlists
audacious/playlist-state
audacious/scrobbler.log
================================================
FILE: src/mackup/applications/auskey.cfg
================================================
[application]
name = AusKey
[configuration_files]
Library/Application Support/AUSkey/keystore.xml
================================================
FILE: src/mackup/applications/autokey.cfg
================================================
[application]
name = Autokey
[xdg_configuration_files]
autokey
================================================
FILE: src/mackup/applications/awareness.cfg
================================================
[application]
name = Awareness
[configuration_files]
Library/Preferences/com.futureproof.awareness.plist
================================================
FILE: src/mackup/applications/aws.cfg
================================================
[application]
name = AWS CLI
[configuration_files]
.aws
================================================
FILE: src/mackup/applications/azure.cfg
================================================
[application]
name = Azure CLI
[configuration_files]
.azure
================================================
FILE: src/mackup/applications/b-ryan_powerline-shell.cfg
================================================
[application]
name = Powerline Shell Prompt
[xdg_configuration_files]
powerline-shell/config.json
================================================
FILE: src/mackup/applications/bartender.cfg
================================================
[application]
name = Bartender
[configuration_files]
Library/Preferences/com.surteesstudios.Bartender.plist
Library/Preferences/com.surteesstudios.Bartender-setapp.plist
Library/Application Support/Bartender/Bartender.BartenderPreferences
================================================
FILE: src/mackup/applications/base.cfg
================================================
[application]
name = Base
[configuration_files]
Library/Containers/uk.co.menial.Base/Data/Library/Preferences/uk.co.menial.Base.plist
# contains license and preference state
Library/Containers/uk.co.menial.Base/Data/Library/Application Support/Base/
================================================
FILE: src/mackup/applications/bash-it.cfg
================================================
[application]
name = Bash it
[configuration_files]
.bash_it/enabled
================================================
FILE: src/mackup/applications/bash.cfg
================================================
[application]
name = Bash
[configuration_files]
.aliases
.bash_aliases
.bash_login
.bash_logout
.bashrc
.profile
.bash_profile
.inputrc
================================================
FILE: src/mackup/applications/bat.cfg
================================================
[application]
name = Bat
[xdg_configuration_files]
bat/config
bat/syntaxes
bat/themes
================================================
FILE: src/mackup/applications/bc.cfg
================================================
[application]
name = bc
[configuration_files]
.bcrc
================================================
FILE: src/mackup/applications/beatport-pro.cfg
================================================
[application]
name = Beatport Pro
[configuration_files]
Library/Preferences/com.beatport.BeatportPro.plist
================================================
FILE: src/mackup/applications/beets.cfg
================================================
[application]
name = Beets
[xdg_configuration_files]
beets/config.yaml
================================================
FILE: src/mackup/applications/bettersnaptool.cfg
================================================
[application]
name = BetterSnapTool
[configuration_files]
Library/Preferences/com.hegenberg.BetterSnapTool.plist
Library/Application Support/BetterSnapTool
================================================
FILE: src/mackup/applications/bettertouchtool.cfg
================================================
[application]
name = BetterTouchTool
[configuration_files]
Library/Application Support/BetterTouchTool/bettertouchtool.license
Library/Application Support/BetterTouchTool/btt_data_store.v2
Library/Application Support/BetterTouchTool/btt_data_store.v2-shm
Library/Application Support/BetterTouchTool/btt_data_store.v2-wal
Library/Application Support/BetterTouchTool/bttdata2
Library/Preferences/com.hegenberg.BetterTouchTool.plist
Library/Application Support/BetterTouchTool/bettersnaptool.bttlicense
================================================
FILE: src/mackup/applications/beyond-compare.cfg
================================================
[application]
name = Beyond Compare
[configuration_files]
Library/Preferences/com.ScooterSoftware.BeyondCompare.plist
Library/Application Support/Beyond Compare/BC4Key.txt
Library/Application Support/Beyond Compare/BCColors.xml
Library/Application Support/Beyond Compare/BCCommands.xml
Library/Application Support/Beyond Compare/BCPreferences.xml
================================================
FILE: src/mackup/applications/bibdesk.cfg
================================================
[application]
name = BibDesk
[configuration_files]
Library/Preferences/edu.ucsd.cs.mmccrack.bibdesk.plist
Library/Application Support/BibDesk
================================================
FILE: src/mackup/applications/billings-pro-server-admin.cfg
================================================
[application]
name = Billings Pro Server Admin
[configuration_files]
Library/Preferences/com.marketcircle.BillingsProServerAdmin.plist
================================================
FILE: src/mackup/applications/bitbar.cfg
================================================
[application]
name = BitBar
[configuration_files]
Library/Preferences/com.matryer.BitBar.plist
================================================
FILE: src/mackup/applications/bitchx.cfg
================================================
[application]
name = Bitchx
[configuration_files]
.bitchxrc
.ircservers
================================================
FILE: src/mackup/applications/blackfire.cfg
================================================
[application]
name = Blackfire
[configuration_files]
.blackfire.ini
================================================
FILE: src/mackup/applications/blender.cfg
================================================
[application]
name = Blender
[configuration_files]
Library/Application Support/Blender
[xdg_configuration_files]
blender
================================================
FILE: src/mackup/applications/blesh.cfg
================================================
[application]
name = ble.sh
[configuration_files]
.blerc
================================================
FILE: src/mackup/applications/boto.cfg
================================================
[application]
name = Boto
[configuration_files]
.boto
================================================
FILE: src/mackup/applications/boxer.cfg
================================================
[application]
name = Boxer
[configuration_files]
Library/Preferences/net.washboardabs.boxer.plist
Applications/DOS Games
================================================
FILE: src/mackup/applications/brackets.cfg
================================================
[application]
name = Brackets
[configuration_files]
Library/Application Support/Brackets
Library/Preferences/io.brackets.appshell.plist
================================================
FILE: src/mackup/applications/brave.cfg
================================================
[application]
name = Brave
[configuration_files]
Library/Application Support/BraveSoftware/Brave-Browser/Default/Preferences
================================================
FILE: src/mackup/applications/btop.cfg
================================================
[application]
name = btop
[xdg_configuration_files]
btop
================================================
FILE: src/mackup/applications/bump.cfg
================================================
[application]
name = Bump
[configuration_files]
.bump.json
================================================
FILE: src/mackup/applications/bundler.cfg
================================================
[application]
name = Bundler
[configuration_files]
.bundle/config
================================================
FILE: src/mackup/applications/byobu.cfg
================================================
[application]
name = Byobu
[configuration_files]
.byobu/.screenrc
.byobu/.tmux.conf
.byobu/backend
.byobu/color
.byobu/color.tmux
.byobu/datetime.tmux
.byobu/keybindings
.byobu/keybindings.tmux
.byobu/profile
.byobu/profile.tmux
.byobu/prompt
.byobu/prompt.tmux
.byobu/status
.byobu/statusrc
.byobu/windows
.byobu/windows.tmux
.byoburc
.byoburc.tmux
.byoburc.screen
================================================
FILE: src/mackup/applications/caffeine.cfg
================================================
[application]
name = Caffeine
[configuration_files]
Library/Preferences/com.lightheadsw.Caffeine.plist
Library/Preferences/com.intelliscapesolutions.caffeine.plist
================================================
FILE: src/mackup/applications/calibre.cfg
================================================
[application]
name = Calibre
[configuration_files]
Library/Preferences/calibre
[xdg_configuration_files]
calibre
================================================
FILE: src/mackup/applications/capture-one.cfg
================================================
[application]
name = Capture One
[configuration_files]
Library/Application Support/Capture One
================================================
FILE: src/mackup/applications/cartographica.cfg
================================================
[application]
name = Cartographica
[configuration_files]
Library/Application Support/Cartographica
Library/Preferences/com.ClueTrust.Cartographica.plist
================================================
FILE: src/mackup/applications/cerebro.cfg
================================================
[application]
name = Cerebro
[configuration_files]
Library/Application Support/Cerebro/config.json
Library/Application Support/Cerebro/plugins
[xdg_configuration_files]
Cerebro/config.json
Cerebro/plugins
================================================
FILE: src/mackup/applications/charles.cfg
================================================
[application]
name = Charles
[configuration_files]
Library/Application Support/Charles
Library/Preferences/com.xk72.charles.config
================================================
FILE: src/mackup/applications/cheat.cfg
================================================
[application]
name = Cheat
[configuration_files]
.cheat
[xdg_configuration_files]
cheat/conf.yml
================================================
FILE: src/mackup/applications/chef.cfg
================================================
[application]
name = Chef
[configuration_files]
.chef
================================================
FILE: src/mackup/applications/chicken.cfg
================================================
[application]
name = Chicken
[configuration_files]
Library/Preferences/net.sourceforge.chicken.plist
================================================
FILE: src/mackup/applications/choosy.cfg
================================================
[application]
name = Choosy
[configuration_files]
Library/Application Support/Choosy/behaviours.plist
================================================
FILE: src/mackup/applications/chunkwm.cfg
================================================
[application]
name = chunkwm
[configuration_files]
.chunkwmrc
.chunkwm_plugins
================================================
FILE: src/mackup/applications/cider.cfg
================================================
[application]
name = Cider
[configuration_files]
.cider
================================================
FILE: src/mackup/applications/clashx.cfg
================================================
[application]
name = ClashX
[xdg_configuration_files]
clash
================================================
FILE: src/mackup/applications/clasp.cfg
================================================
[application]
name = Clasp
[configuration_files]
.clasprc.json
================================================
FILE: src/mackup/applications/claude-code.cfg
================================================
[application]
name = Claude Code
[configuration_files]
.claude/agents
.claude/CLAUDE.md
.claude/hooks
.claude/keybindings.json
.claude/plugins/blocklist.json
.claude/plugins/config.json
.claude/plugins/installed_plugins.json
.claude/plugins/known_marketplaces.json
.claude/settings.json
.claude/skills
.claude/statusline.sh
================================================
FILE: src/mackup/applications/cleanshot.cfg
================================================
[application]
name = CleanShot
[configuration_files]
Library/Preferences/com.getcleanshot.app-setapp.plist
Library/Preferences/pl.maketheweb.cleanshotx.plist
================================================
FILE: src/mackup/applications/clementine.cfg
================================================
[application]
name = Clementine
[configuration_files]
Library/Preferences/org.clementine-player.Clementine.plist
================================================
FILE: src/mackup/applications/clion.cfg
================================================
[application]
name = CLion
[configuration_files]
Library/Preferences/CLion2016.2
Library/Application Support/CLion2016.2
Library/Application Support/JetBrains/CLion2023.1
Library/Application Support/JetBrains/CLion2023.2
================================================
FILE: src/mackup/applications/clipmenu.cfg
================================================
[application]
name = ClipMenu
[configuration_files]
Library/Application Support/ClipMenu
Library/Preferences/com.naotaka.ClipMenu.plist
================================================
FILE: src/mackup/applications/clipy.cfg
================================================
[application]
name = Clipy
[configuration_files]
Library/Preferences/com.clipy-app.Clipy.plist
================================================
FILE: src/mackup/applications/cloudapp.cfg
================================================
[application]
name = CloudApp
[configuration_files]
Library/Preferences/com.linebreak.CloudAppMacOSX.plist
================================================
FILE: src/mackup/applications/coda-2.cfg
================================================
[application]
name = Coda 2
[configuration_files]
Library/Application Support/Coda 2
Library/Preferences/com.panic.Coda2.plist
================================================
FILE: src/mackup/applications/codex.cfg
================================================
[application]
name = Codex
[configuration_files]
.codex/config.toml
.codex/auth.json
.codex/AGENTS.md
================================================
FILE: src/mackup/applications/colloquy.cfg
================================================
[application]
name = Colloquy
[configuration_files]
Library/Preferences/info.colloquy.plist
Library/Application Support/Colloquy
================================================
FILE: src/mackup/applications/colorschemer-studio-2.cfg
================================================
[application]
name = ColorSchemer Studio 2
[configuration_files]
Library/Preferences/com.colorschemer.studio2.plist
Library/Application Support/ColorSchemer
================================================
FILE: src/mackup/applications/colorslurp.cfg
================================================
[application]
name = ColorSlurp
[configuration_files]
Library/Preferences/com.IdeaPunch.ColorSlurp.plist
Library/Containers/com.IdeaPunch.ColorSlurp/Data/Library/Application Support/default.realm
================================================
FILE: src/mackup/applications/colorsync.cfg
================================================
[application]
name = ColorSync
[configuration_files]
Library/ColorSync/Profiles
================================================
FILE: src/mackup/applications/composer.cfg
================================================
[application]
name = composer
[configuration_files]
.composer/auth.json
.composer/config.json
.composer/composer.json
================================================
FILE: src/mackup/applications/concentrate.cfg
================================================
[application]
name = Concentrate
[configuration_files]
Library/Application Support/Concentrate/Concentrate.sqlite3
================================================
FILE: src/mackup/applications/conky.cfg
================================================
[application]
name = Conky
[configuration_files]
.conkyrc
================================================
FILE: src/mackup/applications/consular.cfg
================================================
[application]
name = Consular
[configuration_files]
.consularc
[xdg_configuration_files]
consular
================================================
FILE: src/mackup/applications/contexts.cfg
================================================
[application]
name = Contexts
[configuration_files]
Library/Preferences/com.contextsformac.Contexts.plist
================================================
FILE: src/mackup/applications/controlplane.cfg
================================================
[application]
name = ControlPlane
[configuration_files]
Library/Preferences/com.dustinrue.ControlPlane.plist
================================================
FILE: src/mackup/applications/copyq.cfg
================================================
[application]
name = CopyQ
[xdg_configuration_files]
copyq
================================================
FILE: src/mackup/applications/cord.cfg
================================================
[application]
name = CoRD
[configuration_files]
Library/Application Support/CoRD
================================================
FILE: src/mackup/applications/coteditor.cfg
================================================
[application]
name = CotEditor
[configuration_files]
Library/Application Support/CotEditor
Library/Preferences/com.coteditor.CotEditor.plist
================================================
FILE: src/mackup/applications/ctags.cfg
================================================
[application]
name = Ctags
[configuration_files]
.ctags
.ctags.d
================================================
FILE: src/mackup/applications/curl.cfg
================================================
[application]
name = Curl
[configuration_files]
.netrc
.curlrc
================================================
FILE: src/mackup/applications/cursor.cfg
================================================
[application]
name = Cursor
[configuration_files]
Library/Application Support/Cursor/User/snippets
Library/Application Support/Cursor/User/keybindings.json
Library/Application Support/Cursor/User/settings.json
[xdg_configuration_files]
Cursor/User/snippets
Cursor/User/keybindings.json
Cursor/User/settings.json
================================================
FILE: src/mackup/applications/cvim.cfg
================================================
[application]
name = cVim
[configuration_files]
.cvimrc
================================================
FILE: src/mackup/applications/cyberduck.cfg
================================================
[application]
name = Cyberduck
[configuration_files]
# based on https://trac.cyberduck.io/wiki/help/en/faq#Preferencesandapplicationsupportfileslocation
Library/Application Support/Cyberduck
Library/Containers/ch.sudo.cyberduck/Data/Library/Application Support/Cyberduck
Library/Group Containers/G69SCX94XU.duck/Library/Application Support/duck
Library/Preferences/ch.sudo.cyberduck.plist
================================================
FILE: src/mackup/applications/daisydisk.cfg
================================================
[application]
name = DaisyDisk
[configuration_files]
Library/Application Support/DaisyDisk/License.DaisyDisk
Library/Preferences/com.daisydiskapp.DaisyDiskStandAlone.plist
================================================
FILE: src/mackup/applications/dash.cfg
================================================
[application]
name = Dash
[configuration_files]
Library/Application Support/Dash/library.dash
Library/Application Support/Dash/License/license.dash-license
Library/Preferences/com.kapeli.dash.plist
Library/Preferences/com.kapeli.dashdoc.plist
================================================
FILE: src/mackup/applications/datagrip.cfg
================================================
[application]
name = DataGrip
[configuration_files]
Library/Application Support/DataGrip2017.3
Library/Preferences/DataGrip2017.3
Library/Application Support/DataGrip2018.1
Library/Preferences/DataGrip2018.1
Library/Application Support/DataGrip2018.2
Library/Preferences/DataGrip2018.2
Library/Application Support/DataGrip2018.3
Library/Preferences/DataGrip2018.3
Library/Application Support/DataGrip2019.1
Library/Preferences/DataGrip2019.1
Library/Preferences/DataGrip2019.2
Library/Application Support/JetBrains/DataGrip2023.1
Library/Application Support/JetBrains/DataGrip2023.2
================================================
FILE: src/mackup/applications/day-o.cfg
================================================
[application]
name = Day-O
[configuration_files]
Library/Preferences/com.shauninman.Day-O.plist
================================================
FILE: src/mackup/applications/dbeaver.cfg
================================================
[application]
name = DBeaver
[configuration_files]
Library/DBeaverData/workspace6/.metadata/.plugins/org.eclipse.core.runtime/.settings
Library/DBeaverData/workspace6/General
================================================
FILE: src/mackup/applications/dbvisualizer.cfg
================================================
[application]
name = DbVisualizer
[configuration_files]
.dbvis
================================================
FILE: src/mackup/applications/deal-alert.cfg
================================================
[application]
name = Deal Alert
[configuration_files]
Library/Preferences/com.LittleFin.DealAlert.plist
================================================
FILE: src/mackup/applications/deepin-dde-dock.cfg
================================================
[application]
name = deepin-dde-dock
[xdg_configuration_files]
deepin/dde-dock.conf
================================================
FILE: src/mackup/applications/deepin-dde-file-manager.cfg
================================================
[application]
name = deepin-dde-file-manager
[xdg_configuration_files]
deepin/dde-file-manager.json
================================================
FILE: src/mackup/applications/deepin-terminal.cfg
================================================
[application]
name = deepin-terminal
[xdg_configuration_files]
deepin/deepin-terminal/config.conf
================================================
FILE: src/mackup/applications/default-folder-x.cfg
================================================
[application]
name = Default Folder X
[configuration_files]
Library/Preferences/com.stclairsoft.DefaultFolderX.favorites.plist
Library/Preferences/com.stclairsoft.DefaultFolderX.plist
Library/Preferences/com.stclairsoft.DefaultFolderX.settings.plist
================================================
FILE: src/mackup/applications/defaultkeybinding.cfg
================================================
[application]
name = DefaultKeyBinding
[configuration_files]
Library/KeyBindings/DefaultKeyBinding.dict
================================================
FILE: src/mackup/applications/devilspie.cfg
================================================
[application]
name = Devil's Pie
[configuration_files]
.devilspie
================================================
FILE: src/mackup/applications/devilspie2.cfg
================================================
[application]
name = Devilspie2
[xdg_configuration_files]
devilspie2
================================================
FILE: src/mackup/applications/dig.cfg
================================================
[application]
name = dig
[configuration_files]
.digrc
================================================
FILE: src/mackup/applications/divvy.cfg
================================================
[application]
name = Divvy
[configuration_files]
Library/Preferences/com.mizage.direct.Divvy.plist
Library/Preferences/com.mizage.Divvy.plist
================================================
FILE: src/mackup/applications/docker.cfg
================================================
[application]
name = Docker
[configuration_files]
.docker/config.json
.docker/daemon.json
================================================
FILE: src/mackup/applications/dolphin.cfg
================================================
[application]
name = Dolphin
[configuration_files]
Library/Application Support/Dolphin
Library/Preferences/org.dolphin-emu.dolphin.plist
================================================
FILE: src/mackup/applications/doom-emacs.cfg
================================================
[application]
name = Doom Emacs
[configuration_files]
.doom.d
[xdg_configuration_files]
doom
================================================
FILE: src/mackup/applications/doublecmd.cfg
================================================
[application]
name = Double Commander
[xdg_configuration_files]
doublecmd/wfx.ini
doublecmd/doublecmd.ext
doublecmd/shortcuts.scf
doublecmd/doublecmd.xml
================================================
FILE: src/mackup/applications/doxie.cfg
================================================
[application]
name = Doxie
[configuration_files]
Library/Preferences/com.getdoxie.doxie.plist
================================================
FILE: src/mackup/applications/dozer.cfg
================================================
[application]
name = Dozer
[configuration_files]
Library/Preferences/com.mortennn.Dozer.plist
================================================
FILE: src/mackup/applications/draft.cfg
================================================
[application]
name = Draft
[configuration_files]
.draft/config.toml
================================================
FILE: src/mackup/applications/droplr.cfg
================================================
[application]
name = Droplr
[configuration_files]
Library/Preferences/com.droplr.droplr-mac.plist
================================================
FILE: src/mackup/applications/dropzone.cfg
================================================
[application]
name = Dropzone 3
[configuration_files]
Library/Application Support/Dropzone 3
Library/Preferences/com.aptonic.Dropzone3.plist
================================================
FILE: src/mackup/applications/drush.cfg
================================================
[application]
name = Drush
[configuration_files]
.drush
================================================
FILE: src/mackup/applications/editorconfig.cfg
================================================
[application]
name = EditorConfig
[configuration_files]
.editorconfig
================================================
FILE: src/mackup/applications/electrum.cfg
================================================
[application]
name = Electrum
[configuration_files]
.electrum/config
================================================
FILE: src/mackup/applications/emacs.cfg
================================================
[application]
name = Emacs
[configuration_files]
.emacs
.emacs.d
[xdg_configuration_files]
emacs
================================================
FILE: src/mackup/applications/enjoyable.cfg
================================================
[application]
name = Enjoyable
[configuration_files]
Library/Preferences/com.yukkurigames.Enjoyable.plist
================================================
FILE: src/mackup/applications/environmental-station-alpha.cfg
================================================
[application]
name = Environmental Station Alpha
[configuration_files]
Library/Application Support/MMFApplications
================================================
FILE: src/mackup/applications/eqmac-2.cfg
================================================
[application]
name = eqMac2
[configuration_files]
Library/Preferences/com.bitgapp.eqMac2.plist
================================================
FILE: src/mackup/applications/eslint.cfg
================================================
[application]
name = ESLint
[configuration_files]
.eslintrc.js
.eslintrc.yaml
.eslintrc.yml
.eslintrc.json
.eslintrc
.eslintignore
================================================
FILE: src/mackup/applications/espanso.cfg
================================================
[application]
name = espanso
[configuration_files]
Library/Preferences/espanso
Library/Application Support/espanso
[xdg_configuration_files]
espanso
================================================
FILE: src/mackup/applications/exercism.cfg
================================================
[application]
name = Exercism
[configuration_files]
.exercism
.exercism.json
[xdg_configuration_files]
exercism
================================================
FILE: src/mackup/applications/expandrive.cfg
================================================
[application]
name = ExpanDrive
[configuration_files]
Library/Application Support/ExpanDrive
Preferences/com.expandrive.ExpanDrive2.plist
Preferences/com.expandrive.ExpanDrive3.plist
================================================
FILE: src/mackup/applications/factorio.cfg
================================================
[application]
name = Factorio
[configuration_files]
Library/Application Support/factorio/config
Library/Application Support/factorio/mods
Library/Application Support/factorio/saves
Library/Application Support/factorio/player-data.json
Library/Application Support/factorio/blueprint-storage.dat
================================================
FILE: src/mackup/applications/factory-droid.cfg
================================================
[application]
name = Factory Droid
[configuration_files]
.factory/commands
.factory/droids
.factory/AGENTS.md
.factory/config.json
.factory/settings.json
.factory/auth.json
.factory/mcp.json
================================================
FILE: src/mackup/applications/fantastical.cfg
================================================
[application]
name = Fantastical
[configuration_files]
# Used by Fantastical 1 only.
Library/Preferences/com.flexibits.fantastical.plist
# Used by Fantastical 2 only.
Library/Containers/com.flexibits.fantastical2.mac/Container.plist
================================================
FILE: src/mackup/applications/fasd.cfg
================================================
[application]
name = fasd
[configuration_files]
.fasd
.fasdrc
================================================
FILE: src/mackup/applications/fastlane.cfg
================================================
[application]
name = fastlane
[configuration_files]
.fastlane/completions
================================================
FILE: src/mackup/applications/fastscripts.cfg
================================================
[application]
name = FastScripts
[configuration_files]
Library/Preferences/com.red-sweater.fastscripts.plist
Library/Application Support/FastScripts
================================================
FILE: src/mackup/applications/feeds.cfg
================================================
[application]
name = Feeds
[configuration_files]
Library/Preferences/com.feedsapp.Feeds.plist
================================================
FILE: src/mackup/applications/filezilla.cfg
================================================
[application]
name = FileZilla
[configuration_files]
.filezilla
[xdg_configuration_files]
filezilla/filezilla.xml
filezilla/layout.xml
filezilla/sitemanager.xml
================================================
FILE: src/mackup/applications/finicky.cfg
================================================
[application]
name = finicky
[configuration_files]
.finicky.js
================================================
FILE: src/mackup/applications/fish.cfg
================================================
[application]
name = Fish
[xdg_configuration_files]
fish/config.fish
fish/conf.d
fish/fish_variables
fish/functions
fish/completions
================================================
FILE: src/mackup/applications/fisher.cfg
================================================
[application]
name = Fisher
[xdg_configuration_files]
fish/fish_plugins
================================================
FILE: src/mackup/applications/flake8.cfg
================================================
[application]
name = flake8
[configuration_files]
.flake8
[xdg_configuration_files]
flake8
================================================
FILE: src/mackup/applications/flameshot.cfg
================================================
[application]
name = Flameshot
[xdg_configuration_files]
flameshot/flameshot.ini
================================================
FILE: src/mackup/applications/flexget.cfg
================================================
[application]
name = FlexGet
[configuration_files]
.flexget/config.yml
[xdg_configuration_files]
flexget/config.yml
================================================
FILE: src/mackup/applications/flux.cfg
================================================
[application]
name = Flux
[configuration_files]
Library/Preferences/org.herf.Flux.plist
================================================
FILE: src/mackup/applications/focus.cfg
================================================
[application]
name = Focus
[configuration_files]
Library/Application Support/Focus/default.cfg
================================================
FILE: src/mackup/applications/fontconfig.cfg
================================================
[application]
name = Fontconfig
[xdg_configuration_files]
fontconfig
================================================
FILE: src/mackup/applications/fontexplorer-x.cfg
================================================
[application]
name = FontExplorer X
[configuration_files]
Library/Application Support/Linotype/FontExplorer X
FontExplorer X
================================================
FILE: src/mackup/applications/forge.cfg
================================================
[application]
name = Forge
[configuration_files]
Library/Application Support/Forge
================================================
FILE: src/mackup/applications/fork.cfg
================================================
[application]
name = Fork
[configuration_files]
Library/Application Support/com.DanPristupov.Fork/custom-commands.json
Library/Preferences/com.DanPristupov.Fork.plist
================================================
FILE: src/mackup/applications/forklift.cfg
================================================
[application]
name = ForkLift
[configuration_files]
Library/Preferences/com.binarynights.ForkLift2.plist
Library/Preferences/com.binarynights.ForkLift-3.plist
Library/Application Support/ForkLift/Favorites/Favorites.json
================================================
FILE: src/mackup/applications/franz.cfg
================================================
[application]
name = Franz
[configuration_files]
Library/Application Support/Franz/settings
[xdg_configuration_files]
Franz/settings
================================================
FILE: src/mackup/applications/gasmask.cfg
================================================
[application]
name = Gas Mask
[configuration_files]
Library/Gas Mask
Library/Preferences/ee.clockwise.gmask.plist
================================================
FILE: src/mackup/applications/gdb.cfg
================================================
[application]
name = gdb
[configuration_files]
.gdbinit
================================================
FILE: src/mackup/applications/gearplayer.cfg
================================================
[application]
name = Gear Player
[configuration_files]
Library/Preferences/com.treasurebox.gear.plist
Library/Preferences/com.treasurebox.magickeys.plist
Library/Application Support/Gear Player/paddata.padl
================================================
FILE: src/mackup/applications/geektool.cfg
================================================
[application]
name = GeekTool
[configuration_files]
Library/Preferences/org.tynsoe.GeekTool.plist
Library/Preferences/org.tynsoe.geeklet.file.plist
Library/Preferences/org.tynsoe.geeklet.image.plist
Library/Preferences/org.tynsoe.geeklet.shell.plist
Library/Preferences/org.tynsoe.geeklet.web.plist
Library/Preferences/org.tynsoe.geektool3.plist
================================================
FILE: src/mackup/applications/ghci.cfg
================================================
[application]
name = ghci
[configuration_files]
.ghci
================================================
FILE: src/mackup/applications/ghidra.cfg
================================================
[application]
name = Ghidra
[configuration_files]
.ghidra
================================================
FILE: src/mackup/applications/ghostty.cfg
================================================
[application]
name = Ghostty
[xdg_configuration_files]
ghostty/config
================================================
FILE: src/mackup/applications/ghostwriter.cfg
================================================
[application]
name = Ghostwriter
[xdg_configuration_files]
ghostwriter
================================================
FILE: src/mackup/applications/gimp.cfg
================================================
[application]
name = gimp
[configuration_files]
.gimp/colorrc
.gimp/contextrc
.gimp/controllerrc
.gimp/devicerc
.gimp/dockrc
.gimp/gimprc
.gimp/gtkrc
.gimp/menurc
.gimp/parasiterc
.gimp/pluginrc
.gimp/profilerc
.gimp/sessionrc
.gimp/templaterc
.gimp/themerc
.gimp/toolrc
.gimp/unitrc
Library/Application Support/GIMP/2.8/colorrc
Library/Application Support/GIMP/2.8/contextrc
Library/Application Support/GIMP/2.8/controllerrc
Library/Application Support/GIMP/2.8/devicerc
Library/Application Support/GIMP/2.8/dockrc
Library/Application Support/GIMP/2.8/gimprc
Library/Application Support/GIMP/2.8/gtkrc
Library/Application Support/GIMP/2.8/menurc
Library/Application Support/GIMP/2.8/parasiterc
Library/Application Support/GIMP/2.8/pluginrc
Library/Application Support/GIMP/2.8/profilerc
Library/Application Support/GIMP/2.8/sessionrc
Library/Application Support/GIMP/2.8/templaterc
Library/Application Support/GIMP/2.8/themerc
Library/Application Support/GIMP/2.8/toolrc
Library/Application Support/GIMP/2.8/unitrc
Library/Application Support/GIMP/2.10/colorrc
Library/Application Support/GIMP/2.10/contextrc
Library/Application Support/GIMP/2.10/controllerrc
Library/Application Support/GIMP/2.10/devicerc
Library/Application Support/GIMP/2.10/dockrc
Library/Application Support/GIMP/2.10/gimprc
Library/Application Support/GIMP/2.10/gtkrc
Library/Application Support/GIMP/2.10/menurc
Library/Application Support/GIMP/2.10/parasiterc
Library/Application Support/GIMP/2.10/pluginrc
Library/Application Support/GIMP/2.10/profilerc
Library/Application Support/GIMP/2.10/sessionrc
Library/Application Support/GIMP/2.10/templaterc
Library/Application Support/GIMP/2.10/themerc
Library/Application Support/GIMP/2.10/toolrc
Library/Application Support/GIMP/2.10/unitrc
================================================
FILE: src/mackup/applications/git-hooks.cfg
================================================
[application]
name = Git Hooks
[configuration_files]
.git_hooks
================================================
FILE: src/mackup/applications/git.cfg
================================================
[application]
name = Git
[configuration_files]
.gitconfig
[xdg_configuration_files]
git/config
git/ignore
git/attributes
================================================
FILE: src/mackup/applications/gitbox.cfg
================================================
[application]
name = Gitbox
[configuration_files]
Library/Preferences/com.oleganza.gitbox.plist
================================================
FILE: src/mackup/applications/gitfox.cfg
================================================
[application]
name = GitFox
[configuration_files]
Library/Preferences/com.bytieful.Gitfox.plist
Library/Preferences/com.bytieful.Gitfox-retail.plist
Library/Preferences/com.bytieful.Gitfox-setapp.plist
================================================
FILE: src/mackup/applications/github-cli.cfg
================================================
[application]
name = GitHub CLI
[xdg_configuration_files]
gh/config.yml
================================================
FILE: src/mackup/applications/gitkraken.cfg
================================================
[application]
name = GitKraken
[configuration_files]
.gitkraken
Library/Preferences/com.axosoft.gitkraken.plist
================================================
FILE: src/mackup/applications/gitup.cfg
================================================
[application]
name = GitUp
[configuration_files]
Library/Preferences/co.gitup.mac.plist
================================================
FILE: src/mackup/applications/gmail-notifr.cfg
================================================
[application]
name = Gmail Notifr
[configuration_files]
Library/Preferences/com.ashchan.GmailNotifr.plist
================================================
FILE: src/mackup/applications/gmailctl.cfg
================================================
[application]
name = gmailctl
[configuration_files]
.gmailctl/config.jsonnet
.gmailctl/credentials.json
.gmailctl/gmailctl.libsonnet
================================================
FILE: src/mackup/applications/gmvault.cfg
================================================
[application]
name = GMVault
[configuration_files]
.gmvault/gmvault_defaults.conf
================================================
FILE: src/mackup/applications/gnu-stow.cfg
================================================
[application]
name = GNU Stow
[configuration_files]
.stowrc
.stow-global-ignore
================================================
FILE: src/mackup/applications/gnupg.cfg
================================================
[application]
name = GnuPG
[configuration_files]
.gnupg/gpg-agent.conf
.gnupg/gpg.conf
.gnupg/trustdb.gpg
================================================
FILE: src/mackup/applications/go2shell.cfg
================================================
[application]
name = Go2Shell
[configuration_files]
Library/Preferences/com.zipzapmac.Go2Shell.plist
================================================
FILE: src/mackup/applications/goku.cfg
================================================
[application]
name = Goku
[xdg_configuration_files]
karabiner.edn
================================================
FILE: src/mackup/applications/goland.cfg
================================================
[application]
name = GoLand
[configuration_files]
Library/Application Support/Gogland1.0
Library/Application Support/GoLand2017.3
Library/Application Support/GoLand2018.1
Library/Application Support/GoLand2018.2
Library/Application Support/GoLand2018.3
Library/Application Support/GoLand2019.2
Library/Preferences/com.jetbrains.gogland-EAP.plist
Library/Preferences/Gogland1.0
Library/Preferences/GoLand2017.3
Library/Preferences/GoLand2018.1
Library/Preferences/GoLand2018.2
Library/Preferences/GoLand2018.3
Library/Preferences/GoLand2019.2
Library/Application Support/JetBrains/GoLand2023.1
Library/Application Support/JetBrains/GoLand2023.2
================================================
FILE: src/mackup/applications/goldendict.cfg
================================================
[application]
name = Goldendict
[configuration_files]
.goldendict/config
================================================
FILE: src/mackup/applications/goodsync.cfg
================================================
[application]
name = GoodSync
[configuration_files]
.goodsync
================================================
FILE: src/mackup/applications/goshare.cfg
================================================
[application]
name = GoShare
[xdg_configuration_files]
dictget/goshare
================================================
FILE: src/mackup/applications/gradle.cfg
================================================
[application]
name = Gradle
[configuration_files]
.gradle/gradle.properties
.gradle/init.gradle
.gradle/init.d
================================================
FILE: src/mackup/applications/grandtotal-3.cfg
================================================
[application]
name = GrandTotal 3
[configuration_files]
Library/Application Support/GrandTotal/AddressBook.plist
Library/Preferences/com.mediaatelier.GrandTotal3.plist
================================================
FILE: src/mackup/applications/grsync.cfg
================================================
[application]
name = grsync
[configuration_files]
.grsync/grsync.ini
================================================
FILE: src/mackup/applications/gstm.cfg
================================================
[application]
name = Gnome SSH Tunnel Manager
[configuration_files]
.gSTM
================================================
FILE: src/mackup/applications/hammerspoon.cfg
================================================
[application]
name = Hammerspoon
[configuration_files]
.hammerspoon
================================================
FILE: src/mackup/applications/handbrake.cfg
================================================
[application]
name = HandBrake
[configuration_files]
Library/Containers/fr.handbrake.HandBrake/Data/Library/Application Support/HandBrake/UserPresets.json
================================================
FILE: src/mackup/applications/hands-off.cfg
================================================
[application]
name = Hands Off!
[configuration_files]
Library/Preferences/com.metakine.handsoff.plist
================================================
FILE: src/mackup/applications/hazel.cfg
================================================
[application]
name = Hazel
[configuration_files]
Library/Application Support/Hazel
Library/Preferences/com.noodlesoft.Hazel.plist
================================================
FILE: src/mackup/applications/hero-lab.cfg
================================================
[application]
name = Hero Lab
[configuration_files]
Library/Application Support/Hero Lab/customoutput
Library/Application Support/Hero Lab/data
Library/Application Support/Hero Lab/docs
================================================
FILE: src/mackup/applications/heroku.cfg
================================================
[application]
name = Heroku
[configuration_files]
.heroku/accounts
.heroku/plugins
================================================
FILE: src/mackup/applications/hexchat.cfg
================================================
[application]
name = HexChat
[xdg_configuration_files]
hexchat
================================================
FILE: src/mackup/applications/hexels.cfg
================================================
[application]
name = Hexels
[configuration_files]
Library/Preferences/com.hex-ray.hexels.plist
================================================
FILE: src/mackup/applications/hocus-focus.cfg
================================================
[application]
name = Hocus Focus
[configuration_files]
Library/Preferences/com.uglyapps.HocusFocus.plist
Library/Application Support/com.uglyapps.HocusFocus/HocusFocus.db
Library/Application Support/com.uglyapps.HocusFocus/HocusFocus.db-shm
Library/Application Support/com.uglyapps.HocusFocus/HocusFocus.db-wal
================================================
FILE: src/mackup/applications/homebrew.cfg
================================================
[application]
name = Homebrew
[configuration_files]
.Brewfile
Brewfile
================================================
FILE: src/mackup/applications/homebridge.cfg
================================================
[application]
name = Homebridge
[configuration_files]
.homebridge
================================================
FILE: src/mackup/applications/houdini.cfg
================================================
[application]
name = Houdini
[configuration_files]
Library/Preferences/com.uglyapps.Houdini.plist
Library/Application Support/Houdini
================================================
FILE: src/mackup/applications/hstr.cfg
================================================
[application]
name = hstr
[configuration_files]
.hstr_favorites
.hstr_blacklist
================================================
FILE: src/mackup/applications/htop.cfg
================================================
[application]
name = Htop
[configuration_files]
.htoprc
[xdg_configuration_files]
htop/htoprc
================================================
FILE: src/mackup/applications/httpie.cfg
================================================
[application]
name = HTTPie
[configuration_files]
.httpie/config.json
================================================
FILE: src/mackup/applications/hub.cfg
================================================
[application]
name = hub
[xdg_configuration_files]
hub
================================================
FILE: src/mackup/applications/hyper.cfg
================================================
[application]
name = Hyper.app
[configuration_files]
.hyper.js
================================================
FILE: src/mackup/applications/hyperdock.cfg
================================================
[application]
name = HyperDock
[configuration_files]
Library/Application Support/HyperDock
Library/Preferences/de.bahoom.HyperDock.plist
Library/Preferences/de.bahoom.HyperDock.prefpane.plist
================================================
FILE: src/mackup/applications/hyperswitch.cfg
================================================
[application]
name = HyperSwitch
[configuration_files]
Library/Preferences/com.bahoom.HyperSwitch.plist
================================================
FILE: src/mackup/applications/i2cssh.cfg
================================================
[application]
name = i2cssh
[configuration_files]
.i2csshrc
================================================
FILE: src/mackup/applications/i3.cfg
================================================
[application]
name = i3
[configuration_files]
.i3/config
.i3status.conf
[xdg_configuration_files]
i3/config
================================================
FILE: src/mackup/applications/idapro.cfg
================================================
[application]
name = IDA Pro
[configuration_files]
.idapro
================================================
FILE: src/mackup/applications/ideavim.cfg
================================================
[application]
name=IdeaVim
[configuration_files]
.ideavimrc
================================================
FILE: src/mackup/applications/iina.cfg
================================================
[application]
name = IINA
[configuration_files]
Library/Application Support/com.colliderli.iina/input_conf
Library/Preferences/com.colliderli.iina.plist
================================================
FILE: src/mackup/applications/illustrator.cfg
================================================
[application]
name = Adobe Illustrator
[configuration_files]
Library/Application Support/Adobe/Adobe Illustrator 17
Library/Application Support/Adobe/Adobe Illustrator 18
Library/Application Support/Adobe/Adobe Illustrator 19
Library/Application Support/Adobe/Adobe Illustrator 20
Library/Application Support/Adobe/Adobe Illustrator 23/en_US/Adobe SVG Filters.svg
Library/Application Support/Adobe/Adobe Illustrator 23/en_US/Swatches
Library/Application Support/Adobe/Adobe Illustrator 24/en_US/Adobe SVG Filters.svg
Library/Application Support/Adobe/Adobe Illustrator 24/en_US/Swatches
Library/Application Support/Adobe/OOBE
Library/Preferences/Adobe Illustrator 17 Settings
Library/Preferences/Adobe Illustrator 18 Settings
Library/Preferences/Adobe Illustrator 19 Settings
Library/Preferences/Adobe Illustrator 20 Settings
Library/Preferences/Adobe Illustrator 23 Settings/en_US/Adobe Illustrator Prefs
Library/Preferences/Adobe Illustrator 23 Settings/en_US/Last Used Artboard Export Settings
Library/Preferences/Adobe Illustrator 23 Settings/en_US/Last Used Asset Export Settings
Library/Preferences/Adobe Illustrator 23 Settings/en_US/Modified Workspaces
Library/Preferences/Adobe Illustrator 23 Settings/en_US/Perspective grid Presets
Library/Preferences/Adobe Illustrator 23 Settings/en_US/Print Presets
Library/Preferences/Adobe Illustrator 23 Settings/en_US/Tools/Tools Panel Presets
Library/Preferences/Adobe Illustrator 23 Settings/en_US/Transparency flattener presets
Library/Preferences/Adobe Illustrator 23 Settings/en_US/VariableWidthProfiles
Library/Preferences/Adobe Illustrator 23 Settings/en_US/Vectorizing Presets
Library/Preferences/Adobe Illustrator 23 Settings/en_US/Workspaces
Library/Preferences/Adobe Illustrator 24 Settings/en_US/Adobe Illustrator Prefs
Library/Preferences/Adobe Illustrator 24 Settings/en_US/Last Used Artboard Export Settings
Library/Preferences/Adobe Illustrator 24 Settings/en_US/Last Used Asset Export Settings
Library/Preferences/Adobe Illustrator 24 Settings/en_US/Modified Workspaces
Library/Preferences/Adobe Illustrator 24 Settings/en_US/Perspective grid Presets
Library/Preferences/Adobe Illustrator 24 Settings/en_US/Print Presets
Library/Preferences/Adobe Illustrator 24 Settings/en_US/Tools/Tools Panel Presets
Library/Preferences/Adobe Illustrator 24 Settings/en_US/Transparency flattener presets
Library/Preferences/Adobe Illustrator 24 Settings/en_US/VariableWidthProfiles
Library/Preferences/Adobe Illustrator 24 Settings/en_US/Vectorizing Presets
Library/Preferences/Adobe Illustrator 24 Settings/en_US/Workspaces
Library/Preferences/com.adobe.illustrator.plist
================================================
FILE: src/mackup/applications/inkscape.cfg
================================================
[application]
name = inkscape
[xdg_configuration_files]
inkscape/preferences.xml
================================================
FILE: src/mackup/applications/insomnia.cfg
================================================
[application]
name = Insomnia
[configuration_files]
Library/Application Support/Insomnia
[xdg_configuration_files]
Insomnia
================================================
FILE: src/mackup/applications/intellijidea.cfg
================================================
[application]
name = IntelliJ IDEA
[configuration_files]
.IntelliJIdea12/config
.IntelliJIdea13/config
.IntelliJIdea14/config
.IntelliJIdea15/config
IdeaIC2018.2/config
IdeaIC2018.3/config
IdeaIC2019.1/config
IdeaIC2019.2/config
IdeaIC2019.3/config
IntelliJIdea2016.1/config
IntelliJIdea2016.2/config
IntelliJIdea2016.3/config
IntelliJIdea2017.1/config
IntelliJIdea2017.2/config
IntelliJIdea2017.3/config
IntelliJIdea2018.1/config
IntelliJIdea2018.2/config
IntelliJIdea2018.3/config
IntelliJIdea2019.1/config
IntelliJIdea2019.2/config
IntelliJIdea2019.3/config
Library/Application Support/IdeaIC2016.1
Library/Application Support/IdeaIC2017.1
Library/Application Support/IdeaIC2017.2
Library/Application Support/IdeaIC2017.3
Library/Application Support/IdeaIC2018.2
Library/Application Support/IdeaIC2018.3
Library/Application Support/IdeaIC2019.1
Library/Application Support/IntelliJIdea12
Library/Application Support/IntelliJIdea13
Library/Application Support/IntelliJIdea14
Library/Application Support/IntelliJIdea15
Library/Application Support/IntelliJIdea2016.1
Library/Application Support/IntelliJIdea2016.2
Library/Application Support/IntelliJIdea2016.3
Library/Application Support/IntelliJIdea2017.1
Library/Application Support/IntelliJIdea2017.2
Library/Application Support/IntelliJIdea2017.3
Library/Application Support/IntelliJIdea2018.1
Library/Application Support/IntelliJIdea2018.2
Library/Application Support/IntelliJ
gitextract_y1tjtpic/
├── .github/
│ ├── CONTRIBUTING.md
│ ├── PULL_REQUEST_TEMPLATE.md
│ └── workflows/
│ ├── install.yaml
│ ├── linelint.yaml
│ ├── markdown.yaml
│ ├── mypy.yaml
│ ├── ruff.yaml
│ ├── snap.yaml
│ └── test.yaml
├── .gitignore
├── .linelint.yml
├── .markdownlint.yaml
├── .markdownlintignore
├── INSTALL.md
├── LICENSE
├── Makefile
├── README.md
├── doc/
│ ├── .mackup/
│ │ ├── gnupg.cfg
│ │ ├── mackup.cfg
│ │ ├── my-own-files.cfg
│ │ └── ssh.cfg
│ ├── .mackup.cfg
│ ├── ARCHITECTURE.md
│ ├── README.md
│ ├── configuration_merge_guide.md
│ ├── develop.md
│ ├── release.md
│ └── syncing-private-keys.md
├── pyproject.toml
├── snap/
│ └── snapcraft.yaml
├── src/
│ └── mackup/
│ ├── __init__.py
│ ├── application.py
│ ├── applications/
│ │ ├── 1password-4.cfg
│ │ ├── 2do.cfg
│ │ ├── ack.cfg
│ │ ├── act.cfg
│ │ ├── activitywatch.cfg
│ │ ├── adium.cfg
│ │ ├── adobe-camera-raw.cfg
│ │ ├── aerc.cfg
│ │ ├── aerospace.cfg
│ │ ├── affinity-designer.cfg
│ │ ├── affinity-photo.cfg
│ │ ├── affinity-publisher.cfg
│ │ ├── airflow.cfg
│ │ ├── airmail.cfg
│ │ ├── akamai-cli.cfg
│ │ ├── alacritty.cfg
│ │ ├── aldente.cfg
│ │ ├── alt-tab.cfg
│ │ ├── amethyst.cfg
│ │ ├── ancient-domains-of-mystery.cfg
│ │ ├── androidstudio-13.cfg
│ │ ├── ansible.cfg
│ │ ├── appcleaner.cfg
│ │ ├── appcode-2.cfg
│ │ ├── appcode-3.cfg
│ │ ├── appcode-31.cfg
│ │ ├── appcode-32.cfg
│ │ ├── apple-music.cfg
│ │ ├── apptivate.cfg
│ │ ├── arara.cfg
│ │ ├── aria2c.cfg
│ │ ├── arm.cfg
│ │ ├── asciinema.cfg
│ │ ├── asdf.cfg
│ │ ├── aspell.cfg
│ │ ├── astyle.cfg
│ │ ├── atlantis.cfg
│ │ ├── atom.cfg
│ │ ├── audacious.cfg
│ │ ├── auskey.cfg
│ │ ├── autokey.cfg
│ │ ├── awareness.cfg
│ │ ├── aws.cfg
│ │ ├── azure.cfg
│ │ ├── b-ryan_powerline-shell.cfg
│ │ ├── bartender.cfg
│ │ ├── base.cfg
│ │ ├── bash-it.cfg
│ │ ├── bash.cfg
│ │ ├── bat.cfg
│ │ ├── bc.cfg
│ │ ├── beatport-pro.cfg
│ │ ├── beets.cfg
│ │ ├── bettersnaptool.cfg
│ │ ├── bettertouchtool.cfg
│ │ ├── beyond-compare.cfg
│ │ ├── bibdesk.cfg
│ │ ├── billings-pro-server-admin.cfg
│ │ ├── bitbar.cfg
│ │ ├── bitchx.cfg
│ │ ├── blackfire.cfg
│ │ ├── blender.cfg
│ │ ├── blesh.cfg
│ │ ├── boto.cfg
│ │ ├── boxer.cfg
│ │ ├── brackets.cfg
│ │ ├── brave.cfg
│ │ ├── btop.cfg
│ │ ├── bump.cfg
│ │ ├── bundler.cfg
│ │ ├── byobu.cfg
│ │ ├── caffeine.cfg
│ │ ├── calibre.cfg
│ │ ├── capture-one.cfg
│ │ ├── cartographica.cfg
│ │ ├── cerebro.cfg
│ │ ├── charles.cfg
│ │ ├── cheat.cfg
│ │ ├── chef.cfg
│ │ ├── chicken.cfg
│ │ ├── choosy.cfg
│ │ ├── chunkwm.cfg
│ │ ├── cider.cfg
│ │ ├── clashx.cfg
│ │ ├── clasp.cfg
│ │ ├── claude-code.cfg
│ │ ├── cleanshot.cfg
│ │ ├── clementine.cfg
│ │ ├── clion.cfg
│ │ ├── clipmenu.cfg
│ │ ├── clipy.cfg
│ │ ├── cloudapp.cfg
│ │ ├── coda-2.cfg
│ │ ├── codex.cfg
│ │ ├── colloquy.cfg
│ │ ├── colorschemer-studio-2.cfg
│ │ ├── colorslurp.cfg
│ │ ├── colorsync.cfg
│ │ ├── composer.cfg
│ │ ├── concentrate.cfg
│ │ ├── conky.cfg
│ │ ├── consular.cfg
│ │ ├── contexts.cfg
│ │ ├── controlplane.cfg
│ │ ├── copyq.cfg
│ │ ├── cord.cfg
│ │ ├── coteditor.cfg
│ │ ├── ctags.cfg
│ │ ├── curl.cfg
│ │ ├── cursor.cfg
│ │ ├── cvim.cfg
│ │ ├── cyberduck.cfg
│ │ ├── daisydisk.cfg
│ │ ├── dash.cfg
│ │ ├── datagrip.cfg
│ │ ├── day-o.cfg
│ │ ├── dbeaver.cfg
│ │ ├── dbvisualizer.cfg
│ │ ├── deal-alert.cfg
│ │ ├── deepin-dde-dock.cfg
│ │ ├── deepin-dde-file-manager.cfg
│ │ ├── deepin-terminal.cfg
│ │ ├── default-folder-x.cfg
│ │ ├── defaultkeybinding.cfg
│ │ ├── devilspie.cfg
│ │ ├── devilspie2.cfg
│ │ ├── dig.cfg
│ │ ├── divvy.cfg
│ │ ├── docker.cfg
│ │ ├── dolphin.cfg
│ │ ├── doom-emacs.cfg
│ │ ├── doublecmd.cfg
│ │ ├── doxie.cfg
│ │ ├── dozer.cfg
│ │ ├── draft.cfg
│ │ ├── droplr.cfg
│ │ ├── dropzone.cfg
│ │ ├── drush.cfg
│ │ ├── editorconfig.cfg
│ │ ├── electrum.cfg
│ │ ├── emacs.cfg
│ │ ├── enjoyable.cfg
│ │ ├── environmental-station-alpha.cfg
│ │ ├── eqmac-2.cfg
│ │ ├── eslint.cfg
│ │ ├── espanso.cfg
│ │ ├── exercism.cfg
│ │ ├── expandrive.cfg
│ │ ├── factorio.cfg
│ │ ├── factory-droid.cfg
│ │ ├── fantastical.cfg
│ │ ├── fasd.cfg
│ │ ├── fastlane.cfg
│ │ ├── fastscripts.cfg
│ │ ├── feeds.cfg
│ │ ├── filezilla.cfg
│ │ ├── finicky.cfg
│ │ ├── fish.cfg
│ │ ├── fisher.cfg
│ │ ├── flake8.cfg
│ │ ├── flameshot.cfg
│ │ ├── flexget.cfg
│ │ ├── flux.cfg
│ │ ├── focus.cfg
│ │ ├── fontconfig.cfg
│ │ ├── fontexplorer-x.cfg
│ │ ├── forge.cfg
│ │ ├── fork.cfg
│ │ ├── forklift.cfg
│ │ ├── franz.cfg
│ │ ├── gasmask.cfg
│ │ ├── gdb.cfg
│ │ ├── gearplayer.cfg
│ │ ├── geektool.cfg
│ │ ├── ghci.cfg
│ │ ├── ghidra.cfg
│ │ ├── ghostty.cfg
│ │ ├── ghostwriter.cfg
│ │ ├── gimp.cfg
│ │ ├── git-hooks.cfg
│ │ ├── git.cfg
│ │ ├── gitbox.cfg
│ │ ├── gitfox.cfg
│ │ ├── github-cli.cfg
│ │ ├── gitkraken.cfg
│ │ ├── gitup.cfg
│ │ ├── gmail-notifr.cfg
│ │ ├── gmailctl.cfg
│ │ ├── gmvault.cfg
│ │ ├── gnu-stow.cfg
│ │ ├── gnupg.cfg
│ │ ├── go2shell.cfg
│ │ ├── goku.cfg
│ │ ├── goland.cfg
│ │ ├── goldendict.cfg
│ │ ├── goodsync.cfg
│ │ ├── goshare.cfg
│ │ ├── gradle.cfg
│ │ ├── grandtotal-3.cfg
│ │ ├── grsync.cfg
│ │ ├── gstm.cfg
│ │ ├── hammerspoon.cfg
│ │ ├── handbrake.cfg
│ │ ├── hands-off.cfg
│ │ ├── hazel.cfg
│ │ ├── hero-lab.cfg
│ │ ├── heroku.cfg
│ │ ├── hexchat.cfg
│ │ ├── hexels.cfg
│ │ ├── hocus-focus.cfg
│ │ ├── homebrew.cfg
│ │ ├── homebridge.cfg
│ │ ├── houdini.cfg
│ │ ├── hstr.cfg
│ │ ├── htop.cfg
│ │ ├── httpie.cfg
│ │ ├── hub.cfg
│ │ ├── hyper.cfg
│ │ ├── hyperdock.cfg
│ │ ├── hyperswitch.cfg
│ │ ├── i2cssh.cfg
│ │ ├── i3.cfg
│ │ ├── idapro.cfg
│ │ ├── ideavim.cfg
│ │ ├── iina.cfg
│ │ ├── illustrator.cfg
│ │ ├── inkscape.cfg
│ │ ├── insomnia.cfg
│ │ ├── intellijidea.cfg
│ │ ├── ipython.cfg
│ │ ├── irssi.cfg
│ │ ├── istat-menus.cfg
│ │ ├── iterm2.cfg
│ │ ├── itermocil.cfg
│ │ ├── itsycal.cfg
│ │ ├── itunes-scripts.cfg
│ │ ├── jankyborders.cfg
│ │ ├── janus.cfg
│ │ ├── jitouch.cfg
│ │ ├── joplin.cfg
│ │ ├── jrnl.cfg
│ │ ├── jsbeautifier.cfg
│ │ ├── jshint.cfg
│ │ ├── julia.cfg
│ │ ├── jumpcut.cfg
│ │ ├── jupyter.cfg
│ │ ├── k9s.cfg
│ │ ├── kaggle.cfg
│ │ ├── kaleidoscope.cfg
│ │ ├── karabiner-elements.cfg
│ │ ├── karabiner.cfg
│ │ ├── kdenlive.cfg
│ │ ├── keepassx.cfg
│ │ ├── keepassxc.cfg
│ │ ├── keepingyouawake.cfg
│ │ ├── keka.cfg
│ │ ├── keybase.cfg
│ │ ├── keyboard-maestro.cfg
│ │ ├── keymo.cfg
│ │ ├── keyremap4macbook.cfg
│ │ ├── khd.cfg
│ │ ├── kiro.cfg
│ │ ├── kitty.cfg
│ │ ├── krew.cfg
│ │ ├── kubectl.cfg
│ │ ├── kwm.cfg
│ │ ├── latexit.cfg
│ │ ├── launchbar.cfg
│ │ ├── lazydocker.cfg
│ │ ├── lazygit.cfg
│ │ ├── ledger.cfg
│ │ ├── leiningen.cfg
│ │ ├── lf.cfg
│ │ ├── libreoffice.cfg
│ │ ├── liftoff.cfg
│ │ ├── light-table.cfg
│ │ ├── lightpaper.cfg
│ │ ├── lightroom-classic.cfg
│ │ ├── lightroom.cfg
│ │ ├── limechat.cfg
│ │ ├── liquidprompt.cfg
│ │ ├── littlesnitch.cfg
│ │ ├── livestreamer.cfg
│ │ ├── logitech-options.cfg
│ │ ├── logseq.cfg
│ │ ├── lollypop.cfg
│ │ ├── loopback.cfg
│ │ ├── luftrausers.cfg
│ │ ├── lunarvim.cfg
│ │ ├── macdive2.cfg
│ │ ├── macdown.cfg
│ │ ├── mackup.cfg
│ │ ├── macosx.cfg
│ │ ├── macvim.cfg
│ │ ├── magic-launch.cfg
│ │ ├── magicprefs.cfg
│ │ ├── magnet.cfg
│ │ ├── maid.cfg
│ │ ├── mail.cfg
│ │ ├── mailmate.cfg
│ │ ├── mailplane.cfg
│ │ ├── mako.cfg
│ │ ├── marked2.cfg
│ │ ├── marta.cfg
│ │ ├── matlab.cfg
│ │ ├── maven.cfg
│ │ ├── max.cfg
│ │ ├── mendeley.cfg
│ │ ├── menumeters.cfg
│ │ ├── mercurial.cfg
│ │ ├── mercurymover.cfg
│ │ ├── messages.cfg
│ │ ├── micro.cfg
│ │ ├── microsoft-remote-desktop.cfg
│ │ ├── mise.cfg
│ │ ├── mitmproxy.cfg
│ │ ├── mkcert.cfg
│ │ ├── mole.cfg
│ │ ├── monodevelop.cfg
│ │ ├── moom.cfg
│ │ ├── mosaic.cfg
│ │ ├── mou.cfg
│ │ ├── mpd.cfg
│ │ ├── mplayerx.cfg
│ │ ├── mps-youtube.cfg
│ │ ├── mpv.cfg
│ │ ├── mtmr.cfg
│ │ ├── multitouch.cfg
│ │ ├── mumu.cfg
│ │ ├── musicbrainz-picard.cfg
│ │ ├── mutespotifyads.cfg
│ │ ├── mycli.cfg
│ │ ├── myrepos.cfg
│ │ ├── mysql.cfg
│ │ ├── mysqlworkbench.cfg
│ │ ├── name-mangler.cfg
│ │ ├── nano.cfg
│ │ ├── navicat.cfg
│ │ ├── ncmpcpp.cfg
│ │ ├── neofetch.cfg
│ │ ├── neovim.cfg
│ │ ├── nethack.cfg
│ │ ├── netlify.cfg
│ │ ├── newsbeuter.cfg
│ │ ├── ngrok.cfg
│ │ ├── ni.cfg
│ │ ├── nomacs.cfg
│ │ ├── nosqlbooster-for-mongodb.cfg
│ │ ├── notion-enhancer.cfg
│ │ ├── nova.cfg
│ │ ├── npm.cfg
│ │ ├── npmrc.cfg
│ │ ├── nslogger.cfg
│ │ ├── nuget.cfg
│ │ ├── nushell.cfg
│ │ ├── nvalt.cfg
│ │ ├── nvm.cfg
│ │ ├── nvpy.cfg
│ │ ├── obs.cfg
│ │ ├── oci.cfg
│ │ ├── offlineimap.cfg
│ │ ├── ogdesign-eagle.cfg
│ │ ├── oh-my-fish.cfg
│ │ ├── oh-my-tmux.cfg
│ │ ├── omnifocus.cfg
│ │ ├── omnigraffle.cfg
│ │ ├── openbox.cfg
│ │ ├── opencode.cfg
│ │ ├── openemu.cfg
│ │ ├── opera.cfg
│ │ ├── p10k.cfg
│ │ ├── paintbrush.cfg
│ │ ├── pandoc.cfg
│ │ ├── pass.cfg
│ │ ├── pastebot.cfg
│ │ ├── path-finder.cfg
│ │ ├── pdfjam.cfg
│ │ ├── pear.cfg
│ │ ├── pentadactyl.cfg
│ │ ├── perl.cfg
│ │ ├── pgsql.cfg
│ │ ├── phoenix.cfg
│ │ ├── phoneview.cfg
│ │ ├── photoshop.cfg
│ │ ├── phpstorm.cfg
│ │ ├── picgo.cfg
│ │ ├── pidgin.cfg
│ │ ├── pip.cfg
│ │ ├── pixelsnap.cfg
│ │ ├── pixelsnap2.cfg
│ │ ├── planner.cfg
│ │ ├── plover.cfg
│ │ ├── pnpm.cfg
│ │ ├── pock.cfg
│ │ ├── podman.cfg
│ │ ├── poedit.cfg
│ │ ├── poetry.cfg
│ │ ├── pokerstars.cfg
│ │ ├── polybar.cfg
│ │ ├── popclip.cfg
│ │ ├── popcorn-time.cfg
│ │ ├── postico.cfg
│ │ ├── pow.cfg
│ │ ├── powerline.cfg
│ │ ├── prezto.cfg
│ │ ├── processing.cfg
│ │ ├── proselint.cfg
│ │ ├── proxychains.cfg
│ │ ├── proxyman.cfg
│ │ ├── prusa-slicer.cfg
│ │ ├── psysh.cfg
│ │ ├── punto-switcher.cfg
│ │ ├── pycharm.cfg
│ │ ├── pypi.cfg
│ │ ├── pyradio.cfg
│ │ ├── querious.cfg
│ │ ├── quicklook.cfg
│ │ ├── quicksilver.cfg
│ │ ├── quitter.cfg
│ │ ├── qutebrowser.cfg
│ │ ├── qv2ray.cfg
│ │ ├── r.cfg
│ │ ├── rails.cfg
│ │ ├── ranger.cfg
│ │ ├── rbenv.cfg
│ │ ├── rclone.cfg
│ │ ├── rectangle.cfg
│ │ ├── redshift-scheduler.cfg
│ │ ├── redshift.cfg
│ │ ├── remote-desktop-manager.cfg
│ │ ├── rhythmbox.cfg
│ │ ├── rime.cfg
│ │ ├── ripgrep.cfg
│ │ ├── robo3t.cfg
│ │ ├── rocket.cfg
│ │ ├── rofi.cfg
│ │ ├── royaltsx.cfg
│ │ ├── rstudio.cfg
│ │ ├── rtorrent.cfg
│ │ ├── rtx.cfg
│ │ ├── rubitrack5.cfg
│ │ ├── rubocop.cfg
│ │ ├── ruby-version.cfg
│ │ ├── ruby.cfg
│ │ ├── rubymine.cfg
│ │ ├── rust.cfg
│ │ ├── rustrover.cfg
│ │ ├── rvm.cfg
│ │ ├── s3cmd.cfg
│ │ ├── sabnzbd.cfg
│ │ ├── sbcl.cfg
│ │ ├── sbt.cfg
│ │ ├── scenario.cfg
│ │ ├── screen.cfg
│ │ ├── screenhero.cfg
│ │ ├── scrivener.cfg
│ │ ├── scroll-reverser.cfg
│ │ ├── secure-pipes.cfg
│ │ ├── securecrt.cfg
│ │ ├── seil.cfg
│ │ ├── selfcontrol.cfg
│ │ ├── sequel-pro.cfg
│ │ ├── shadowsocksx-ng.cfg
│ │ ├── shiftit.cfg
│ │ ├── shifty.cfg
│ │ ├── shimo.cfg
│ │ ├── showyedge.cfg
│ │ ├── shsh-blobs.cfg
│ │ ├── shuttle.cfg
│ │ ├── sizeup.cfg
│ │ ├── sizzy.cfg
│ │ ├── sketchybar.cfg
│ │ ├── skhd.cfg
│ │ ├── skim.cfg
│ │ ├── skitch.cfg
│ │ ├── slate.cfg
│ │ ├── slic3r.cfg
│ │ ├── slogger.cfg
│ │ ├── smartgit.cfg
│ │ ├── smooth-mouse.cfg
│ │ ├── soulver.cfg
│ │ ├── sourcetree.cfg
│ │ ├── spacelauncher.cfg
│ │ ├── spacemacs.cfg
│ │ ├── spacevim.cfg
│ │ ├── spamsieve.cfg
│ │ ├── spark.cfg
│ │ ├── spectacle.cfg
│ │ ├── spectrwm.cfg
│ │ ├── splice.cfg
│ │ ├── spotify-notifications.cfg
│ │ ├── spotify.cfg
│ │ ├── sqitch.cfg
│ │ ├── ssh.cfg
│ │ ├── starship.cfg
│ │ ├── startupizer2.cfg
│ │ ├── stata.cfg
│ │ ├── stats.cfg
│ │ ├── stay.cfg
│ │ ├── storyist-3.cfg
│ │ ├── streamdeck.cfg
│ │ ├── subler.cfg
│ │ ├── sublime-merge.cfg
│ │ ├── sublime-text-2.cfg
│ │ ├── sublime-text-3.cfg
│ │ ├── sublime-text.cfg
│ │ ├── subversion.cfg
│ │ ├── superduper.cfg
│ │ ├── surge.cfg
│ │ ├── swaywm.cfg
│ │ ├── swinsian.cfg
│ │ ├── swish.cfg
│ │ ├── switchhosts.cfg
│ │ ├── t.cfg
│ │ ├── tableplus.cfg
│ │ ├── taskpaper.cfg
│ │ ├── taskwarrior.cfg
│ │ ├── teamocil.cfg
│ │ ├── telegram_macos.cfg
│ │ ├── terminal.cfg
│ │ ├── terminator.cfg
│ │ ├── termite.cfg
│ │ ├── termux.cfg
│ │ ├── terraform.cfg
│ │ ├── textexpander.cfg
│ │ ├── textmate.cfg
│ │ ├── textual.cfg
│ │ ├── things.cfg
│ │ ├── tidy.cfg
│ │ ├── tig.cfg
│ │ ├── tiles.cfg
│ │ ├── tilix.cfg
│ │ ├── timeout.cfg
│ │ ├── tint2.cfg
│ │ ├── tinyfugue.cfg
│ │ ├── tmux.cfg
│ │ ├── tmuxinator.cfg
│ │ ├── tmuxp.cfg
│ │ ├── todotxt-cli.cfg
│ │ ├── toothfairy.cfg
│ │ ├── totalspaces2.cfg
│ │ ├── tower-2.cfg
│ │ ├── tower-3.cfg
│ │ ├── tower.cfg
│ │ ├── transmission.cfg
│ │ ├── transmit.cfg
│ │ ├── tripmode.cfg
│ │ ├── trizen.cfg
│ │ ├── tunnelblick.cfg
│ │ ├── tvnamer.cfg
│ │ ├── twitterrific.cfg
│ │ ├── typinator.cfg
│ │ ├── typora.cfg
│ │ ├── ubersicht.cfg
│ │ ├── ulauncher.cfg
│ │ ├── ventrilo.cfg
│ │ ├── verdaccio.cfg
│ │ ├── versions.cfg
│ │ ├── vim.cfg
│ │ ├── vimperator.cfg
│ │ ├── vimwiki.cfg
│ │ ├── viscosity.cfg
│ │ ├── vlc.cfg
│ │ ├── volt.cfg
│ │ ├── vs4mac.cfg
│ │ ├── vscode-insiders.cfg
│ │ ├── vscode-oss.cfg
│ │ ├── vscode.cfg
│ │ ├── vscodium.cfg
│ │ ├── wakatime.cfg
│ │ ├── warp.cfg
│ │ ├── waybar.cfg
│ │ ├── webstorm.cfg
│ │ ├── wezterm.cfg
│ │ ├── wget.cfg
│ │ ├── whatsapp.cfg
│ │ ├── windsurf.cfg
│ │ ├── wireshark.cfg
│ │ ├── witch.cfg
│ │ ├── wordgrinder.cfg
│ │ ├── workrave.cfg
│ │ ├── wp-cli.cfg
│ │ ├── x11.cfg
│ │ ├── xamarinstudio-5.cfg
│ │ ├── xbar.cfg
│ │ ├── xbindkeys.cfg
│ │ ├── xchat.cfg
│ │ ├── xcode.cfg
│ │ ├── xee.cfg
│ │ ├── xemacs.cfg
│ │ ├── xld.cfg
│ │ ├── xonsh.cfg
│ │ ├── xtrafinder.cfg
│ │ ├── yabai.cfg
│ │ ├── yarn.cfg
│ │ ├── yazi.cfg
│ │ ├── youtube-dl.cfg
│ │ ├── yummyftp.cfg
│ │ ├── zabbix-cli.cfg
│ │ ├── zathura.cfg
│ │ ├── zed.cfg
│ │ ├── zoom.cfg
│ │ ├── zoxide.cfg
│ │ └── zsh.cfg
│ ├── appsdb.py
│ ├── config.py
│ ├── constants.py
│ ├── mackup.py
│ ├── main.py
│ └── utils.py
└── tests/
├── README.md
├── __init__.py
├── fixtures/
│ ├── .mackup/
│ │ ├── legacy-test-app.cfg
│ │ └── priority-test-app.cfg
│ ├── Library/
│ │ ├── Application Support/
│ │ │ └── Box/
│ │ │ └── Box Sync/
│ │ │ └── sync_root_folder.txt
│ │ └── Mobile Documents/
│ │ └── com~apple~CloudDocs/
│ │ └── _blank_.md
│ ├── mackup-apps_to_ignore.cfg
│ ├── mackup-apps_to_ignore_and_sync.cfg
│ ├── mackup-apps_to_sync.cfg
│ ├── mackup-empty.cfg
│ ├── mackup-engine-dropbox.cfg
│ ├── mackup-engine-file_system-absolute.cfg
│ ├── mackup-engine-file_system-no_path.cfg
│ ├── mackup-engine-file_system.cfg
│ ├── mackup-engine-google_drive.cfg
│ ├── mackup-engine-icloud.cfg
│ ├── mackup-engine-unknown.cfg
│ ├── mackup-envarcheck.cfg
│ ├── mackup-old-config.cfg
│ └── xdg-config-home/
│ └── mackup/
│ ├── applications/
│ │ ├── priority-test-app.cfg
│ │ └── xdg-test-app.cfg
│ └── mackup.cfg
├── test_application.py
├── test_appsdb_xdg.py
├── test_backup_after_link_install.py
├── test_cli.py
├── test_config.py
├── test_config_file_option.py
├── test_constants.py
├── test_main.py
└── test_utils.py
SYMBOL INDEX (163 symbols across 16 files)
FILE: src/mackup/application.py
class ApplicationProfile (line 14) | class ApplicationProfile:
method __init__ (line 17) | def __init__(
method get_filepaths (line 35) | def get_filepaths(self, filename: str) -> tuple[str, str]:
method copy_files_to_mackup_folder (line 50) | def copy_files_to_mackup_folder(self) -> None:
method copy_files_from_mackup_folder (line 126) | def copy_files_from_mackup_folder(self) -> None:
method link_install (line 185) | def link_install(self) -> None:
method link (line 269) | def link(self) -> None:
method link_uninstall (line 348) | def link_uninstall(self) -> None:
FILE: src/mackup/appsdb.py
class ApplicationsDatabase (line 15) | class ApplicationsDatabase:
method __init__ (line 18) | def __init__(self) -> None:
method get_config_files (line 75) | def get_config_files() -> set[str]:
method get_name (line 134) | def get_name(self, name: str) -> str:
method get_files (line 148) | def get_files(self, name: str) -> set[str]:
method get_app_names (line 162) | def get_app_names(self) -> set[str]:
method get_pretty_app_names (line 178) | def get_pretty_app_names(self) -> set[str]:
FILE: src/mackup/config.py
class Config (line 27) | class Config:
method __init__ (line 30) | def __init__(self, filename: Optional[str] = None) -> None:
method engine (line 62) | def engine(self) -> str:
method path (line 74) | def path(self) -> str:
method directory (line 87) | def directory(self) -> str:
method fullpath (line 97) | def fullpath(self) -> str:
method apps_to_ignore (line 110) | def apps_to_ignore(self) -> set[str]:
method apps_to_sync (line 120) | def apps_to_sync(self) -> set[str]:
method _setup_parser (line 129) | def _setup_parser(
method _best_config_path (line 150) | def _best_config_path(self, filename: Optional[str] = None) -> str:
method _warn_on_old_config (line 214) | def _warn_on_old_config(self) -> None:
method _parse_engine (line 234) | def _parse_engine(self) -> str:
method _parse_path (line 258) | def _parse_path(self) -> str:
method _parse_directory (line 283) | def _parse_directory(self) -> str:
method _parse_apps_to_ignore (line 308) | def _parse_apps_to_ignore(self) -> set[str]:
method _parse_apps_to_sync (line 325) | def _parse_apps_to_sync(self) -> set[str]:
class ConfigError (line 343) | class ConfigError(Exception):
FILE: src/mackup/constants.py
function _get_version (line 22) | def _get_version() -> str:
FILE: src/mackup/mackup.py
class Mackup (line 18) | class Mackup:
method __init__ (line 21) | def __init__(self, config_file: Optional[str] = None) -> None:
method check_for_usable_environment (line 28) | def check_for_usable_environment(self) -> None:
method check_for_usable_backup_env (line 52) | def check_for_usable_backup_env(self) -> None:
method check_for_usable_restore_env (line 57) | def check_for_usable_restore_env(self) -> None:
method clean_temp_folder (line 68) | def clean_temp_folder(self) -> None:
method create_mackup_home (line 72) | def create_mackup_home(self) -> None:
method get_apps_to_backup (line 84) | def get_apps_to_backup(self) -> set[str]:
FILE: src/mackup/main.py
class ColorFormatCodes (line 55) | class ColorFormatCodes:
function header (line 61) | def header(text: str) -> str:
function bold (line 65) | def bold(text: str) -> str:
function main (line 69) | def main() -> None:
FILE: src/mackup/utils.py
function confirm (line 26) | def confirm(question: str) -> bool:
function delete (line 54) | def delete(filepath: str) -> None:
function copy (line 76) | def copy(src: str, dst: str) -> None:
function link (line 120) | def link(target: str, link_to: str) -> None:
function chmod (line 153) | def chmod(target: str) -> None:
function error (line 189) | def error(message: str) -> NoReturn:
function get_dropbox_folder_location (line 201) | def get_dropbox_folder_location() -> str:
function get_google_drive_folder_location (line 228) | def get_google_drive_folder_location() -> str:
function get_icloud_folder_location (line 276) | def get_icloud_folder_location() -> str:
function is_process_running (line 293) | def is_process_running(process_name: str) -> bool:
function remove_acl (line 316) | def remove_acl(path: str) -> None:
function remove_immutable_attribute (line 336) | def remove_immutable_attribute(path: str) -> None:
function can_file_be_synced_on_current_platform (line 359) | def can_file_be_synced_on_current_platform(path: str) -> bool:
FILE: tests/test_application.py
class TestApplicationProfile (line 13) | class TestApplicationProfile(unittest.TestCase):
method setUp (line 14) | def setUp(self):
method tearDown (line 38) | def tearDown(self):
method test_copy_files_to_mackup_folder_permission_error (line 52) | def test_copy_files_to_mackup_folder_permission_error(self):
method test_files_are_sorted_for_deterministic_processing (line 85) | def test_files_are_sorted_for_deterministic_processing(self):
method test_copy_files_to_mackup_folder_permission_error_verbose (line 96) | def test_copy_files_to_mackup_folder_permission_error_verbose(self):
method test_copy_files_from_mackup_folder_permission_error (line 137) | def test_copy_files_from_mackup_folder_permission_error(self):
method test_copy_files_from_mackup_folder_permission_error_verbose (line 170) | def test_copy_files_from_mackup_folder_permission_error_verbose(self):
method test_copy_files_to_mackup_folder_with_directory_permission_error (line 211) | def test_copy_files_to_mackup_folder_with_directory_permission_error(s...
method test_copy_files_from_mackup_folder_with_directory_permission_error (line 245) | def test_copy_files_from_mackup_folder_with_directory_permission_error...
method test_copy_files_to_mackup_folder_dry_run_no_permission_error (line 279) | def test_copy_files_to_mackup_folder_dry_run_no_permission_error(self):
method test_copy_files_from_mackup_folder_dry_run_no_permission_error (line 316) | def test_copy_files_from_mackup_folder_dry_run_no_permission_error(self):
method test_copy_files_to_mackup_folder_decline_replace_skips_copy (line 353) | def test_copy_files_to_mackup_folder_decline_replace_skips_copy(self):
method test_copy_files_from_mackup_folder_decline_replace_skips_copy (line 375) | def test_copy_files_from_mackup_folder_decline_replace_skips_copy(self):
method test_link_uninstall_mackup_not_a_link (line 397) | def test_link_uninstall_mackup_not_a_link(self):
method test_link_uninstall_mackup_points_to_wrong_target (line 437) | def test_link_uninstall_mackup_points_to_wrong_target(self):
method test_link_uninstall_mackup_points_correctly (line 481) | def test_link_uninstall_mackup_points_correctly(self):
method test_copy_files_to_mackup_folder_skips_already_linked_files (line 517) | def test_copy_files_to_mackup_folder_skips_already_linked_files(self):
method test_copy_files_to_mackup_folder_skips_already_linked_files_verbose (line 563) | def test_copy_files_to_mackup_folder_skips_already_linked_files_verbos...
method test_copy_files_to_mackup_folder_backs_up_symlink_to_different_location (line 620) | def test_copy_files_to_mackup_folder_backs_up_symlink_to_different_loc...
FILE: tests/test_appsdb_xdg.py
class TestApplicationsDatabaseXDG (line 9) | class TestApplicationsDatabaseXDG(unittest.TestCase):
method setUp (line 12) | def setUp(self):
method tearDown (line 23) | def tearDown(self):
method test_legacy_custom_apps_dir (line 34) | def test_legacy_custom_apps_dir(self):
method test_xdg_custom_apps_dir (line 42) | def test_xdg_custom_apps_dir(self):
method test_legacy_takes_priority_over_xdg (line 52) | def test_legacy_takes_priority_over_xdg(self):
method test_both_directories_merged (line 69) | def test_both_directories_merged(self):
method test_xdg_default_fallback (line 81) | def test_xdg_default_fallback(self):
method test_applications_database_loads_xdg_apps (line 93) | def test_applications_database_loads_xdg_apps(self):
method test_applications_database_priority_loads_legacy (line 104) | def test_applications_database_priority_loads_legacy(self):
FILE: tests/test_backup_after_link_install.py
class TestBackupAfterLinkInstall (line 14) | class TestBackupAfterLinkInstall(unittest.TestCase):
method setUp (line 17) | def setUp(self):
method _cleanup_directory (line 39) | def _cleanup_directory(self, directory):
method _restore_home (line 44) | def _restore_home(self, original_home):
method tearDown (line 51) | def tearDown(self):
method test_backup_after_link_install_does_not_delete_mackup_files (line 55) | def test_backup_after_link_install_does_not_delete_mackup_files(self):
method test_backup_after_link_install_verbose_shows_skip_message (line 136) | def test_backup_after_link_install_verbose_shows_skip_message(self):
FILE: tests/test_cli.py
class TestCLI (line 13) | class TestCLI(unittest.TestCase):
method setUp (line 16) | def setUp(self):
method tearDown (line 68) | def tearDown(self):
method test_backup_creates_mackup_folder (line 93) | def test_backup_creates_mackup_folder(self):
method test_backup_copies_file (line 105) | def test_backup_copies_file(self):
method test_restore_copies_file_back (line 126) | def test_restore_copies_file_back(self):
method test_backup_and_restore_full_workflow (line 153) | def test_backup_and_restore_full_workflow(self):
method test_backup_preserves_file_permissions (line 187) | def test_backup_preserves_file_permissions(self):
method test_restore_with_missing_backup (line 205) | def test_restore_with_missing_backup(self):
method test_backup_with_folder (line 222) | def test_backup_with_folder(self):
method test_restore_with_folder (line 259) | def test_restore_with_folder(self):
method test_restore_fails_when_mackup_folder_missing (line 302) | def test_restore_fails_when_mackup_folder_missing(self):
method test_force_and_force_no_are_mutually_exclusive (line 315) | def test_force_and_force_no_are_mutually_exclusive(self):
FILE: tests/test_config.py
function assert_correct_config_read (line 18) | def assert_correct_config_read(testtype):
class TestConfig (line 22) | class TestConfig(unittest.TestCase):
method setUp (line 23) | def setUp(self):
method test_config_envvar (line 31) | def test_config_envvar(self):
method test_config_xdg (line 35) | def test_config_xdg(self):
method test_config_find_correct_default (line 39) | def test_config_find_correct_default(self):
method test_config_finds_correct_envvar (line 63) | def test_config_finds_correct_envvar(self):
method test_config_no_config (line 72) | def test_config_no_config(self):
method test_config_empty (line 92) | def test_config_empty(self):
method test_config_engine_dropbox (line 110) | def test_config_engine_dropbox(self):
method test_config_engine_filesystem_absolute (line 128) | def test_config_engine_filesystem_absolute(self):
method test_config_engine_filesystem (line 146) | def test_config_engine_filesystem(self):
method test_config_engine_google_drive (line 168) | def test_config_engine_google_drive(self):
method test_config_engine_icloud (line 186) | def test_config_engine_icloud(self):
method test_config_engine_filesystem_no_path (line 206) | def test_config_engine_filesystem_no_path(self):
method test_config_engine_unknown (line 210) | def test_config_engine_unknown(self):
method test_config_apps_to_ignore (line 214) | def test_config_apps_to_ignore(self):
method test_config_apps_to_sync (line 232) | def test_config_apps_to_sync(self):
method test_config_apps_to_ignore_and_sync (line 250) | def test_config_apps_to_ignore_and_sync(self):
method test_config_old_config (line 268) | def test_config_old_config(self):
FILE: tests/test_config_file_option.py
class TestConfigFileOption (line 11) | class TestConfigFileOption(unittest.TestCase):
method setUp (line 12) | def setUp(self):
method test_config_with_relative_path (line 20) | def test_config_with_relative_path(self):
method test_config_with_absolute_path (line 26) | def test_config_with_absolute_path(self):
method test_mackup_with_config_file (line 33) | def test_mackup_with_config_file(self):
method test_mackup_without_config_file (line 42) | def test_mackup_without_config_file(self):
method test_config_file_does_not_exist (line 51) | def test_config_file_does_not_exist(self):
FILE: tests/test_constants.py
class TestConstants (line 7) | class TestConstants(unittest.TestCase):
method test_get_version_returns_metadata_version (line 8) | def test_get_version_returns_metadata_version(self):
method test_get_version_falls_back_when_metadata_missing (line 12) | def test_get_version_falls_back_when_metadata_missing(self):
FILE: tests/test_main.py
class TestMain (line 6) | class TestMain(unittest.TestCase):
method test_main_header (line 7) | def test_main_header(self):
method test_main_bold (line 10) | def test_main_bold(self):
FILE: tests/test_utils.py
function convert_to_octal (line 13) | def convert_to_octal(file_name):
class TestMackup (line 20) | class TestMackup(unittest.TestCase):
method test_confirm_yes (line 21) | def test_confirm_yes(self):
method test_confirm_no (line 26) | def test_confirm_no(self):
method test_confirm_typo (line 31) | def test_confirm_typo(self):
method test_delete_file (line 36) | def test_delete_file(self):
method test_delete_folder_recursively (line 49) | def test_delete_folder_recursively(self):
method test_copy_file (line 79) | def test_copy_file(self):
method test_copy_fail (line 105) | def test_copy_fail(self):
method test_copy_file_to_dir (line 136) | def test_copy_file_to_dir(self):
method test_copy_dir (line 172) | def test_copy_dir(self):
method test_copy_dir_that_exists (line 206) | def test_copy_dir_that_exists(self):
method test_link_file (line 250) | def test_link_file(self):
method test_chmod_file (line 277) | def test_chmod_file(self):
method test_error (line 314) | def test_error(self):
method test_failed_backup_location (line 319) | def test_failed_backup_location(self):
method test_dropbox_folder_location_with_malformed_host_db (line 342) | def test_dropbox_folder_location_with_malformed_host_db(self):
method test_dropbox_folder_location_with_invalid_base64 (line 355) | def test_dropbox_folder_location_with_invalid_base64(self):
method test_google_drive_folder_location_with_missing_path_entry (line 368) | def test_google_drive_folder_location_with_missing_path_entry(self):
method test_google_drive_folder_location_uses_user_default_db (line 391) | def test_google_drive_folder_location_uses_user_default_db(self):
method test_is_process_running (line 415) | def test_is_process_running(self):
method test_can_file_be_synced_on_current_platform (line 420) | def test_can_file_be_synced_on_current_platform(self):
Condensed preview — 673 files, each showing path, character count, and a content snippet. Download the .json file or copy for the full structured content (398K chars).
[
{
"path": ".github/CONTRIBUTING.md",
"chars": 3444,
"preview": "# How to contribute\n\nYou can:\n\n- Add or improve the support of an application (Check the [TODO][TODO] and\n [TOFIX][TOFI"
},
{
"path": ".github/PULL_REQUEST_TEMPLATE.md",
"chars": 921,
"preview": "### All submissions\n\n* [ ] I have followed the [Contributing Guidelines](https://github.com/lra/mackup/blob/master/.gith"
},
{
"path": ".github/workflows/install.yaml",
"chars": 823,
"preview": "name: install\non:\n push:\n branches:\n - master\n pull_request:\n\njobs:\n\n install-on-linux:\n strategy:\n m"
},
{
"path": ".github/workflows/linelint.yaml",
"chars": 443,
"preview": "# Make sure that all text files end with a newline character.\n# Configure your editor to end every file with a newline c"
},
{
"path": ".github/workflows/markdown.yaml",
"chars": 295,
"preview": "name: markdown\non:\n push:\n branches:\n - master\n pull_request:\n\njobs:\n\n markdownlint:\n runs-on: ubuntu-late"
},
{
"path": ".github/workflows/mypy.yaml",
"chars": 315,
"preview": "name: mypy\non:\n push:\n branches:\n - master\n pull_request:\n\njobs:\n\n mypy:\n runs-on: ubuntu-latest\n steps"
},
{
"path": ".github/workflows/ruff.yaml",
"chars": 265,
"preview": "name: ruff\non:\n push:\n branches:\n - master\n pull_request:\n\njobs:\n\n ruff:\n runs-on: ubuntu-latest\n steps"
},
{
"path": ".github/workflows/snap.yaml",
"chars": 494,
"preview": "name: snap\n\non:\n push:\n branches:\n - master\n pull_request:\n\njobs:\n build-and-publish:\n runs-on: ubuntu-lat"
},
{
"path": ".github/workflows/test.yaml",
"chars": 526,
"preview": "name: test\non:\n push:\n branches:\n - master\n pull_request:\n\njobs:\n\n pytest:\n runs-on: ubuntu-latest\n str"
},
{
"path": ".gitignore",
"chars": 207,
"preview": "# Generated when running Mackup\n*.pyc\n\n# Generated by make release\n/dist/\n\n# Ignore Claude stuff\n/.claude/\n\n# Coverage r"
},
{
"path": ".linelint.yml",
"chars": 589,
"preview": "# 'true' will fix files\nautofix: false\n\n# list of paths to ignore, uses gitignore syntaxes (executes before any rule)\nig"
},
{
"path": ".markdownlint.yaml",
"chars": 23,
"preview": "MD004:\n style: \"dash\"\n"
},
{
"path": ".markdownlintignore",
"chars": 7,
"preview": "tests/\n"
},
{
"path": "INSTALL.md",
"chars": 1057,
"preview": "# Detailed install instructions for Mackup\n\nThere are 2 ways to run mackup:\n\n1. Install it with Homebrew (macOS and GNU/"
},
{
"path": "LICENSE",
"chars": 35140,
"preview": " GNU GENERAL PUBLIC LICENSE\n Version 3, 29 June 2007\n\n Copyright (C) 2007 Free "
},
{
"path": "Makefile",
"chars": 515,
"preview": "lint:\n\tmarkdownlint -c .markdownlint.yaml '**/*.md'\n\nruff:\n\truff check .\n\nty:\n\tuv run ty check\n\ntest:\n\tuv run pytest\n\nco"
},
{
"path": "README.md",
"chars": 35491,
"preview": "# Mackup™\n\n[](https://github.com/lra/mackup"
},
{
"path": "doc/.mackup/gnupg.cfg",
"chars": 164,
"preview": "[application]\nname = GnuPG\n\n[configuration_files]\n.gnupg/gpg-agent.conf\n.gnupg/gpg.conf\n.gnupg/secring.gpg\n.gnupg/trustd"
},
{
"path": "doc/.mackup/mackup.cfg",
"chars": 71,
"preview": "[application]\nname = Mackup\n\n[configuration_files]\n.mackup.cfg\n.mackup\n"
},
{
"path": "doc/.mackup/my-own-files.cfg",
"chars": 96,
"preview": "[application]\nname = Files and directories I want to sync\n\n[configuration_files]\nbin\nsrc/mackup\n"
},
{
"path": "doc/.mackup/ssh.cfg",
"chars": 53,
"preview": "[application]\nname = SSH\n\n[configuration_files]\n.ssh\n"
},
{
"path": "doc/.mackup.cfg",
"chars": 2161,
"preview": "#\n# Sample Mackup configuration file\n#\n\n# You can specify the storage type Mackup will use to store your configuration\n#"
},
{
"path": "doc/ARCHITECTURE.md",
"chars": 8791,
"preview": "# Mackup Architecture\n\nThis document explains how Mackup works internally to help contributors\nunderstand the codebase.\n"
},
{
"path": "doc/README.md",
"chars": 8629,
"preview": "# Configuration\n\n> 💡 **New to Mackup?** Check out the\n> [Architecture Guide](ARCHITECTURE.md) to understand how Mackup w"
},
{
"path": "doc/configuration_merge_guide.md",
"chars": 6472,
"preview": "# Guide for Merging Configurations Across Machines\n\nThis guide is for users who want to combine configuration settings f"
},
{
"path": "doc/develop.md",
"chars": 1043,
"preview": "# Develop\n\n```sh\n# Install the tool for dependency management and packaging in Python\npipx install uv\n\n# You can now edi"
},
{
"path": "doc/release.md",
"chars": 279,
"preview": "# Release\n\n1. Increment the version in [pyproject.toml](../pyproject.toml)\n1. Run `uv sync -U`\n1. `git commit` with the "
},
{
"path": "doc/syncing-private-keys.md",
"chars": 316,
"preview": "# Syncing private keys\n\nBy default private keys for OpenSSH and GnuPG are NOT sycned.\nYou can sync your private keys if "
},
{
"path": "pyproject.toml",
"chars": 4019,
"preview": "[project]\nname = \"mackup\"\nversion = \"0.10.2\"\ndescription = \"Backup and keep your application settings in sync.\"\nreadme ="
},
{
"path": "snap/snapcraft.yaml",
"chars": 945,
"preview": "name: mackup\nbase: core24\nadopt-info: mackup\ntitle: Mackup\nsummary: Keep your application settings in sync\ndescription: "
},
{
"path": "src/mackup/__init__.py",
"chars": 26,
"preview": "\"\"\"The Mackup Package.\"\"\"\n"
},
{
"path": "src/mackup/application.py",
"chars": 15889,
"preview": "\"\"\"\nApplication Profile.\n\nAn Application Profile contains all the information about an application in\nMackup. Name, file"
},
{
"path": "src/mackup/applications/1password-4.cfg",
"chars": 154,
"preview": "[application]\nname = 1Password 4\n\n[configuration_files]\nLibrary/Preferences/com.agilebits.onepassword4.plist\nLibrary/Pre"
},
{
"path": "src/mackup/applications/2do.cfg",
"chars": 97,
"preview": "[application]\nname = 2Do\n\n[configuration_files]\nLibrary/Preferences/com.guidedways.TodoMac.plist\n"
},
{
"path": "src/mackup/applications/ack.cfg",
"chars": 55,
"preview": "[application]\nname = Ack\n\n[configuration_files]\n.ackrc\n"
},
{
"path": "src/mackup/applications/act.cfg",
"chars": 55,
"preview": "[application]\nname = act\n\n[configuration_files]\n.actrc\n"
},
{
"path": "src/mackup/applications/activitywatch.cfg",
"chars": 101,
"preview": "[application]\nname = Activity Watch\n\n[configuration_files]\nLibrary/Application Support/activitywatch\n"
},
{
"path": "src/mackup/applications/adium.cfg",
"chars": 132,
"preview": "[application]\nname = Adium\n\n[configuration_files]\nLibrary/Application Support/Adium 2.0\nLibrary/Preferences/com.adiumX.a"
},
{
"path": "src/mackup/applications/adobe-camera-raw.cfg",
"chars": 105,
"preview": "[application]\nname = Adobe Camera Raw\n\n[configuration_files]\nLibrary/Application Support/Adobe/CameraRaw\n"
},
{
"path": "src/mackup/applications/aerc.cfg",
"chars": 74,
"preview": "[application]\nname = aerc\n\n[configuration_files]\nLibrary/Preferences/aerc\n"
},
{
"path": "src/mackup/applications/aerospace.cfg",
"chars": 122,
"preview": "[application]\nname = aerospace\n\n[configuration_files]\n.aerospace.toml\n\n[xdg_configuration_files]\naerospace/aerospace.tom"
},
{
"path": "src/mackup/applications/affinity-designer.cfg",
"chars": 137,
"preview": "[application]\nname = Affinity Designer\n\n[configuration_files]\nLibrary/Containers/Affinity Designer/Data/Library/Applicat"
},
{
"path": "src/mackup/applications/affinity-photo.cfg",
"chars": 131,
"preview": "[application]\nname = Affinity Photo\n\n[configuration_files]\nLibrary/Containers/Affinity Photo/Data/Library/Application Su"
},
{
"path": "src/mackup/applications/affinity-publisher.cfg",
"chars": 139,
"preview": "[application]\nname = Affinity Publisher\n\n[configuration_files]\nLibrary/Containers/Affinity Publisher/Data/Library/Applic"
},
{
"path": "src/mackup/applications/airflow.cfg",
"chars": 136,
"preview": "[application]\nname = Airflow\n\n[configuration_files]\nLibrary/Preferences/com.bitcavehq.Airflow.plist\nLibrary/Application "
},
{
"path": "src/mackup/applications/airmail.cfg",
"chars": 105,
"preview": "[application]\nname = Airmail\n\n[configuration_files]\nLibrary/Containers/it.bloop.airmail2/Container.plist\n"
},
{
"path": "src/mackup/applications/akamai-cli.cfg",
"chars": 63,
"preview": "[application]\nname = Akamai-CLI\n\n[configuration_files]\n.edgerc\n"
},
{
"path": "src/mackup/applications/alacritty.cfg",
"chars": 161,
"preview": "[application]\nname = Alacritty\n\n[configuration_files]\n.alacritty.yml\n.alacritty.toml\n\n[xdg_configuration_files]\nalacritt"
},
{
"path": "src/mackup/applications/aldente.cfg",
"chars": 146,
"preview": "[application]\nname = AlDente\n\n[configuration_files]\nLibrary/Application Support/AlDente\nLibrary/Preferences/com.apphouse"
},
{
"path": "src/mackup/applications/alt-tab.cfg",
"chars": 102,
"preview": "[application]\nname = AltTab\n\n[configuration_files]\nLibrary/Preferences/com.lwouis.alt-tab-macos.plist\n"
},
{
"path": "src/mackup/applications/amethyst.cfg",
"chars": 150,
"preview": "[application]\nname = Amethyst\n\n[configuration_files]\nLibrary/Preferences/com.amethyst.Amethyst.plist\n\n[xdg_configuration"
},
{
"path": "src/mackup/applications/ancient-domains-of-mystery.cfg",
"chars": 82,
"preview": "[application]\nname = Ancient Domains of Mystery\n\n[configuration_files]\n.adom.data\n"
},
{
"path": "src/mackup/applications/androidstudio-13.cfg",
"chars": 145,
"preview": "[application]\nname = Android Studio 1.3\n\n[configuration_files]\nLibrary/Application Support/AndroidStudio1.3\nLibrary/Pref"
},
{
"path": "src/mackup/applications/ansible.cfg",
"chars": 74,
"preview": "[application]\nname = Ansible\n\n[configuration_files]\n.ansible\n.ansible.cfg\n"
},
{
"path": "src/mackup/applications/appcleaner.cfg",
"chars": 173,
"preview": "[application]\nname = AppCleaner\n\n[configuration_files]\nLibrary/Preferences/net.freemacsoft.AppCleaner.plist\nLibrary/Pref"
},
{
"path": "src/mackup/applications/appcode-2.cfg",
"chars": 122,
"preview": "[application]\nname = AppCode 2\n\n[configuration_files]\nLibrary/Application Support/appCode20\nLibrary/Preferences/appCode2"
},
{
"path": "src/mackup/applications/appcode-3.cfg",
"chars": 122,
"preview": "[application]\nname = AppCode 3\n\n[configuration_files]\nLibrary/Application Support/appCode30\nLibrary/Preferences/appCode3"
},
{
"path": "src/mackup/applications/appcode-31.cfg",
"chars": 124,
"preview": "[application]\nname = AppCode 3.1\n\n[configuration_files]\nLibrary/Application Support/appCode31\nLibrary/Preferences/appCod"
},
{
"path": "src/mackup/applications/appcode-32.cfg",
"chars": 124,
"preview": "[application]\nname = AppCode 3.2\n\n[configuration_files]\nLibrary/Application Support/AppCode32\nLibrary/Preferences/AppCod"
},
{
"path": "src/mackup/applications/apple-music.cfg",
"chars": 165,
"preview": "[application]\nname = Apple Music\n\n[configuration_files]\nLibrary/Music/Scripts\nLibrary/Preferences/com.apple.Music.eq.pli"
},
{
"path": "src/mackup/applications/apptivate.cfg",
"chars": 100,
"preview": "[application]\nname = Apptivate\n\n[configuration_files]\nLibrary/Application Support/Apptivate/hotkeys\n"
},
{
"path": "src/mackup/applications/arara.cfg",
"chars": 85,
"preview": "[application]\nname = Arara\n\n[configuration_files]\n.araraconfig.yaml\nararaconfig.yaml\n"
},
{
"path": "src/mackup/applications/aria2c.cfg",
"chars": 91,
"preview": "[application]\nname = aria2c\n\n[configuration_files]\n.aria2\n\n[xdg_configuration_files]\naria2\n"
},
{
"path": "src/mackup/applications/arm.cfg",
"chars": 59,
"preview": "[application]\nname = Arm\n\n[configuration_files]\n.arm/armrc\n"
},
{
"path": "src/mackup/applications/asciinema.cfg",
"chars": 68,
"preview": "[application]\nname = asciinema\n\n[xdg_configuration_files]\nasciinema\n"
},
{
"path": "src/mackup/applications/asdf.cfg",
"chars": 176,
"preview": "[application]\nname = asdf\n\n[configuration_files]\n.asdfrc\n.default-gems\n.default-npm-packages\n.default-python-packages\n.d"
},
{
"path": "src/mackup/applications/aspell.cfg",
"chars": 96,
"preview": "[application]\nname = Aspell\n\n[configuration_files]\n.aspell.conf\n.aspell.en.prepl\n.aspell.en.pws\n"
},
{
"path": "src/mackup/applications/astyle.cfg",
"chars": 69,
"preview": "[application]\nname = Artistic Style\n\n[configuration_files]\n.astylerc\n"
},
{
"path": "src/mackup/applications/atlantis.cfg",
"chars": 90,
"preview": "[application]\nname = Atlantis\n\n[configuration_files]\nLibrary/Application Support/Atlantis\n"
},
{
"path": "src/mackup/applications/atom.cfg",
"chars": 198,
"preview": "[application]\nname = Atom\n\n[configuration_files]\n\nLibrary/Preferences/com.github.atom.plist\n.atom/config.cson\n.atom/init"
},
{
"path": "src/mackup/applications/audacious.cfg",
"chars": 170,
"preview": "[application]\nname = Audacious\n\n[xdg_configuration_files]\naudacious/config\naudacious/plugin-registry\naudacious/playlists"
},
{
"path": "src/mackup/applications/auskey.cfg",
"chars": 99,
"preview": "[application]\nname = AusKey\n\n[configuration_files]\nLibrary/Application Support/AUSkey/keystore.xml\n"
},
{
"path": "src/mackup/applications/autokey.cfg",
"chars": 64,
"preview": "[application]\nname = Autokey\n\n[xdg_configuration_files]\nautokey\n"
},
{
"path": "src/mackup/applications/awareness.cfg",
"chars": 106,
"preview": "[application]\nname = Awareness\n\n[configuration_files]\nLibrary/Preferences/com.futureproof.awareness.plist\n"
},
{
"path": "src/mackup/applications/aws.cfg",
"chars": 57,
"preview": "[application]\nname = AWS CLI\n\n[configuration_files]\n.aws\n"
},
{
"path": "src/mackup/applications/azure.cfg",
"chars": 61,
"preview": "[application]\nname = Azure CLI\n\n[configuration_files]\n.azure\n"
},
{
"path": "src/mackup/applications/b-ryan_powerline-shell.cfg",
"chars": 99,
"preview": "[application]\nname = Powerline Shell Prompt\n\n[xdg_configuration_files]\npowerline-shell/config.json\n"
},
{
"path": "src/mackup/applications/bartender.cfg",
"chars": 240,
"preview": "[application]\nname = Bartender\n\n[configuration_files]\nLibrary/Preferences/com.surteesstudios.Bartender.plist\nLibrary/Pre"
},
{
"path": "src/mackup/applications/base.cfg",
"chars": 251,
"preview": "[application]\nname = Base\n\n[configuration_files]\nLibrary/Containers/uk.co.menial.Base/Data/Library/Preferences/uk.co.men"
},
{
"path": "src/mackup/applications/bash-it.cfg",
"chars": 69,
"preview": "[application]\nname = Bash it\n\n[configuration_files]\n.bash_it/enabled\n"
},
{
"path": "src/mackup/applications/bash.cfg",
"chars": 137,
"preview": "[application]\nname = Bash\n\n[configuration_files]\n.aliases\n.bash_aliases\n.bash_login\n.bash_logout\n.bashrc\n.profile\n.bash_"
},
{
"path": "src/mackup/applications/bat.cfg",
"chars": 87,
"preview": "[application]\nname = Bat\n\n[xdg_configuration_files]\nbat/config\nbat/syntaxes\nbat/themes\n"
},
{
"path": "src/mackup/applications/bc.cfg",
"chars": 53,
"preview": "[application]\nname = bc\n\n[configuration_files]\n.bcrc\n"
},
{
"path": "src/mackup/applications/beatport-pro.cfg",
"chars": 108,
"preview": "[application]\nname = Beatport Pro\n\n[configuration_files]\nLibrary/Preferences/com.beatport.BeatportPro.plist\n"
},
{
"path": "src/mackup/applications/beets.cfg",
"chars": 72,
"preview": "[application]\nname = Beets\n\n[xdg_configuration_files]\nbeets/config.yaml\n"
},
{
"path": "src/mackup/applications/bettersnaptool.cfg",
"chars": 157,
"preview": "[application]\nname = BetterSnapTool\n\n[configuration_files]\nLibrary/Preferences/com.hegenberg.BetterSnapTool.plist\nLibrar"
},
{
"path": "src/mackup/applications/bettertouchtool.cfg",
"chars": 501,
"preview": "[application]\nname = BetterTouchTool\n\n[configuration_files]\nLibrary/Application Support/BetterTouchTool/bettertouchtool."
},
{
"path": "src/mackup/applications/beyond-compare.cfg",
"chars": 348,
"preview": "[application]\nname = Beyond Compare\n\n[configuration_files]\nLibrary/Preferences/com.ScooterSoftware.BeyondCompare.plist\nL"
},
{
"path": "src/mackup/applications/bibdesk.cfg",
"chars": 143,
"preview": "[application]\nname = BibDesk\n\n[configuration_files]\nLibrary/Preferences/edu.ucsd.cs.mmccrack.bibdesk.plist\nLibrary/Appli"
},
{
"path": "src/mackup/applications/billings-pro-server-admin.cfg",
"chars": 136,
"preview": "[application]\nname = Billings Pro Server Admin\n\n[configuration_files]\nLibrary/Preferences/com.marketcircle.BillingsProSe"
},
{
"path": "src/mackup/applications/bitbar.cfg",
"chars": 96,
"preview": "[application]\nname = BitBar\n\n[configuration_files]\nLibrary/Preferences/com.matryer.BitBar.plist\n"
},
{
"path": "src/mackup/applications/bitchx.cfg",
"chars": 73,
"preview": "[application]\nname = Bitchx\n\n[configuration_files]\n.bitchxrc\n.ircservers\n"
},
{
"path": "src/mackup/applications/blackfire.cfg",
"chars": 69,
"preview": "[application]\nname = Blackfire\n\n[configuration_files]\n.blackfire.ini\n"
},
{
"path": "src/mackup/applications/blender.cfg",
"chars": 123,
"preview": "[application]\nname = Blender\n\n[configuration_files]\nLibrary/Application Support/Blender\n\n[xdg_configuration_files]\nblend"
},
{
"path": "src/mackup/applications/blesh.cfg",
"chars": 58,
"preview": "[application]\nname = ble.sh\n\n[configuration_files]\n.blerc\n"
},
{
"path": "src/mackup/applications/boto.cfg",
"chars": 55,
"preview": "[application]\nname = Boto\n\n[configuration_files]\n.boto\n"
},
{
"path": "src/mackup/applications/boxer.cfg",
"chars": 122,
"preview": "[application]\nname = Boxer\n\n[configuration_files]\nLibrary/Preferences/net.washboardabs.boxer.plist\nApplications/DOS Game"
},
{
"path": "src/mackup/applications/brackets.cfg",
"chars": 137,
"preview": "[application]\nname = Brackets\n\n[configuration_files]\nLibrary/Application Support/Brackets\nLibrary/Preferences/io.bracket"
},
{
"path": "src/mackup/applications/brave.cfg",
"chars": 126,
"preview": "[application]\nname = Brave\n\n[configuration_files]\nLibrary/Application Support/BraveSoftware/Brave-Browser/Default/Prefer"
},
{
"path": "src/mackup/applications/btop.cfg",
"chars": 58,
"preview": "[application]\nname = btop\n\n[xdg_configuration_files]\nbtop\n"
},
{
"path": "src/mackup/applications/bump.cfg",
"chars": 60,
"preview": "[application]\nname = Bump\n\n[configuration_files]\n.bump.json\n"
},
{
"path": "src/mackup/applications/bundler.cfg",
"chars": 67,
"preview": "[application]\nname = Bundler\n\n[configuration_files]\n.bundle/config\n"
},
{
"path": "src/mackup/applications/byobu.cfg",
"chars": 367,
"preview": "[application]\nname = Byobu\n\n[configuration_files]\n.byobu/.screenrc\n.byobu/.tmux.conf\n.byobu/backend\n.byobu/color\n.byobu/"
},
{
"path": "src/mackup/applications/caffeine.cfg",
"chars": 165,
"preview": "[application]\nname = Caffeine\n\n[configuration_files]\nLibrary/Preferences/com.lightheadsw.Caffeine.plist\nLibrary/Preferen"
},
{
"path": "src/mackup/applications/calibre.cfg",
"chars": 115,
"preview": "[application]\nname = Calibre\n\n[configuration_files]\nLibrary/Preferences/calibre\n\n[xdg_configuration_files]\ncalibre\n"
},
{
"path": "src/mackup/applications/capture-one.cfg",
"chars": 96,
"preview": "[application]\nname = Capture One\n\n[configuration_files]\nLibrary/Application Support/Capture One\n"
},
{
"path": "src/mackup/applications/cartographica.cfg",
"chars": 154,
"preview": "[application]\nname = Cartographica\n\n[configuration_files]\nLibrary/Application Support/Cartographica\nLibrary/Preferences/"
},
{
"path": "src/mackup/applications/cerebro.cfg",
"chars": 207,
"preview": "[application]\nname = Cerebro\n\n[configuration_files]\nLibrary/Application Support/Cerebro/config.json\nLibrary/Application "
},
{
"path": "src/mackup/applications/charles.cfg",
"chars": 132,
"preview": "[application]\nname = Charles\n\n[configuration_files]\nLibrary/Application Support/Charles\nLibrary/Preferences/com.xk72.cha"
},
{
"path": "src/mackup/applications/cheat.cfg",
"chars": 99,
"preview": "[application]\nname = Cheat\n\n[configuration_files]\n.cheat\n\n[xdg_configuration_files]\ncheat/conf.yml\n"
},
{
"path": "src/mackup/applications/chef.cfg",
"chars": 55,
"preview": "[application]\nname = Chef\n\n[configuration_files]\n.chef\n"
},
{
"path": "src/mackup/applications/chicken.cfg",
"chars": 102,
"preview": "[application]\nname = Chicken\n\n[configuration_files]\nLibrary/Preferences/net.sourceforge.chicken.plist\n"
},
{
"path": "src/mackup/applications/choosy.cfg",
"chars": 103,
"preview": "[application]\nname = Choosy\n\n[configuration_files]\nLibrary/Application Support/Choosy/behaviours.plist\n"
},
{
"path": "src/mackup/applications/chunkwm.cfg",
"chars": 80,
"preview": "[application]\nname = chunkwm\n\n[configuration_files]\n.chunkwmrc\n.chunkwm_plugins\n"
},
{
"path": "src/mackup/applications/cider.cfg",
"chars": 57,
"preview": "[application]\nname = Cider\n\n[configuration_files]\n.cider\n"
},
{
"path": "src/mackup/applications/clashx.cfg",
"chars": 61,
"preview": "[application]\nname = ClashX\n\n[xdg_configuration_files]\nclash\n"
},
{
"path": "src/mackup/applications/clasp.cfg",
"chars": 64,
"preview": "[application]\nname = Clasp\n\n[configuration_files]\n.clasprc.json\n"
},
{
"path": "src/mackup/applications/claude-code.cfg",
"chars": 325,
"preview": "[application]\nname = Claude Code\n\n[configuration_files]\n.claude/agents\n.claude/CLAUDE.md\n.claude/hooks\n.claude/keybindin"
},
{
"path": "src/mackup/applications/cleanshot.cfg",
"chars": 159,
"preview": "[application]\nname = CleanShot\n\n[configuration_files]\nLibrary/Preferences/com.getcleanshot.app-setapp.plist\nLibrary/Pref"
},
{
"path": "src/mackup/applications/clementine.cfg",
"chars": 114,
"preview": "[application]\nname = Clementine\n\n[configuration_files]\nLibrary/Preferences/org.clementine-player.Clementine.plist\n"
},
{
"path": "src/mackup/applications/clion.cfg",
"chars": 222,
"preview": "[application]\nname = CLion\n\n[configuration_files]\nLibrary/Preferences/CLion2016.2\nLibrary/Application Support/CLion2016."
},
{
"path": "src/mackup/applications/clipmenu.cfg",
"chars": 137,
"preview": "[application]\nname = ClipMenu\n\n[configuration_files]\nLibrary/Application Support/ClipMenu\nLibrary/Preferences/com.naotak"
},
{
"path": "src/mackup/applications/clipy.cfg",
"chars": 96,
"preview": "[application]\nname = Clipy\n\n[configuration_files]\nLibrary/Preferences/com.clipy-app.Clipy.plist\n"
},
{
"path": "src/mackup/applications/cloudapp.cfg",
"chars": 108,
"preview": "[application]\nname = CloudApp\n\n[configuration_files]\nLibrary/Preferences/com.linebreak.CloudAppMacOSX.plist\n"
},
{
"path": "src/mackup/applications/coda-2.cfg",
"chars": 128,
"preview": "[application]\nname = Coda 2\n\n[configuration_files]\nLibrary/Application Support/Coda 2\nLibrary/Preferences/com.panic.Coda"
},
{
"path": "src/mackup/applications/codex.cfg",
"chars": 103,
"preview": "[application]\nname = Codex\n\n[configuration_files]\n.codex/config.toml\n.codex/auth.json\n.codex/AGENTS.md\n"
},
{
"path": "src/mackup/applications/colloquy.cfg",
"chars": 130,
"preview": "[application]\nname = Colloquy\n\n[configuration_files]\nLibrary/Preferences/info.colloquy.plist\nLibrary/Application Support"
},
{
"path": "src/mackup/applications/colorschemer-studio-2.cfg",
"chars": 158,
"preview": "[application]\nname = ColorSchemer Studio 2\n\n[configuration_files]\nLibrary/Preferences/com.colorschemer.studio2.plist\nLib"
},
{
"path": "src/mackup/applications/colorslurp.cfg",
"chars": 197,
"preview": "[application]\nname = ColorSlurp\n\n[configuration_files]\nLibrary/Preferences/com.IdeaPunch.ColorSlurp.plist\nLibrary/Contai"
},
{
"path": "src/mackup/applications/colorsync.cfg",
"chars": 81,
"preview": "[application]\nname = ColorSync\n\n[configuration_files]\nLibrary/ColorSync/Profiles\n"
},
{
"path": "src/mackup/applications/composer.cfg",
"chars": 119,
"preview": "[application]\nname = composer\n\n[configuration_files]\n.composer/auth.json\n.composer/config.json\n.composer/composer.json\n"
},
{
"path": "src/mackup/applications/concentrate.cfg",
"chars": 116,
"preview": "[application]\nname = Concentrate\n\n[configuration_files]\nLibrary/Application Support/Concentrate/Concentrate.sqlite3\n"
},
{
"path": "src/mackup/applications/conky.cfg",
"chars": 59,
"preview": "[application]\nname = Conky\n\n[configuration_files]\n.conkyrc\n"
},
{
"path": "src/mackup/applications/consular.cfg",
"chars": 100,
"preview": "[application]\nname = Consular\n\n[configuration_files]\n.consularc\n\n[xdg_configuration_files]\nconsular\n"
},
{
"path": "src/mackup/applications/contexts.cfg",
"chars": 107,
"preview": "[application]\nname = Contexts\n\n[configuration_files]\nLibrary/Preferences/com.contextsformac.Contexts.plist\n"
},
{
"path": "src/mackup/applications/controlplane.cfg",
"chars": 110,
"preview": "[application]\nname = ControlPlane\n\n[configuration_files]\nLibrary/Preferences/com.dustinrue.ControlPlane.plist\n"
},
{
"path": "src/mackup/applications/copyq.cfg",
"chars": 60,
"preview": "[application]\nname = CopyQ\n\n[xdg_configuration_files]\ncopyq\n"
},
{
"path": "src/mackup/applications/cord.cfg",
"chars": 82,
"preview": "[application]\nname = CoRD\n\n[configuration_files]\nLibrary/Application Support/CoRD\n"
},
{
"path": "src/mackup/applications/coteditor.cfg",
"chars": 142,
"preview": "[application]\nname = CotEditor\n\n[configuration_files]\nLibrary/Application Support/CotEditor\nLibrary/Preferences/com.cote"
},
{
"path": "src/mackup/applications/ctags.cfg",
"chars": 66,
"preview": "[application]\nname = Ctags\n\n[configuration_files]\n.ctags\n.ctags.d\n"
},
{
"path": "src/mackup/applications/curl.cfg",
"chars": 64,
"preview": "[application]\nname = Curl\n\n[configuration_files]\n.netrc\n.curlrc\n"
},
{
"path": "src/mackup/applications/cursor.cfg",
"chars": 314,
"preview": "[application]\nname = Cursor\n\n[configuration_files]\nLibrary/Application Support/Cursor/User/snippets\nLibrary/Application "
},
{
"path": "src/mackup/applications/cvim.cfg",
"chars": 57,
"preview": "[application]\nname = cVim\n\n[configuration_files]\n.cvimrc\n"
},
{
"path": "src/mackup/applications/cyberduck.cfg",
"chars": 390,
"preview": "[application]\nname = Cyberduck\n\n[configuration_files]\n# based on https://trac.cyberduck.io/wiki/help/en/faq#Preferencesa"
},
{
"path": "src/mackup/applications/daisydisk.cfg",
"chars": 173,
"preview": "[application]\nname = DaisyDisk\n\n[configuration_files]\nLibrary/Application Support/DaisyDisk/License.DaisyDisk\nLibrary/Pr"
},
{
"path": "src/mackup/applications/dash.cfg",
"chars": 244,
"preview": "[application]\nname = Dash\n\n[configuration_files]\nLibrary/Application Support/Dash/library.dash\nLibrary/Application Suppo"
},
{
"path": "src/mackup/applications/datagrip.cfg",
"chars": 584,
"preview": "[application]\nname = DataGrip\n\n[configuration_files]\nLibrary/Application Support/DataGrip2017.3\nLibrary/Preferences/Data"
},
{
"path": "src/mackup/applications/day-o.cfg",
"chars": 97,
"preview": "[application]\nname = Day-O\n\n[configuration_files]\nLibrary/Preferences/com.shauninman.Day-O.plist\n"
},
{
"path": "src/mackup/applications/dbeaver.cfg",
"chars": 176,
"preview": "[application]\nname = DBeaver\n\n[configuration_files]\nLibrary/DBeaverData/workspace6/.metadata/.plugins/org.eclipse.core.r"
},
{
"path": "src/mackup/applications/dbvisualizer.cfg",
"chars": 64,
"preview": "[application]\nname = DbVisualizer\n\n[configuration_files]\n.dbvis\n"
},
{
"path": "src/mackup/applications/deal-alert.cfg",
"chars": 105,
"preview": "[application]\nname = Deal Alert\n\n[configuration_files]\nLibrary/Preferences/com.LittleFin.DealAlert.plist\n"
},
{
"path": "src/mackup/applications/deepin-dde-dock.cfg",
"chars": 85,
"preview": "[application]\nname = deepin-dde-dock\n\n[xdg_configuration_files]\ndeepin/dde-dock.conf\n"
},
{
"path": "src/mackup/applications/deepin-dde-file-manager.cfg",
"chars": 101,
"preview": "[application]\nname = deepin-dde-file-manager\n\n[xdg_configuration_files]\ndeepin/dde-file-manager.json\n"
},
{
"path": "src/mackup/applications/deepin-terminal.cfg",
"chars": 99,
"preview": "[application]\nname = deepin-terminal\n\n[xdg_configuration_files]\ndeepin/deepin-terminal/config.conf\n"
},
{
"path": "src/mackup/applications/default-folder-x.cfg",
"chars": 251,
"preview": "[application]\nname = Default Folder X\n\n[configuration_files]\nLibrary/Preferences/com.stclairsoft.DefaultFolderX.favorite"
},
{
"path": "src/mackup/applications/defaultkeybinding.cfg",
"chars": 105,
"preview": "[application]\nname = DefaultKeyBinding\n\n[configuration_files]\nLibrary/KeyBindings/DefaultKeyBinding.dict\n"
},
{
"path": "src/mackup/applications/devilspie.cfg",
"chars": 67,
"preview": "[application]\nname = Devil's Pie\n\n[configuration_files]\n.devilspie\n"
},
{
"path": "src/mackup/applications/devilspie2.cfg",
"chars": 70,
"preview": "[application]\nname = Devilspie2\n\n[xdg_configuration_files]\ndevilspie2\n"
},
{
"path": "src/mackup/applications/dig.cfg",
"chars": 55,
"preview": "[application]\nname = dig\n\n[configuration_files]\n.digrc\n"
},
{
"path": "src/mackup/applications/divvy.cfg",
"chars": 143,
"preview": "[application]\nname = Divvy\n\n[configuration_files]\nLibrary/Preferences/com.mizage.direct.Divvy.plist\nLibrary/Preferences/"
},
{
"path": "src/mackup/applications/docker.cfg",
"chars": 91,
"preview": "[application]\nname = Docker\n\n[configuration_files]\n.docker/config.json\n.docker/daemon.json\n"
},
{
"path": "src/mackup/applications/dolphin.cfg",
"chars": 138,
"preview": "[application]\nname = Dolphin\n\n[configuration_files]\nLibrary/Application Support/Dolphin\nLibrary/Preferences/org.dolphin-"
},
{
"path": "src/mackup/applications/doom-emacs.cfg",
"chars": 95,
"preview": "[application]\nname = Doom Emacs\n\n[configuration_files]\n.doom.d\n\n[xdg_configuration_files]\ndoom\n"
},
{
"path": "src/mackup/applications/doublecmd.cfg",
"chars": 155,
"preview": "[application]\nname = Double Commander\n\n[xdg_configuration_files]\ndoublecmd/wfx.ini\ndoublecmd/doublecmd.ext\ndoublecmd/sho"
},
{
"path": "src/mackup/applications/doxie.cfg",
"chars": 95,
"preview": "[application]\nname = Doxie\n\n[configuration_files]\nLibrary/Preferences/com.getdoxie.doxie.plist\n"
},
{
"path": "src/mackup/applications/dozer.cfg",
"chars": 95,
"preview": "[application]\nname = Dozer\n\n[configuration_files]\nLibrary/Preferences/com.mortennn.Dozer.plist\n"
},
{
"path": "src/mackup/applications/draft.cfg",
"chars": 69,
"preview": "[application]\nname = Draft\n\n[configuration_files]\n.draft/config.toml\n"
},
{
"path": "src/mackup/applications/droplr.cfg",
"chars": 99,
"preview": "[application]\nname = Droplr\n\n[configuration_files]\nLibrary/Preferences/com.droplr.droplr-mac.plist\n"
},
{
"path": "src/mackup/applications/dropzone.cfg",
"chars": 142,
"preview": "[application]\nname = Dropzone 3\n\n[configuration_files]\nLibrary/Application Support/Dropzone 3\nLibrary/Preferences/com.ap"
},
{
"path": "src/mackup/applications/drush.cfg",
"chars": 57,
"preview": "[application]\nname = Drush\n\n[configuration_files]\n.drush\n"
},
{
"path": "src/mackup/applications/editorconfig.cfg",
"chars": 71,
"preview": "[application]\nname = EditorConfig\n\n[configuration_files]\n.editorconfig\n"
},
{
"path": "src/mackup/applications/electrum.cfg",
"chars": 70,
"preview": "[application]\nname = Electrum\n\n[configuration_files]\n.electrum/config\n"
},
{
"path": "src/mackup/applications/emacs.cfg",
"chars": 99,
"preview": "[application]\nname = Emacs\n\n[configuration_files]\n.emacs\n.emacs.d\n\n[xdg_configuration_files]\nemacs\n"
},
{
"path": "src/mackup/applications/enjoyable.cfg",
"chars": 107,
"preview": "[application]\nname = Enjoyable\n\n[configuration_files]\nLibrary/Preferences/com.yukkurigames.Enjoyable.plist\n"
},
{
"path": "src/mackup/applications/environmental-station-alpha.cfg",
"chars": 116,
"preview": "[application]\nname = Environmental Station Alpha\n\n[configuration_files]\nLibrary/Application Support/MMFApplications\n"
},
{
"path": "src/mackup/applications/eqmac-2.cfg",
"chars": 96,
"preview": "[application]\nname = eqMac2\n\n[configuration_files]\nLibrary/Preferences/com.bitgapp.eqMac2.plist\n"
},
{
"path": "src/mackup/applications/eslint.cfg",
"chars": 132,
"preview": "[application]\nname = ESLint\n\n[configuration_files]\n.eslintrc.js\n.eslintrc.yaml\n.eslintrc.yml\n.eslintrc.json\n.eslintrc\n.e"
},
{
"path": "src/mackup/applications/espanso.cfg",
"chars": 151,
"preview": "[application]\nname = espanso\n\n[configuration_files]\nLibrary/Preferences/espanso\nLibrary/Application Support/espanso\n\n[xd"
},
{
"path": "src/mackup/applications/exercism.cfg",
"chars": 114,
"preview": "[application]\nname = Exercism\n\n[configuration_files]\n.exercism\n.exercism.json\n\n[xdg_configuration_files]\nexercism\n"
},
{
"path": "src/mackup/applications/expandrive.cfg",
"chars": 184,
"preview": "[application]\nname = ExpanDrive\n\n[configuration_files]\nLibrary/Application Support/ExpanDrive\nPreferences/com.expandrive"
},
{
"path": "src/mackup/applications/factorio.cfg",
"chars": 295,
"preview": "[application]\nname = Factorio\n\n[configuration_files]\nLibrary/Application Support/factorio/config\nLibrary/Application Sup"
},
{
"path": "src/mackup/applications/factory-droid.cfg",
"chars": 192,
"preview": "[application]\nname = Factory Droid\n\n[configuration_files]\n.factory/commands\n.factory/droids\n.factory/AGENTS.md\n.factory/"
},
{
"path": "src/mackup/applications/fantastical.cfg",
"chars": 234,
"preview": "[application]\nname = Fantastical\n\n[configuration_files]\n# Used by Fantastical 1 only.\nLibrary/Preferences/com.flexibits."
},
{
"path": "src/mackup/applications/fasd.cfg",
"chars": 63,
"preview": "[application]\nname = fasd\n\n[configuration_files]\n.fasd\n.fasdrc\n"
},
{
"path": "src/mackup/applications/fastlane.cfg",
"chars": 75,
"preview": "[application]\nname = fastlane\n\n[configuration_files]\n.fastlane/completions\n"
},
{
"path": "src/mackup/applications/fastscripts.cfg",
"chars": 150,
"preview": "[application]\nname = FastScripts\n\n[configuration_files]\nLibrary/Preferences/com.red-sweater.fastscripts.plist\nLibrary/Ap"
},
{
"path": "src/mackup/applications/feeds.cfg",
"chars": 95,
"preview": "[application]\nname = Feeds\n\n[configuration_files]\nLibrary/Preferences/com.feedsapp.Feeds.plist\n"
},
{
"path": "src/mackup/applications/filezilla.cfg",
"chars": 163,
"preview": "[application]\nname = FileZilla\n\n[configuration_files]\n.filezilla\n\n[xdg_configuration_files]\nfilezilla/filezilla.xml\nfile"
},
{
"path": "src/mackup/applications/finicky.cfg",
"chars": 64,
"preview": "[application]\nname = finicky\n\n[configuration_files]\n.finicky.js\n"
},
{
"path": "src/mackup/applications/fish.cfg",
"chars": 134,
"preview": "[application]\nname = Fish\n\n[xdg_configuration_files]\nfish/config.fish\nfish/conf.d\nfish/fish_variables\nfish/functions\nfis"
},
{
"path": "src/mackup/applications/fisher.cfg",
"chars": 73,
"preview": "[application]\nname = Fisher\n\n[xdg_configuration_files]\nfish/fish_plugins\n"
},
{
"path": "src/mackup/applications/flake8.cfg",
"chars": 93,
"preview": "[application]\nname = flake8\n\n[configuration_files]\n.flake8\n\n[xdg_configuration_files]\nflake8\n"
},
{
"path": "src/mackup/applications/flameshot.cfg",
"chars": 82,
"preview": "[application]\nname = Flameshot\n\n[xdg_configuration_files]\nflameshot/flameshot.ini\n"
},
{
"path": "src/mackup/applications/flexget.cfg",
"chars": 118,
"preview": "[application]\nname = FlexGet\n\n[configuration_files]\n.flexget/config.yml\n\n[xdg_configuration_files]\nflexget/config.yml\n"
},
{
"path": "src/mackup/applications/flux.cfg",
"chars": 89,
"preview": "[application]\nname = Flux\n\n[configuration_files]\nLibrary/Preferences/org.herf.Flux.plist\n"
},
{
"path": "src/mackup/applications/focus.cfg",
"chars": 96,
"preview": "[application]\nname = Focus\n\n[configuration_files]\nLibrary/Application Support/Focus/default.cfg\n"
},
{
"path": "src/mackup/applications/fontconfig.cfg",
"chars": 70,
"preview": "[application]\nname = Fontconfig\n\n[xdg_configuration_files]\nfontconfig\n"
},
{
"path": "src/mackup/applications/fontexplorer-x.cfg",
"chars": 126,
"preview": "[application]\nname = FontExplorer X\n\n[configuration_files]\nLibrary/Application Support/Linotype/FontExplorer X\nFontExplo"
},
{
"path": "src/mackup/applications/forge.cfg",
"chars": 84,
"preview": "[application]\nname = Forge\n\n[configuration_files]\nLibrary/Application Support/Forge\n"
},
{
"path": "src/mackup/applications/fork.cfg",
"chars": 168,
"preview": "[application]\nname = Fork\n\n[configuration_files]\nLibrary/Application Support/com.DanPristupov.Fork/custom-commands.json\n"
}
]
// ... and 473 more files (download for full content)
About this extraction
This page contains the full source code of the lra/mackup GitHub repository, extracted and formatted as plain text for AI agents and large language models (LLMs). The extraction includes 673 files (333.2 KB), approximately 100.1k tokens, and a symbol index with 163 extracted functions, classes, methods, constants, and types. Use this with OpenClaw, Claude, ChatGPT, Cursor, Windsurf, or any other AI tool that accepts text input. You can copy the full output to your clipboard or download it as a .txt file.
Extracted by GitExtract — free GitHub repo to text converter for AI. Built by Nikandr Surkov.