{"id":44679838,"url":"https://github.com/mitoteam/mtsaver","last_synced_at":"2026-02-15T04:10:00.691Z","repository":{"id":144665845,"uuid":"541244491","full_name":"mitoteam/mtsaver","owner":"mitoteam","description":"Simple differential backup archives management (7-Zip based)","archived":false,"fork":false,"pushed_at":"2025-09-02T13:56:16.000Z","size":112,"stargazers_count":12,"open_issues_count":1,"forks_count":2,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-09-02T15:37:35.500Z","etag":null,"topics":["7-zip","backups","cli","command-line","differential-backups","golang","scoop"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mitoteam.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2022-09-25T16:57:50.000Z","updated_at":"2025-09-02T13:50:17.000Z","dependencies_parsed_at":null,"dependency_job_id":"46737186-5e67-4cd5-b914-1f8d27dc52fc","html_url":"https://github.com/mitoteam/mtsaver","commit_stats":null,"previous_names":[],"tags_count":22,"template":false,"template_full_name":null,"purl":"pkg:github/mitoteam/mtsaver","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mitoteam%2Fmtsaver","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mitoteam%2Fmtsaver/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mitoteam%2Fmtsaver/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mitoteam%2Fmtsaver/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mitoteam","download_url":"https://codeload.github.com/mitoteam/mtsaver/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mitoteam%2Fmtsaver/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29468395,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-15T01:01:38.065Z","status":"online","status_checked_at":"2026-02-15T02:00:07.449Z","response_time":118,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["7-zip","backups","cli","command-line","differential-backups","golang","scoop"],"created_at":"2026-02-15T04:10:00.139Z","updated_at":"2026-02-15T04:10:00.685Z","avatar_url":"https://github.com/mitoteam.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# mtsaver - differential backup archives management\n\n[![Go Report Card](https://goreportcard.com/badge/github.com/mitoteam/mtsaver)](https://goreportcard.com/report/github.com/mitoteam/mtsaver)\n![GitHub](https://img.shields.io/github/license/mitoteam/mtsaver)\n![GitHub code size](https://img.shields.io/github/languages/code-size/mitoteam/mtsaver)\n[![GitHub contributors](https://img.shields.io/github/contributors-anon/mitoteam/mtsaver)](https://github.com/mitoteam/mtsaver/graphs/contributors)\n[![Build\u0026Tests](https://github.com/mitoteam/mtsaver/actions/workflows/go.yml/badge.svg)](https://github.com/mitoteam/mtsaver/actions/workflows/go.yml)\n\n[![GitHub Version](https://img.shields.io/github/v/release/mitoteam/mtsaver?logo=github)](https://github.com/mitoteam/mtsaver)\n[![GitHub Release Date](https://img.shields.io/github/release-date/mitoteam/mtsaver)](https://github.com/mitoteam/mtsaver/releases)\n[![GitHub commit activity](https://img.shields.io/github/commit-activity/y/mitoteam/mtsaver)](https://github.com/mitoteam/mtsaver/commits)\n[![GitHub downloads](https://img.shields.io/github/downloads/mitoteam/mtsaver/total)](https://github.com/mitoteam/mtsaver/releases)\n\nSimple directory differential backups command-line utility. Based on 7-Zip archiver available for all major platforms.\n\n**Basics of differential backups idea**:\n\n1) Create full directory archive for first time backup is performed.\n2) Create \"_diff_\" archive with only changed, added (or removed!) files every next time...\n3) ...until certain criteria met (like \"_total diff archives size exceeds full archive size_\" or \"_diff archive is more than 20% of full archive size_\". Create new full archive at this point (so diffs will be small again).\n4) Remove outdated full and diff archives (according to retention settings).\n\n**Made to be simple yet powerful**:\n\n* No dependencies. Only 7-Zip is required! So no need for special software to explore or unpack created backups.\n* No database required: archiving and retention settings are in `.mtsaver.yml` file, other state info gathered on the fly from archives directory.\n* No installation required. Designed to be used as-is. Distributed as single executable file.\n* Both Windows and Linux, both x64 and x32 platforms support.\n* Flexible full/diff archives retention settings.\n* Ability to run some commands before or after backup creation.\n\nTrying to be self-explanatory (`mtsaver help`). More docs and manuals are being added.\n\n## Differential backup idea explained\n\nLets assume we have huge enough working directory (~12 Gb) we want to backup periodically (for example _daily_). And we want to have history of its changes (for example to be able to restore some file deleted forty two backups ago). Lets assume we want to keep history for _180 days_.\n\nDay by day we work with very small amount of files: some new documents added, rarely some old ones are edited, even more rarely something being deleted.\n\nPacking folder with 7-Zip creates 5Gb archive. Creating 180 archives (one per day) will give us something like this:\n\n```text\nbackup_2022-01-01.7z 5Gb\nbackup_2022-01-02.7z 5Gb\nbackup_2022-01-03.7z 5Gb\n...\nbackup_2022-03-14.7z 5Gb\nbackup_2022-03-15.7z 5.1Gb #something big was added in March, archives became bigger\nbackup_2022-03-16.7z 5.1Gb\nbackup_2022-03-17.7z 5.1Gb\n...\nbackup_2022-06-30.7z 5.1Gb\n---------------------------\ntotal: 180 files, 910.5 Gb\n```\n\nProblems: 1) it takes 910Gb of storage 2) takes a lot of time to create each archive 3) requires some manual file management to delete outdated archives beyond 180 days window.\n\n**mtsaver** is a solution to **pack only those new, changed or removed files** (thank you 7-Zip for anti-items support!) saving CPU-time and storage.\nThis is so called differential backups: we can have full archive with all files packed. Than we create differential archive containing only changed files.\n\n**mtsaver** allows very flexible setups. For example: Create full archive once per month. Each day create differential archive. If differential archive becomes larger than 50% of full archive do not wait till month end and create new full archive immediately. Store maximum 6 full archives and delete older ones with all differential archives attached. But keep full archives at least 180 days even if there are more than 6 of them.\n\nSo for example above we will end with following files set:\n\n```text\nbackup_2022-01-01_FULL.7z 5Gb\nbackup_2022-01-02_DIFF.7z 100Kb # changes since Jan-01 only!\nbackup_2022-01-03_DIFF.7z 150Kb # changes since Jan-01 only\n...\nbackup_2022-01-30_DIFF.7z 32Mb  # changes since Jan-01 only\nbackup_2022-01-31_FULL.7z 5Gb   # 30 days passed, new full archive created\nbackup_2022-02-01_DIFF.7z 110Kb # changes since last full archive only\n...\nbackup_2022-03-14_DIFF.7z 15Mb\nbackup_2022-03-15_DIFF.7z 2.8Gb # something big was added or a lot of documents\n                                # was changed, differential backup became more\n                                # than 50% of full backup\nbackup_2022-03-16_FULL.7z 5.1Gb # so next time new full archive created before 30 days\n                                # window passed\nbackup_2022-03-17_DIFF.7z 140Kb # changes since last full archive only\n...\nbackup_2022-06-30_DIFF.7z 51Mb  # changes since last full archive only\n--------------------------------\ntotal: 180 files, 37.5 Gb       # 6 planned full archives +1 unplanned in March (35.4Gb)\n                                # 173 differential archives each of 12Mb average\n```\n\nCompare **910.5 Gb** of storage space taken and **37.5 Gb**. We saved more than **95%** of storage space and yet we have **full half-year day-by-day history** for directory!\n\nCombine this with simple [syncthing](https://syncthing.net) setup for archives folder and you have differential cloud stored backups for free.\n\n## Installation\n\n### Using Scoop\n\nScoop is useful command-line installer and updater for Windows.\n\n* Install `scoop` (_if you have not already_): https://scoop.sh\n\n* Add bucket (_if you have not already_):\n\n```sh\nscoop bucket add mitoteam https://github.com/mitoteam/scoop-bucket\n```\n\n* Install:\n\n```sh\nscoop install mitoteam/mtsaver\n```\n\n* Update:\n\n```sh\nscoop update mtsaver\n```\n\n### Manual installation (Windows or Linux)\n\n* Download latest release from [Releases](https://github.com/mitoteam/mtsaver/releases) page.\n* Unpack with 7-zip.\n\n## Usage\n\nFirst you need to create a file with archiving settings: what to pack, where to pack, retention rules and so on. Just run `mtsaver init` in directory you want to backup. By default this file has `.mtsaver.yml` name. This will create `.mtsaver.yml` file with [all](app/job_settings.go) possible settings and explanations.\n\nOpen created `.mtsaver.yml` file and edit settings you need. You can remove untouched default settings from this file to keep things simple. Important settings are:\n\n* **archives_path** path to store created archives.\n* **keep_at_least** number of days to keep oldest full archive despite all other retention settings.\n\nDefault retention rules are: keep max 5 full archives, keep max 20 diff archives for each full archive, force full archive if previous diff size is 120% or more of latest full archive, do not store empty or unchanged diff archives, add _*.7z_ and _*.rar_ files to archives without compression (assuming they are already packed).\n\nRun `mtsaver run` command in directory with `.mtsaver.yml` file to create new backup archive. First time it will be created as full archive. Next runs depending on conditions and settings either full or diff archives will be created and old ones will be removed.\n\nYou can use any scheduler (`cron` or _Windows Task Scheduler_) to run this command regularly to have your directory backups.\n\nBy default mtsaver creates file `_mtsaver.log` file in archives directory with archiving logs. It has explanations why full or diff archive was created. You can disable log file by setting `log_format:` option to _disable_ in `.mtsaver.yml` file (or use `--no-log` command-line argument).\n\nThere is also `restore` command available if you want to unpack FULL+DIFF archives in empty directory. It just runs 7-Zip with \"unpack\" arguments. This is the same as unpacking archives manually. `--latest` argument unpacks latest FULL+DIFF archive available. Without `--latest` argument program will ask interactively for archive you want to unpack.\n\n## Help\n\nRun `mtsaver help` for options and commands description.\n\n## Inspired by\n\n* https://www.cobiansoft.com/about.html\n* https://nagimov.me/post/simple-differential-and-incremental-backups-using-7-zip/\n* https://www.7-zip.org\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmitoteam%2Fmtsaver","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmitoteam%2Fmtsaver","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmitoteam%2Fmtsaver/lists"}