SimpleX Chat:
Foundation
For the Future
+ Livestream and Q&A about SimpleX Chat roadmap and crowdfunding
+ +
-Invest in SimpleX Chat. [Learn more on Wefunder](https://wefunder.com/simplexchat).
+Invest in SimpleX Chat. [Learn more on Wefunder](https://wefunder.com/simplex.chat?utm_source=github).
# SimpleX - the first messaging platform that has no user identifiers of any kind - 100% private by design!
@@ -220,6 +220,8 @@ You can use SimpleX with your own servers and still communicate with people usin
Recent and important updates:
+[Aug 20, 2026. Equity Crowdfunding Launched - You Can Get a Stake in SimpleX Chat](./blog/20260819-simplex-chat-crowdfunding.md)
+
[Jul 22, 2026. SimpleX Public Names — a Name Nobody Can Take From You](./blog/20260722-simplex-public-names.md)
[Apr 30, 2026. SimpleX Channels, SimpleX Network Consortium and Community Crowdfunding - to Preserve Freedom of Speech](./blog/20260430-simplex-channels-v6-5-consortium-crowdfunding-freedom-of-speech.md)
diff --git a/apps/ios/Shared/Model/AppAPITypes.swift b/apps/ios/Shared/Model/AppAPITypes.swift
index fffff5e05d..85963202c4 100644
--- a/apps/ios/Shared/Model/AppAPITypes.swift
+++ b/apps/ios/Shared/Model/AppAPITypes.swift
@@ -21,6 +21,7 @@ enum ChatCommand: ChatCmdProtocol {
case apiSetUserContactReceipts(userId: Int64, userMsgReceiptSettings: UserMsgReceiptSettings)
case apiSetUserGroupReceipts(userId: Int64, userMsgReceiptSettings: UserMsgReceiptSettings)
case apiSetUserAutoAcceptMemberContacts(userId: Int64, enable: Bool)
+ case apiSetUserAutoAcceptGroupInvitations(userId: Int64, enable: Bool)
case apiHideUser(userId: Int64, viewPwd: String)
case apiUnhideUser(userId: Int64, viewPwd: String)
case apiMuteUser(userId: Int64)
@@ -216,6 +217,8 @@ enum ChatCommand: ChatCmdProtocol {
return "/_set receipts groups \(userId) \(onOff(umrs.enable)) clear_overrides=\(onOff(umrs.clearOverrides))"
case let .apiSetUserAutoAcceptMemberContacts(userId, enable):
return "/_set accept member contacts \(userId) \(onOff(enable))"
+ case let .apiSetUserAutoAcceptGroupInvitations(userId, enable):
+ return "/_set accept group invitations \(userId) \(onOff(enable))"
case let .apiHideUser(userId, viewPwd): return "/_hide user \(userId) \(encodeJSON(viewPwd))"
case let .apiUnhideUser(userId, viewPwd): return "/_unhide user \(userId) \(encodeJSON(viewPwd))"
case let .apiMuteUser(userId): return "/_mute user \(userId)"
@@ -434,6 +437,7 @@ enum ChatCommand: ChatCmdProtocol {
case .apiSetUserContactReceipts: return "apiSetUserContactReceipts"
case .apiSetUserGroupReceipts: return "apiSetUserGroupReceipts"
case .apiSetUserAutoAcceptMemberContacts: return "apiSetUserAutoAcceptMemberContacts"
+ case .apiSetUserAutoAcceptGroupInvitations: return "apiSetUserAutoAcceptGroupInvitations"
case .apiHideUser: return "apiHideUser"
case .apiUnhideUser: return "apiUnhideUser"
case .apiMuteUser: return "apiMuteUser"
diff --git a/apps/ios/Shared/Model/SimpleXAPI.swift b/apps/ios/Shared/Model/SimpleXAPI.swift
index 6b40b909d6..20efa8e461 100644
--- a/apps/ios/Shared/Model/SimpleXAPI.swift
+++ b/apps/ios/Shared/Model/SimpleXAPI.swift
@@ -302,6 +302,10 @@ func apiSetUserAutoAcceptMemberContacts(_ userId: Int64, enable: Bool) async thr
try await sendCommandOkResp(.apiSetUserAutoAcceptMemberContacts(userId: userId, enable: enable))
}
+func apiSetUserAutoAcceptGroupInvitations(_ userId: Int64, enable: Bool) async throws {
+ try await sendCommandOkResp(.apiSetUserAutoAcceptGroupInvitations(userId: userId, enable: enable))
+}
+
func apiHideUser(_ userId: Int64, viewPwd: String) async throws -> User {
try await setUserPrivacy_(.apiHideUser(userId: userId, viewPwd: viewPwd))
}
diff --git a/apps/ios/Shared/Views/Chat/ChatItem/FramedItemView.swift b/apps/ios/Shared/Views/Chat/ChatItem/FramedItemView.swift
index 44284350dc..ac27cb27c2 100644
--- a/apps/ios/Shared/Views/Chat/ChatItem/FramedItemView.swift
+++ b/apps/ios/Shared/Views/Chat/ChatItem/FramedItemView.swift
@@ -75,7 +75,35 @@ struct FramedItemView: View {
}
})
} else if let itemForwarded = chatItem.meta.itemForwarded {
- framedItemHeader(icon: "arrowshape.turn.up.forward", caption: Text(itemForwarded.text(chat.chatInfo.chatType)).italic(), pad: true)
+ let twoRowHeader: Bool = if chat.chatInfo.chatType == .local {
+ itemForwarded.chatTypeApiIdMsgId != nil || itemForwarded.sourceGroupLink != nil
+ } else {
+ switch itemForwarded {
+ case let .group(_, _, _, _, _, _, groupType): groupType != nil
+ case .groupLink: true
+ default: false
+ }
+ }
+ if twoRowHeader {
+ let caption: LocalizedStringKey = chat.chatInfo.chatType == .local ? "saved from" : "forwarded from"
+ headerFrame(pad: true) {
+ VStack(alignment: .leading, spacing: 4) {
+ headerRow(icon: "arrowshape.turn.up.forward", caption: Text(caption).italic())
+ Text(itemForwarded.chatName)
+ .font(.subheadline)
+ .lineLimit(1)
+ }
+ }
+ .simultaneousGesture(TapGesture().onEnded {
+ if let (chatType, apiId, msgId) = itemForwarded.chatTypeApiIdMsgId {
+ im.loadOpenChatNoWait("\(chatType.rawValue)\(apiId)", msgId)
+ } else if let link = itemForwarded.sourceGroupLink {
+ planAndConnect(link, theme: theme, dismiss: false)
+ }
+ })
+ } else {
+ framedItemHeader(icon: "arrowshape.turn.up.forward", caption: Text(itemForwarded.text(chat.chatInfo.chatType)).italic(), pad: true)
+ }
}
ChatItemContentView(chat: chat, im: im, chatItem: chatItem, msgContentView: framedMsgContentView)
@@ -191,8 +219,14 @@ struct FramedItemView: View {
}
}
- @ViewBuilder func framedItemHeader(icon: String? = nil, iconColor: Color? = nil, caption: Text, pad: Bool = false) -> some View {
- let v = HStack(spacing: 6) {
+ func framedItemHeader(icon: String? = nil, iconColor: Color? = nil, caption: Text, pad: Bool = false) -> some View {
+ headerFrame(pad: pad) {
+ headerRow(icon: icon, iconColor: iconColor, caption: caption)
+ }
+ }
+
+ private func headerRow(icon: String?, iconColor: Color? = nil, caption: Text) -> some View {
+ HStack(spacing: 6) {
if let icon = icon {
Image(systemName: icon)
.resizable()
@@ -204,13 +238,17 @@ struct FramedItemView: View {
.font(.caption)
.lineLimit(1)
}
- .foregroundColor(theme.colors.secondary)
- .padding(.horizontal, 12)
- .padding(.top, 6)
- .padding(.bottom, pad || (chatItem.quotedItem == nil && chatItem.meta.itemForwarded == nil) ? 6 : 0)
- .overlay(DetermineWidth())
- .frame(minWidth: msgWidth, alignment: .leading)
- .background(chatItemFrameContextColor(chatItem, theme))
+ }
+
+ @ViewBuilder private func headerFrame(pad: Bool = false, @ViewBuilder _ content: () -> some View) -> some View {
+ let v = content()
+ .foregroundColor(theme.colors.secondary)
+ .padding(.horizontal, 12)
+ .padding(.top, 6)
+ .padding(.bottom, pad || (chatItem.quotedItem == nil && chatItem.meta.itemForwarded == nil) ? 6 : 0)
+ .overlay(DetermineWidth())
+ .frame(minWidth: msgWidth, alignment: .leading)
+ .background(chatItemFrameContextColor(chatItem, theme))
if let mediaWidth = maxMediaWidth(), mediaWidth < maxWidth {
v.frame(maxWidth: mediaWidth, alignment: .leading)
} else {
diff --git a/apps/ios/Shared/Views/Helpers/ShareSheet.swift b/apps/ios/Shared/Views/Helpers/ShareSheet.swift
index 670cc7cae0..56e437e5c8 100644
--- a/apps/ios/Shared/Views/Helpers/ShareSheet.swift
+++ b/apps/ios/Shared/Views/Helpers/ShareSheet.swift
@@ -142,6 +142,7 @@ class OpenChatAlertViewController: UIViewController {
private let profileBadge: LocalBadge?
private let subtitle: String?
private let information: String?
+ private let secondaryInformation: Bool
private let cancelTitle: String
private let confirmTitle: String?
private let secondTitle: String?
@@ -156,6 +157,7 @@ class OpenChatAlertViewController: UIViewController {
profileBadge: LocalBadge? = nil,
subtitle: String? = nil,
information: String? = nil,
+ secondaryInformation: Bool = false,
cancelTitle: String = "Cancel",
confirmTitle: String? = "Open",
secondTitle: String? = nil,
@@ -169,6 +171,7 @@ class OpenChatAlertViewController: UIViewController {
self.profileBadge = profileBadge
self.subtitle = subtitle
self.information = information
+ self.secondaryInformation = secondaryInformation
self.cancelTitle = cancelTitle
self.confirmTitle = confirmTitle
self.secondTitle = secondTitle
@@ -248,7 +251,7 @@ class OpenChatAlertViewController: UIViewController {
let infoLabel = UILabel()
infoLabel.text = information
infoLabel.font = UIFont.preferredFont(forTextStyle: .footnote)
- infoLabel.textColor = .label
+ infoLabel.textColor = secondaryInformation ? .secondaryLabel : .label
infoLabel.numberOfLines = 3
infoLabel.textAlignment = .center
infoLabel.translatesAutoresizingMaskIntoConstraints = false
@@ -426,6 +429,7 @@ func showOpenChatAlert
+
+People found SimpleX without any paid marketing — the community spread it via hundreds of posts, videos, podcasts and talks.[^links] The app was downloaded more than 3 million times. About 480,000 people use it every month. Users, including Vitalik Buterin, donated $650,000. There are more than 1,000 community-run servers on the network. Trail of Bits audited it in 2022, 2024, and 2026 (to be published).
+
+SimpleX Network assigns no identifiers to users — no phone numbers, usernames, or even random numbers. Instead, random identifiers are assigned to conversations, and only users know who they talk to. This cannot be added to a network that already has identifiers; it has to be built this way from the start, as SimpleX Network was.
+
+All other messengers, even private ones, may hide your name but still tag you with some number or key. That identifier links your conversations together, and the pattern of who you talk to can reveal who you are, even without names, as a 2009 study showed.[^deanon]
+
+## Why it matters now
+
+There are three trends that increase the demand for identity-free messaging that no other existing network can provide.
+
+**Surveillance of private life**. Big centralized platforms are increasingly scanning private messages to train AI models. More people would move to use private messaging that can't know who they talk to.
+
+**Accelerating deplatforming**. Creators are removed from centralized platforms without due process, and an audience built over years can disappear with one policy change. Telegram alone blocked 44 million groups and channels in 2025.
+
+**AI agents**. Agents are beginning to act for people, handling logins and money. Whoever controls an agent's identity can shut it down, or turn it against the person it works for. The same AI can fake a real person too.[^arup] User-controlled IDs are a basic security for the agentic Internet.
+
+On SimpleX Network the users, not the network, control their identities, and it solves all three problems — users cannot be surveilled or deplatformed by the network, or attacked by somebody who they have no connection with.[^address] The only keys to user connections are held by the users themselves.
+
+## SimpleX is not just a messenger — it's a network to build on
+
+
+
+SimpleX is used for private messaging, but it also brings together communities, creators, businesses, developers and server operators. Each group makes the network more valuable to the others.
+
+Most people want more from a messenger than to connect and send texts — they want to share experiences, and every messenger builds its own. That user experience is what prevents messaging apps from converging to one protocol, the way other networks did.[^network]
+
+The web solved this by letting anyone build any experience on one open platform. SimpleX Network is evolving into that kind of platform, and developers already build on it: moderation and AI bots, bridges, and more, with over 19,000 stars on GitHub. Soon it will be possible to build custom interfaces inside a chat. Every service developers build on SimpleX makes the network more useful and brings new people in, without locking them into a single provider.
+
+## Now you can get a stake
+
+
+
+SimpleX Chat is the company that builds SimpleX Network, and now you can invest from $100 and get a stake in the company.
+
+If you invest $500 or more, you receive [a public SimpleX name](./20260722-simplex-public-names.md) on SimpleX Network:
+- for 5 years for early bird investors,
+- for 3 years after that.
+
+You may benefit from the company's growth, and you would help build a network that people own — where the communities and audiences you build stay yours, and no company can take them away.
+
+Read about how we plan to make SimpleX Chat and the network profitable, and about all the investment terms, on Wefunder: [https://wefunder.com/simplex.chat](https://wefunder.com/simplex.chat?utm_source=blog)
+
+[^links]: https://simplex.chat/links/
+
+[^deanon]: Narayanan & Shmatikov, *De-anonymizing Social Networks* (2009): a third of the users with accounts on both Twitter and Flickr were re-identified in the anonymised Twitter graph, from its structure alone, at a 12% error rate. Sources: [arXiv 0903.3276](https://arxiv.org/pdf/0903.3276), [Narayanan, 33 Bits of Entropy](https://33bits.wordpress.com/2009/03/19/de-anonymizing-social-networks/), [Princeton listing](https://collaborate.princeton.edu/en/publications/de-anonymizing-social-networks/).
+
+[^arup]: In 2024, a video call of deepfakes cost Arup $25 million.
+
+[^address]: SimpleX Network supports public addresses, for users who want to accept connections from anybody, e.g. for a business, but these addresses are opt-in. When users use only one-time connection links, nobody can connect to them.
+
+[^network]: All networks converged to a single protocol, starting from railroads, and ending to a World Wide Web. A single unified network can create more value that several disconnected networks.
diff --git a/blog/README.md b/blog/README.md
index 6122eb3c39..3a1c545b4f 100644
--- a/blog/README.md
+++ b/blog/README.md
@@ -1,6 +1,15 @@
# Blog
-Jul 22, 2026 [SimpleX Public Names — a Name Nobody Can Take From You](./20260722-simplex-public-names.md)
+Aug 20, 2026 [Equity Crowdfunding Launched - You Can Get a Stake in SimpleX Chat](./20260819-simplex-chat-crowdfunding.md)
+
+SimpleX is the first and the only messaging network without user identifiers of any kind. Our equity crowdfunding round is now launched on Wefunder, so network users, and anybody else, can get a stake in SimpleX Chat - the company that builds it.
+
+Learn more and invest [on Wefunder](https://wefunder.com/simplex.chat?utm_source=blog).
+
+
+---
+
+Jul 22, 2026 [SimpleX Public Names - a Name Nobody Can Take From You](./20260722-simplex-public-names.md)
You can now give your channel or business a test SimpleX name that people can remember and nobody can take from you. Test names are free in v7-beta.
diff --git a/blog/images/20260819-developers.png b/blog/images/20260819-developers.png
new file mode 100644
index 0000000000..774d867e93
Binary files /dev/null and b/blog/images/20260819-developers.png differ
diff --git a/blog/images/20260819-growth-chart.png b/blog/images/20260819-growth-chart.png
new file mode 100644
index 0000000000..2b170f1146
Binary files /dev/null and b/blog/images/20260819-growth-chart.png differ
diff --git a/blog/images/20260819-wefunder.jpg b/blog/images/20260819-wefunder.jpg
new file mode 100644
index 0000000000..6586d4dfe7
Binary files /dev/null and b/blog/images/20260819-wefunder.jpg differ
diff --git a/bots/api/COMMANDS.md b/bots/api/COMMANDS.md
index 476ee4f94d..d88181b778 100644
--- a/bots/api/COMMANDS.md
+++ b/bots/api/COMMANDS.md
@@ -61,6 +61,7 @@ This file is generated automatically.
- [APISetGroupCustomData](#apisetgroupcustomdata)
- [APISetContactCustomData](#apisetcontactcustomdata)
- [APISetUserAutoAcceptMemberContacts](#apisetuserautoacceptmembercontacts)
+- [APISetUserAutoAcceptGroupInvitations](#apisetuserautoacceptgroupinvitations)
[User profile commands](#user-profile-commands)
- [ShowActiveUser](#showactiveuser)
@@ -1972,6 +1973,43 @@ ChatCmdError: Command error (only used in WebSockets API).
---
+### APISetUserAutoAcceptGroupInvitations
+
+Set auto-accept group invitations.
+
+*Network usage*: no.
+
+**Parameters**:
+- userId: int64
+- onOff: bool
+
+**Syntax**:
+
+```
+/_set accept group invitations New in v7.0-v7.0.1.
+SimpleX public names for channels and businesses (BETA).
+Better channels:
+Add a longer description to your profile.
+Simplified app settings.
+SimpleX is the first and the only messaging network without user identifiers of any kind. Our equity crowdfunding round is now launched on Wefunder, so network users, and anybody else, can get a stake in SimpleX Chat.
+ +Learn more and invest on Wefunder.
diff --git a/website/src/_includes/layouts/page.html b/website/src/_includes/layouts/page.html new file mode 100644 index 0000000000..c198f20d6a --- /dev/null +++ b/website/src/_includes/layouts/page.html @@ -0,0 +1,43 @@ + + + + + + {% include "dark-mode.html" %} + + +