{"id":20756485,"url":"https://github.com/basiliscos/syncspirit","last_synced_at":"2025-08-29T21:37:21.423Z","repository":{"id":39904895,"uuid":"466475142","full_name":"basiliscos/syncspirit","owner":"basiliscos","description":"continuous file synchronization program (BEP protocol implementation)","archived":false,"fork":false,"pushed_at":"2025-08-22T07:56:20.000Z","size":25381,"stargazers_count":95,"open_issues_count":2,"forks_count":4,"subscribers_count":7,"default_branch":"master","last_synced_at":"2025-08-22T09:44:21.935Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/basiliscos.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2022-03-05T14:24:31.000Z","updated_at":"2025-08-22T07:51:51.000Z","dependencies_parsed_at":"2025-05-16T18:28:34.255Z","dependency_job_id":"ccd02e30-6863-475d-b545-1abd2e43c4ef","html_url":"https://github.com/basiliscos/syncspirit","commit_stats":null,"previous_names":[],"tags_count":9,"template":false,"template_full_name":null,"purl":"pkg:github/basiliscos/syncspirit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/basiliscos%2Fsyncspirit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/basiliscos%2Fsyncspirit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/basiliscos%2Fsyncspirit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/basiliscos%2Fsyncspirit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/basiliscos","download_url":"https://codeload.github.com/basiliscos/syncspirit/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/basiliscos%2Fsyncspirit/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":272766900,"owners_count":24989407,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-08-29T02:00:10.610Z","response_time":87,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-11-17T09:32:42.476Z","updated_at":"2025-08-29T21:37:21.416Z","avatar_url":"https://github.com/basiliscos.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# syncspirit\n\nSites:\n[github](https://github.com/basiliscos/syncspirit),\n[notabug](https://notabug.org/basiliscos/syncspirit)\n[gitflic](https://gitflic.ru/project/basiliscos/syncspirit)\n\n`syncspirit` is a continuous file synchronization program, which synchronizes files between devices.\nIt is built using the C++ [rotor](https://github.com/basiliscos/cpp-rotor) actor framework. It implements\nthe [BEP-protocol](https://docs.syncthing.net/specs/bep-v1.html) for files synchronization, or, \nsimplistically speaking, it is a [syncthing](https://syncthing.net)-compatible synchronization\nprogram at protocol level, which uses the [syncthing](https://syncthing.net) infrastructure (for global discovery\nand relaying).\n\nDespite being functional, `syncspirit` is less feature-rich than [syncthing](https://syncthing.net)\nand is still in heavy development\n\n# front-ends (aka UIs)\n\n![overview](docs/fltk-overview.gif)\n\n- [fltk](https://www.fltk.org/)-based gui [app](docs/ui-fltk.md)\n\n- headless [daemon](docs/ui-daemon.md)\n\nAll front-ends share the same configuration and database when running on same host.\n\n# status\n\n- [x] full-powered files synchronization (aka send and receive)\n\n- [x] [global peer discovery](https://docs.syncthing.net/specs/globaldisco-v3.html)\n\n- [x] [local (LAN) peer discovery](https://docs.syncthing.net/specs/localdisco-v4.html)\n\n- [x] upnp \u0026 nat passthough\n\n- [x] certificates generation\n\n- [x] relay transport\n\n- [x] conflict resolution\n\n- [x] incoming and outcoming messages (de)compression using lz4\n\n- [x] introducer support\n\n- [x] send only/receive only dirs\n\n\n# missing features\n\nThis list is probably incomplete. Here are the most important changes:\n\n- [ ] inotify support (aka realtime files watching)\n\n- [ ] ignoring pattern files\n\n- [ ] [QUIC transport](https://en.wikipedia.org/wiki/QUIC)\n\n- [ ] [untrusted devices encryption](https://docs.syncthing.net/specs/untrusted.html)\n\n# run\n\n(headless ui-daemon only, atm)\n\n    syncspirit-daemon --log_level debug \\\n        --config_dir=/tmp/my_dir \\\n        --command add_peer:peer_label:KUEQE66-JJ7P6AD-BEHD4ZW-GPBNW6Q-Y4C3K4Y-X44WJWZ-DVPIDXS-UDRJMA7 \\\n        --command add_folder:label=my_label:id=nagkw-srrjz:path=/tmp/my_dir/data \\\n        --command share:folder=my_label:device=KUEQE66 \\\n        --command inactivate:120\n\nthe output should be like\n\n[![asciicast](https://asciinema.org/a/474217.svg)](https://asciinema.org/a/474217)\n\ni.e. it records some peer, adds a folder, then shares the folder with the peer device, connects to\nthe peer and downloads all files into `/tmp/my_dir/data` . The peer device currently can only be\n[syncthing](https://syncthing.net). Then `syncspirit` either exits after 2 minutes of inactivity\nor when you press `ctrl+c`. The output is successful, because I previously authorized this device\nwith the [syncthing](https://syncthing.net) web interface, and shared the folder with this device\n(`syncspirit`).\n\nI also assume some familiarity with [syncthing](https://syncthing.net), so you should understand\nwhat's going on here.\n\nFor more details see [ui-daemon](docs/ui-daemon.md) docs and [configuration](docs/config.md) docs.\n\n# design and ideas\n\n[syncthing](https://syncthing.net) is implemented using [go](https://go.dev/) programming\nlanguage, which is a good fit for services. As a result, [syncthing](https://syncthing.net)\nitself is written as a web-service, which exposes a REST-API for clients. So, yes, the end-user\nsoftware should also have a front-end, which is usually web-browser (or embeds web-browser),\nwhich is written in different programming language (e.g. javascript or java).\n\nI feel myself a bit uneasy with that design; maybe it's my personal nostalgia, but I like\nthe good old programs, where everything is \"in memory\" of one program. They are fast, \necological, secure, manageable, have lower CPU and memory pressures.\n\nThe [actor model](https://en.wikipedia.org/wiki/Actor_model), blurs the boundaries between\nclassical desktop and client-server application models. I think, \n[rotor](https://github.com/basiliscos/cpp-rotor) makes it possible to have (and embed) some \n\"core\" into multiple different user interfaces (GUIs). \n\nCurrently, syncspirit has only a \"daemon-ui\", i.e. a simple non-interactive application,\nwhich shows a synchronization log, and the only possibility is just to stop it. However, as soon\nas the \"core\" is complete, there are plans to develop multiple `syncspirit` UIs:\n[wx-widgets](https://www.wxwidgets.org/), qt, gtk, maybe native, maybe even native mobile UIs...\n\nAnother major idea is scripting support: it should be possible to expose the \"core\" to lua \nscripts, and have some user-defined actions like synchronizing files with external folders including\nflash-sticks, user-defined files ordering and filtering for synchronization, maybe even selective\nsync, like in [resilio](https://www.resilio.com/). This, however, still needs to be researched,\nafter the core completion.\n\n# platforms\n\n- linux\n- windows\n- mac os x\n\n# changes\n\n## 0.4.2 (22-Aug-2025)\n - [core, bugfix] (#8) crash on set peer static ip address\n - [fltk, deploy] ship libstd++.so to support wider linux platforms\n - [daemon, deploy] make AppImage (with shipped libstd++.so)\n\n## 0.4.1 (05-Aug-2025)\n - [core, fltk] support merged cluster folder model\n - [core] possibility to import directories outside of syncthing, including\n         partial import, see [faq](faq.md)\n - [core] performance improvents, upto 5 times on a smaller files\n - [core] fix compatibility with global discovery [v3 protocol](https://docs.syncthing.net/specs/globaldisco-v3.html)\n - [core] support `folder_type` folder setting (send only, receive only, send \u0026 receive)\n - [core] support `pull_older` folder setting (alphabetic, by size, by modification date)\n - [core, bep] support `disable_temp_indixes` (hardcoded to `1` for atm)\n - [core, bep] support `ignore_permissions` folder flag, `permissions` and `no_permissions`\n               file flag\n - [core, bep] support `ignore_deletes` folder flag\n - [core, bep] support device `auto-accept` folder flag\n - [core, bep] support device `introducer` and `skip_introduction_removals` markers\n - [core, bep] support outgoing messages to be compressed using lz4\n - [core] syncrhonize threads/app startup\n - [impl] degoogle: use [protopuf](https://github.com/PragmaTwice/protopuf) instead of protobuf\n\n## 0.4.0 (22-Feb-2025)\n - [feature] new [fltk-fronted](docs/ui-fltk.md)\n - major app refactoring\n \n## 0.3.3 (12-May-2024)\n- [bugfix, win32] governor actor, fix parsing folder path\n\n## 0.3.2 (11-May-2024)\n- [bugfix] folder scan isn't triggered on startup\n\n## 0.3.1 (23-Apr-2024)\n- [feature] added `syncspirit` binary fow windows xp\n- [build, docs] improved build documentation\n\n## 0.3.0 (14-Apr-2024)\n- [feature] implemented complete files synchronization\n- [feature] added local files watcher and updates streamer\n- [build] switched from git submodules to [conan2](https://conan.io)\n- [win32] better platform support\n\n\n## 0.2.0 (22-May-2022)\n- [feature] implement [relay transport](https://docs.syncthing.net/specs/relay-v1.html),\nthe relay is randomly chosen from the public relays [pool](https://relays.syncthing.net/endpoint)\n- [feature] output binary is compressed via [upx](https://upx.github.io)\n- [feature] small optimization, use thread less in overall program\n- [bugfix] sometimes fs::scan_actor request timeout occurs, which is fatal\n- [bugfix] global discovery sometimes skipped announcements\n\n## 0.1.0 (18-Arp-2022)\n - initial release\n\n# building from source\n\n[see](docs/building.md)\n\n# license\n\nThis software is licensed under the [GPLv3 license](https://www.gnu.org/licenses/gpl-3.0.en.html).\n\n    Copyright (C) 2019-2022 Ivan Baidakou (aka basiliscos)\n\n    This file is part of syncspirit.\n\n    syncspirit is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    syncspirit is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with syncspirit.  If not, see \u003chttp://www.gnu.org/licenses/\u003e.\n\n[![GPL3 Logo](https://www.gnu.org/graphics/gplv3-127x51.png)](https://www.gnu.org/licenses/gpl-3.0.en.html)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbasiliscos%2Fsyncspirit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fbasiliscos%2Fsyncspirit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fbasiliscos%2Fsyncspirit/lists"}