RetroShare
retroshare.ccSecure group communications, with the option to be used over Tor or I2P. Fast intuitive group and 1-to-1 chats with text and rich media using decentralized chat rooms, with a mail feature for delivering messages to offline contacts. A channels feature makes it possible for members of different teams to stay up-to-date with each other, and to share files. Also includes built-in forums, link aggregations, file sharing and voice and video calling. RetroShare is a bit more complex to use than some alternatives, and the UI is quite retro, so may not be appropriate for a non-technical team.
- Homepage:retroshare.cc
- GitHub:github.com/RetroShare/RetroShare
- Web info:web-check.xyz/check/retroshare.cc
RetroShare Source Code
Author
Description
RetroShare is a Free and Open Source cross-platform, Friend-2-Friend and secure decentralised communication platform.
Homepage
https://retroshare.cc/Repository
- LicenseOther
- Created31 Jul 15
- Primary languageC++
- Size135,603 KB
- Stars2,010
- Forks324
- Watchers2,010
Top Contributors
@csoler (5144)
@defnax (1091)
@G10h4ck (1090)
@PhenomRetroShare (718)
@thunder2 (360)
@jolavillette (261)
@hunbernd (143)
@sehraf (141)
@mr-alice (136)
@RetroPooh (104)
@electron128 (92)
@zeners (77)
@kdebiec (67)
@AsamK (57)
@felisucoibi (54)
@drbob (42)
@chelovechishko (37)
@PYRET1C (31)
@dbear496 (27)
@JohannesKleine (22)
@zapek (18)
@mestaritonttu (18)
@samuel-asleep (14)
@natinew77-creator (9)
@SaurabhCodesAI (9)
@cavebeat (9)
@Passw (8)
@b1rdG (7)
@realityfabric (7)
@ericthefish (7)
@chozabu (7)
@ppetr (6)
@heini (4)
@Copilot (3)
@merkeld (3)
@altcoinpirate (3)
@myfingerhurt (3)
@jpascualsana (2)
@fkobi (2)
@dartraiden (2)
@Ppjet6 (2)
@Kcchouette (2)
@Gottox (2)
@rex4539 (2)
@crhode (2)
@alvaro-salort (1)
@diversys (1)
@grennvyper (1)
@Steve-V (1)
@vladpirlog (1)
@amir28 (1)
@anontahoe (1)
@Hopetech (1)
@cicicmanu (1)
@pztrn (1)
@redDwarf03 (1)
@retrop00h (1)
@shibe2 (1)
@sirjenster (1)
@Piraty (1)
@rottencandy (1)
@marcobarbosa16 (1)
@keisentraut (1)
@hasufell (1)
@Josep-San (1)
@topcat (1)
@D4ndellion (1)
@cristeab (1)
@deferredreward (1)
@BabushkaRetroShare (1)
@aral (1)
@comradekingu (1)
Recent Commits
csoler(16 Aug 26)
Merge pull request #3271 from defnax/distantchat-popup-fix 💬 Fixed to not popup distant chat on incoming chat
csoler(13 Aug 26)
Merge pull request #3210 from jolavillette/FixSearchColumnWidthPersistence GUI: persist search results column widths across restarts
jolavillette(26 Apr 26)
GUI: persist search results column widths across restarts
csoler(06 Aug 26)
Merge pull request #3274 from jolavillette/fix/gxs-mark-all-read-nofreeze Fix UI freeze on "mark all as read/unread" for forums, channels and boards
jolavillette(01 Aug 26)
Address review: pointer hand-off to the workers, event-driven board update - GxsForumModel / PostedPostsModel: hand the id list to the background worker through a pointer deleted after the call, so the lambda capture does not deep copy it. - PostedPostsModel: setAllMsgReadStatus() no longer updates the model directly. The batched READ_STATUS_CHANGED event now carries the affected ids and their new state (libretroshare side), and the event handler applies them locally — so a batch initiated by another frontend (e.g. webUI) updates the board view exactly the same way, and no post is re-read from the database. Co-Authored-By: Claude Fable 5 <[email protected]>
jolavillette(01 Aug 26)
Revert "gui(forums): opt-in latency probes on the read/unread and loading path" Profiling code removed from the PR, as requested in review of the sibling PRs. This reverts commit 8845aa4636e630977f4a6817e8a267735e128e28. Co-Authored-By: Claude Fable 5 <[email protected]>
jolavillette(29 Jul 26)
gui(forums): opt-in latency probes on the read/unread and loading path Set RS_GUI_PROFILE to a threshold in milliseconds (0 reports everything) to get one line per measured operation on stderr, plus a 50 ms watchdog on the GUI thread that reports every stall of the event loop wherever the blocking code lives, naming the last probed operation. This is what located the actual freeze of the read/unread path (a whole-model dataChanged() measured at 1072 ms) after several plausible-from-code-reading fixes had failed to: the numbers say where the time goes instead of a story explaining where it might go. All probes are inert unless the environment variable is set. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
jolavillette(29 Jul 26)
gui(forums): re-read the group on SUBSCRIBE_STATUS_CHANGED instead of flipping the flag The event means the subscription status changed, not that it was toggled: guessing the new value by inverting the current flag goes wrong as soon as one event is duplicated, lost, or refers to a state the widget already holds. When the guess lands on 'unsubscribed', the widget silently refuses to mark posts read or unread (the very first check of markMsgAsReadUnread) until the next group reload puts the flag right again. updateGroupData() was already called anyway; let it be the only writer of the flag. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
jolavillette(29 Jul 26)
gui(forums): drop the expanded-items save/restore around read-status changes setMsgReadStatus() only emits dataChanged(); it never resets the model nor changes its layout, so the expanded items and the current index survive it untouched. Saving and restoring them on every toggle was pure overhead, and an expensive one: the restore walks every expanded item and pays, for each, a linear scan of the post array plus a linear scan of the view items -- quadratic work on the GUI thread for a single post marked read or unread on a large forum. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
jolavillette(29 Jul 26)
GxsForumModel: size the read-status view refresh on rows, not message ids 280e51f53 restricted the dataChanged() refresh to the affected post unless more than 5 messages changed, in which case it refreshes the whole view. But changed_msgs counts message ids, and a post carries one id per stored version of itself, all sharing one read status: marking a single post read or unread on a post edited 46 times queued 47 ids and triggered the whole-model refresh. Measured on a 8259 post forum: one click, one row repainted, 1072 ms of frozen GUI in the dataChanged() handling; with this fix the same click costs about 1 ms. Count the changed rows separately and size the refresh on that. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
jolavillette(25 Jul 26)
gui(forums): create reload timer before setGroupId (fix ctor SIGSEGV) The coalescing timer was allocated near the end of the constructor, but setGroupId(forumId) is called earlier and synchronously reaches groupIdChanged() -> updateDisplay(true) -> mDeferredReloadTimer->stop(), dereferencing the still-uninitialised pointer and crashing the moment a forum was opened. Allocate the timer right after setupUi(), before setGroupId(). Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
jolavillette(24 Jul 26)
gui(forums): coalesce full-forum reloads to stop sync-burst UI freezes handleEvent_main_thread() ran a full updateDisplay(true) (updateForum -> getForumPostsHierarchy -> setPosts full reset -> proxy re-sort/re-filter -> tree rebuild) for every incoming GXS event. A sync batch delivers many NEW_MESSAGE events back to back, so the forum was reloaded once per post, freezing the UI for seconds and resetting the model out from under the user's current selection (and racing the async read-status persistence, making a just-read post pop back to bold). Route those events through a single-shot QTimer (300 ms) that is restarted on each event, so a whole burst collapses into one reload once the events settle. An explicit reload (forum switch) cancels any pending deferred one. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
jolavillette(24 Jul 26)
GxsForumModel: fix malformed model reset dropping freshly-arrived posts setPosts() called beginResetModel()/endResetModel() *before* swapping mPosts, so endResetModel() fired while the model still exposed the previous hierarchy, then emitted an extra beginInsertRows()/endInsertRows() on top of the reset. That double-signalling left the view/proxy row->source mapping stale, so a post that had just arrived could map to an invalid source index: selecting it neither displayed its content nor cleared its unread (bold) state. Bracket the actual data swap with beginResetModel()/endResetModel() and drop the bogus row-insertion signal; a full reset already tells the views to re-query everything. Same anti-pattern as the channels grid-empty-on-new-post fix. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
jolavillette(17 Jul 26)
gui(forums): keep single-post read latency low via unitary markRead Routing every read through the batched markRead(grpId, vector, read) also routed single interactive reads (selecting/opening one post) through its waitToken(): the READ_STATUS_CHANGED event, and thus the forum-list unread counter refresh, was only emitted once the DB write completed, adding ~100ms plus one GXS tick of latency versus the previous behaviour. Send a single changed message through the per-message markRead(pair), which emits the event immediately, and keep the batched call only for larger sets (mark-all, with-children, versioned posts) where deferring the single event until completion is what avoids the freeze. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
jolavillette(14 Jul 26)
gui(forums): fix slow post navigation by restricting dataChanged refresh to affected post and parents
jolavillette(11 Jul 26)
Channels/Posted models: never freeze the UI on "mark all as read" GxsChannelPostsModel and PostedPostsModel spawned one detached std::thread (and got one event) per post on "mark all as read/unread", freezing the UI on large channels/boards - the same problem just fixed for forums, and worse here given the much larger channel/board databases. Both now collect the affected message ids and issue a single background batch call (setMessageReadStatus / setPostReadStatus with a vector) plus a single view refresh. PostedPostsModel additionally updates its local model up front (it previously relied entirely on the per-message events). Requires the matching libretroshare bulk overloads. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
jolavillette(11 Jul 26)
GxsForumModel: never freeze the UI on "mark all as read" recursSetMsgReadStatus() used to spawn one detached std::thread per changed post (each blocking up to 5s in markRead) and emit one dataChanged() per post. On a forum with thousands of unread posts this created thousands of threads and signals driven from the GUI thread, freezing (and sometimes crashing) the UI - the reported symptom being an hour-long hourglass on an 8000-post forum. Now the recursion only collects the affected message ids and updates the in-memory model; setMsgReadStatus() then issues a single background batch call (rsGxsForums->markRead(group, ids, read)) and a single view refresh. The GUI thread does O(n) in-memory work plus one thread and one signal, so it stays responsive no matter how large the forum is. Requires the matching libretroshare bulk markRead() overload. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
csoler(01 Aug 26)
Merge pull request #3280 from jolavillette/perf/gxs-channel-loading GUI: stop copying and sorting the channel post array in the Qt thread
jolavillette(01 Aug 26)
GUI: remove the profiling probes from the channel post model Requested in review: the RS_GXS_PROFILE instrumentation of update_posts() and setPosts() served to measure the freeze and verify the fix, but it should not stay in the optimised code. The libretroshare profiling header is no longer included. Co-Authored-By: Claude Fable 5 <[email protected]>
jolavillette(27 Jul 26)
GUI: stop copying and sorting the channel post array in the Qt thread setPosts() runs in the Qt thread, through postToObject(). It copied the whole post array a fourth time and then sorted it there, so for a channel with a few thousand posts the interface was frozen for the duration of both. Move the sort into the loader thread in update_posts(), where the array is already sitting after the service call, and have setPosts() take its argument by rvalue reference so the array is moved in rather than copied. The sort is kept in setPosts() as a safety net: on an already ordered array it only runs comparisons and moves nothing. Combined with the libretroshare side making posts movable, the array is now handed from the data store to the model without a single deep copy of a thumbnail. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
jolavillette(27 Jul 26)
GUI: profile the channel post model loading Complements the GXS side instrumentation (libretroshare, gxs/rsgxsprofiler.h) with the two phases that happen in the GUI: the service calls made from the loader thread in update_posts(), and the model update in setPosts(), which runs in the Qt thread and is what actually freezes the interface. setPosts() reports its three phases separately (array copy, sort, view update) since they have very different causes. Enabled by the same RS_GXS_PROFILE environment variable, off by default. Co-Authored-By: Claude Opus 5 (1M context) <[email protected]>
csoler(30 Jul 26)
Merge pull request #3284 from jolavillette/fix/feedreader-mark-all-unread FeedReader: add "Mark all as unread" alongside "Mark all as read"
jolavillette(25 Jul 26)
gui(feedreader): add "Mark all as unread" alongside "Mark all as read" The FeedReader message widget already offered "Mark all as read" (toolbar button + context menu) but had no way to mark every visible message as unread again. Add the symmetric "Mark all as unread" entry to the message context menu. Factor the shared iterate-over-visible-items logic out of markAllAsReadMsg() into setAllMsgAsReadUnread(bool read); the read and unread slots now just call it. Like the existing "mark all as read", the action honours the current filter (acts on non-hidden rows only) and goes through the existing per-message setMessageRead() path, so no backend change is required. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
Gioacchino Mazzurco(23 Jul 26)
Fix GitLab mirror failing on GitHub PR refs The mirror workflow cloned with --mirror and pushed all refs, including GitHub's refs/pull/* and upstream/pr/*, which GitLab rejects as hidden refs ("deny updating a hidden ref" on upstream/pr/3213), failing the whole push. Clone --bare and push only refs/heads/* and refs/tags/* with --prune, keeping deletion sync while never touching PR refs.
Gioacchino Mazzurco(23 Jul 26)
Merge pull request #3269 from jolavillette/docs/build-cmake Docs/build cmake
Gioacchino Mazzurco(23 Jul 26)
Merge pull request #3243 from jolavillette/fix/cmake-qt6-detection GUI CMake: reliably select Qt6 (with Qt5 fallback)
jolavillette(15 Jul 26)
docs: add packaging and deployment section for Windows/MSYS2 in BUILD-cmake.md Document portable archive creation (7-Zip / ZIP fallback), setup installer generation using NSIS, and how to execute and configure the deploy-windows.sh script.
jolavillette(13 Jul 26)
docs: add RS_USE_NATIVE_DIALOGS=ON to Windows build commands Qt's non-native file/directory dialogs hang on Windows. Using the OS native dialogs avoids the problem.
jolavillette(12 Jul 26)
docs(BUILD): document version numbering (git describe derivation) Explain how RS_GUI_VERSION, the libRetroShare version and RS_LIB_VERSION_HASH are each derived from git describe at configure time, the exact commands to read them without building, the --dirty submodule-pointer gotcha, the --long always-suffixed libretroshare format, and the non-git fallback. Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
jolavillette(10 Jul 26)
docs(BUILD): checkout rapidjson fix commit after submodule init (GCC>=13) The super-project pins rapidjson at f54b0e47, whose GenericStringRef::operator= assigns to the const member `length`. That fails to compile on modern toolchains (Debian 13 / GCC 14: "assignment of read-only member 'length'"). Add a note after the submodule init step telling testers to check out the upstream fix 9bd618f5 (PR #719 on Tencent/rapidjson master). Co-Authored-By: Claude Opus 4.8 (1M context) <[email protected]>
RetroShare Security
RetroShare Website
Website
Retroshare
Redirects
Does not redirect
Security Checks
1 security checks failed (64 passed)
- Top-Level Domain Highly Abused
Server Details
- IP Address185.199.110.153
- Hostnamecdn-185-199-110-153.github.com
- LocationFrancisco,Indiana,United States of America,NA
- ISPGitHub Inc.
- ASNAS54113
Associated Countries
FR
US
Safety Score
Website marked as risky
70%
Blacklist Check
retroshare.cc was found on 0 blacklists
- AntiSocial Blacklist
- Artists Against 419
- Badbitcoin
- Bambenek Consulting
- CERT Polska
- CoinBlockerLists
- CRDF
- CryptoScamDB
- EtherAddressLookup
- EtherScamDB
- Fake Website Buster
- MetaMask EthPhishing
- NABP Not Recommended Sites
- OpenPhish
- PetScams
- PhishFeed
- PhishFort
- Phishing.Database
- PhishStats
- PhishTank
- Phishunt
- RPiList Not Serious
- Scam.Directory
- SecureReload Phishing List
- Spam404
- StopGunScams
- Suspicious Hosting IP
- ThreatFox
- ThreatLog
- TweetFeed
- URLhaus
- ViriBack C2 Tracker
Website Preview
RetroShare Reviews
More Team Collaboration
Privacy-focused messenger using the Matrix protocol. The Element client allows for group chat rooms, media sharing voice and video group calls.
An IRC-based solution is another option, being decentralized there is no point of failure, and it's easy to self-host. However it's important to keep security in mind while configuring your IRC instance and ensure that channels are properly encrypted - IRC tends to be better for open communications. There's a variety of clients to choose from - popular options include: The Longe (Web-based), HexChat (Linux), Pidgin (Linux), WeeChat (Linux, terminal-based), IceChat (Windows), XChat Aqua (MacOS), Palaver (iOS) and Revolution (Android).
Mattermost has an open source edition, which can be self-hosted. It makes a good Slack alternative, with native desktop, mobile and web apps and a wide variety of integrations.
Easy-to-deploy, self-hosted team collaboration platform with stable, feature-rich cross-platform client apps. The UI is fast, good looking and intuitive, so very little technical experience is needed for users of the platform. Rocket.Chat's feature set is similar to Slack's, making it a good replacement for any team looking to have greater control over their data.
Open source team chat organized around topic-based threading, which keeps busy conversations easier to follow than channel-only tools. Can be self-hosted, or used as a paid cloud service. The threading model takes some getting used to.
About the Data: RetroShare
Edit RetroShare Data
You can edit RetroShare's entry in this section of awesome-privacy.yml by submitting a PR to our GitHub repo.
Note that some of the information shown above has been aggregated from external
sources, a list of these can be found data documentation.
Origin Data
Modify Data
API
You can access RetroShare's data programmatically via our API. Simply make a GET request to:
https://api.awesome-privacy.xyz/v1/services/retroshareThe REST API is free, no-auth and CORS-enabled. To learn more, view the API Docs or read the API Usage Guide.
Share RetroShare
Help your friends compare Team Collaboration, and pick privacy-respecting software and services.
Share RetroShare and Awesome Privacy with your network!
