Evgeny and Evgeny @ SimpleX Chat
2e56d32b52
core: badge presentations in profiles ( #7573 )
...
* badge presentation in groups
* fix tests
* badge presentations in profiles
* update simplexmq
* change types
* badge profile presentations
* improvements
* remove proof from cards, send owner public key for channel to relay
* add test
* merge migrations
* update
* prevent fallback to PHTest
* fixes
* many fixes
* fixes
* fixes
* cleanup
* improve
* query plans
* fix test
* diff
---------
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com >
2026-10-10 17:48:45 +01:00
Evgeny and Evgeny @ SimpleX Chat
0c1ffa65bc
core: group fixes/improvements ( #7660 )
...
* core: group fixes/improvements
* Large messages dropped by relays and hosts (the same 15602 limit was applied, without accounting for forwarding header)
* Members below v18 did not receive forwarded messages or history in p2p groups.
* Join confirmations near the size limit could fail.
* SMP servers are limited to 2 host names each.
* simplify
* remove legacy forwarding and history support
* only restrict p2p groups
---------
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com >
2026-10-08 15:06:18 +01:00
Evgeny and Evgeny @ SimpleX Chat
851ff062da
core: compress messages if needed to fit envelope, even if there is no PQ e2ee in connection ( #7630 )
...
* core: compress messages if needed to fit envelope, even if there is no PQ e2ee in connection
* simplify
* remove noise
* compress messages without PQ too
* case
* update query plans
---------
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com >
2026-09-30 14:07:00 +01:00
Evgeny and Evgeny @ SimpleX Chat
e863ee4c27
core: limit depth of forwarded messages ( #7614 )
...
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com >
2026-09-29 21:56:03 +01:00
Evgeny and Evgeny @ SimpleX Chat
643a9afad6
bots: SimpleX Calculator demo bot ( #7583 )
...
* bots: SimpleX Calculator demo bot
* refactor
* use local server in test
* simplify
* icon
* simplify
* expression
* replies
* improve
* log
* update name in bot address
* @simplex-chat/type: 0.12.0
* simplex-chat nodejs: 7.1.0-beta.4.2
* update dependencies
* option to add domain to bot address
---------
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com >
2026-09-27 17:20:40 +01:00
Evgeny and Evgeny @ SimpleX Chat
5ffbe733a8
core: attach badge proofs to files over size limit ( #7455 )
...
* core: attach badge proofs to files over size limit
* types
* more types
* implement file badge proofs
* tests
* move file limits to config, add tests
* more tests, work correctly in "send as group" case
* fix races in tests
* group badge tests
* query plans
* add history support, fixes
* simplify
* refactor
* refactor
* type
* restructure schema for proofs
* rename, refactor
* refactor
* fix, refactor
* refactor
* ui
* comments
* alerts
* update nix, ios library
* updare sharing
* update simplexmq
* update text
* improve messages
* api types
* postgres schema
* fix
* test
* query plans
---------
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com >
2026-09-12 14:33:52 +01:00
Evgeny and Evgeny @ SimpleX Chat
44773d0412
core: support message signing in p2p groups ( #7312 )
...
* core: support message signing in p2p groups
* improve
* add member key
* distribute keys and sign
* refactor
* better query
* map
* sign in relay groups too
* clean up
* list
* fix test
* update bot types
* some refactor
* remove unnecessary condition
* simplify
* refactor
* simplify
* move
* clean up
* diff
* diff
* limit attempts for key sending
* optimize
* fix test
* split
* fuse
* null
* only mark as "key sent" when forwarder supports binary encoding
* fix bot apis
* fix some tests
* add key distribution steps, and fix some tests
* fix test
* increase timeout
* fix tests
* fix more tests
* simplify
* disable test output
* mark keys sent with invitations
* fix test
* fix test, query plans
* unify signing of connection info packets
* revert change to createNewGroup
* create key at group/member creation
* rename, remove liftIO
* clean up
* fix type
* remove ad hoc key sending
* update bot api
* diff
* reduce diff
* failing test
* fix sending messages in groups with members before version 18
* remove test delays
* update query plans
* update test
* add tests
* fix tests
---------
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com >
2026-09-11 12:33:07 +01:00
Evgeny and Evgeny @ SimpleX Chat
f99c474ca6
core: send badge ZK-proofs to XFTP servers, add file expiry time ( #7430 )
...
* core: send badge ZK-proofs to XFTP servers
* update simplexmq, use keys and header from simplexmq
* core: add file expiry time
* refactor
* remove posix module
* rename migrations
* bot api
* update UI
* import
* show item from loaded information
* ios: update core library
* text
* send entitlements in handshake
* simplexmq
* query plans
* update simplexmq
---------
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com >
2026-09-01 23:16:15 +01:00
Evgeny and Evgeny @ SimpleX Chat
17cdef1692
core: include channel link and name when forwarding messages ( #7409 )
...
* core: include channel link and name when forwarding messages
* wip
* simplify
* add member ID
* refactor
* refactor
* refactor
* update api types
* store forward source group type
* rename
* api types
* simpler layout
* layout, translations
* refactor ios
* public
* simpler
* refactor kotlin
* padding
* padding
---------
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com >
2026-08-24 21:36:57 +01:00
sh
55d18efe24
core, python: fix refused renames, extend the client API ( #7379 )
...
* core: do not commit refused name changes
* feat(python): add error base and missing commands
* feat(python): let callers drive startup themselves
* style(python): satisfy the linter, skip generated types
* feat(python): expose the message of a command error
* core: update query plans
* core: fix the batch limit parse error on GHC 8.10
* feat(python): reject profile images no client can render
2026-08-17 09:02:14 +01:00
spaced4ndy
493fb9cee8
core: limit the number of messages in a batch ( #7364 )
2026-08-13 10:04:21 +00:00
Evgeny and Evgeny @ SimpleX Chat
f1418f9e55
core: drop support of chat versions older than 08/2024 ( #7319 )
...
* core: drop support of chat versions older than 08/2024
* fix encoding tests
* skip failing tests
* rename
* fix
* query plans
* remove unused legacy code
* remove more unused
* remove unused
* remove unused names
---------
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com >
2026-07-29 19:06:20 +01:00
Evgeny
8320730440
core: prohibit image previews when images are prohibited ( #7296 )
2026-07-24 10:50:46 +01:00
spaced4ndy
51ad366e8b
core, ui: message signing ( #7115 )
2026-07-10 19:55:10 +00:00
spaced4ndy
6bb1da9e8d
core: request roster ( #7121 )
2026-07-03 19:32:29 +00:00
spaced4ndy
0e09b38ea6
core: public groups - roster of privileged members ( #7017 )
2026-06-22 10:15:41 +00:00
Evgeny Poberezkin
f64030f704
Merge branch 'stable'
2026-06-21 23:37:47 +01:00
6cde614e51
core: fix group link use after admin demotion ( #7111 )
...
* Fix group link use after admin demotion
* fix: group role change
* size limit
* fix
* allow delete
* do not remove link
* query plan
* relay test
* refactor
---------
Co-authored-by: Paul Bottinelli <paul.bottinelli@trailofbits.com >
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com >
2026-06-21 23:36:15 +01:00
Evgeny and Evgeny @ SimpleX Chat
adb3fb8cb2
core: render web previews for channels ( #7029 )
...
* plan: web previews for channels
* types for recipient side to support channel web previews and domain names
* fix
* migrations
* update schema and api types
* update schema
* rename migrations
* core: render channel preview data
* core: render channel preview data in relays
* website: use cpp to inject JS functions
* JSC files
* remove directory.js
* channel preview renderer
* Revert "cli: fix redraw slowness (#6735 )"
This reverts commit b801d77c74 .
* sample channel page
* default avatar
* rename options
* better layout
* layout
* images
* some fixes
* tails
* markdown colors
* image sizes
* reactions
* fix reactions
* fewer avatars
* forward icon
* command to change group access parameters
* view public group access changes in CLI
* media metadata color
* ios: group web access ui
* update ui
* add init
* kotlin, labels
* update page
* update relay base URL
* fix
* ios update channel web page info
* update kotlin layout
* use cards
* update layout
* use domains for relay data, path is fixed
* update embed code
* fix bots api
* include only history items and senders
* update preview JS/HTML
* show different error if link is different
* remove stale json files
* better layout
* layout fixes
* improve layout
* improve layout
* update embed code
* web cta
* better layout
* buttons
* layout
* paddings
* desktop cta
* desktop cta
* cta layout
* fonts
* paddings
* paddings
* more paddings
* copy link
* read more
* hide avatar and placeholder when all messages are from channel
* color scheme
* fix color
* improve
* layout
* welcome message
* dark mode colors
* padding
* font size
* overscroll
* font
* logo on button
* better join
* buttons
* refactor
* another logo
* text
* desktop button
* button text
* center
* fix svg
* padding
* smaller gap
* render channel on any message changes etc
* fixes
* atomic file updates, escape attributes
* fix tests
* more tests
* more efficient rendering
* improve security
* sanitize links, include mentioned members
* schema
* fixes
* improve rendering
* fix showing correct subscribers count
* fix member names
---------
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com >
2026-06-16 14:36:55 +01:00
Evgeny Poberezkin
37f7ed3126
Merge branch 'stable'
2026-06-16 07:40:58 +01:00
ad23da63d0
core: supporter badges using anonymous BBS credentials ( #7040 )
...
* core: supporter badges using anonymous BBS credentials
* badges in profiles
* badge in profiles
* process badges
* update simplexmq
* update simplexmq
* change types
* fix migration
* migration
* update simplexmq
* fix bot API, schema
* fix postgresql build
* refactor
* postgresql schema
* correctly set badges in all cases
* badges ffi
* plan, bot types
* FFI
* FFI: export badge symbols
* add extra field
* refactor badge types to GADT
* configurable badge key
* add badge to profile, test
* ui: badge images
* generate badge key and sign badge
* badge sign in CLI
* fix commands, ui
* rename badges
* Binary
* image size, migration
* update badge images, add public key
* send badges in more cases
* update UI, tests
* bot types, schema
* postgres schema
* tone down badges
* revert formula
* refactor badges
* smaller badges
* badge position
* better badge position
* simpler
* position
* move position
* update simplexmq
* show badge after name
* badge layout
* fix badge
* debug badge height
* shift badge
* fix badge in member name
* bigger badge
* badge layout
* differentiate badge colors
* more avatars for the user's profiles
* refactor
* remove color filter
* alerts
* multiple keys, old expired
* use new BBS api
* update badge keys, bot api
* presentation header
* simplify
* parser
* update iOS images
* update public keys
* query plans
* update simplexmq
* refactor badge types
* simplexmq
* bot api types
* update simplexmq - commoncrypto flag
* update simplexmq
* pass commoncrypto flag to simplexmq in nix iOS build
* ios ui
* update core library, fixes
* badge layout
* badge size
* badge gap
* remove extensions
* simplify
* share badge in more events, reverify badge if verification failed
* larger files with badges
* allow sending larger files
* simpler
* update simplexmq
* better decoder for badge keys
* update simplexmq
---------
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com >
Co-authored-by: shum <github.shum@liber.li >
2026-06-15 22:25:08 +01:00
Evgeny Poberezkin
d657bcbba5
Merge branch 'stable'
2026-06-01 21:41:26 +01:00
Evgeny and Evgeny @ SimpleX Chat
83f4f6cd38
core: rename field in protocol ( #7038 )
...
* core: rename field in protocol
* update bot apis
---------
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com >
2026-06-01 21:33:35 +01:00
Evgeny Poberezkin
60e75aa398
Merge branch 'stable'
2026-05-31 17:33:52 +01:00
Evgeny and Evgeny @ SimpleX Chat
9bb2bec3fa
plan: web previews for channels ( #7022 )
...
* plan: web previews for channels
* types for recipient side to support channel web previews and domain names
* fix
* migrations
* update schema and api types
* update schema
* rename migrations
* core: check member role
---------
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com >
2026-05-31 17:12:12 +01:00
spaced4ndy
2b48b55190
core: deliver member profiles via relay ( #6953 )
2026-05-22 20:52:01 +00:00
spaced4ndy
92e9640e4f
core, ui: relay reject rejoin ( #6978 )
2026-05-18 09:06:25 +00:00
Evgeny and Evgeny @ SimpleX Chat
7497b90e7c
core, ui: allow indefinite deletion from history for public channel/group owners/moderators ( #6972 )
...
* Revert "core: forward compatible support for owners/admins/moderations deleting channel and public group messages without limitations (#6962 )"
This reverts commit 08108ebabb .
* core, ui: allow indefinite deletion from history for public channel/group owners/moderators
* style
Co-authored-by: Evgeny <evgeny@poberezkin.com >
* refactor
* show error on deletion
* better alerts
* test
* plan
* simplify test
* bot api docs
* refactor
* test that removed from history is not delivered to the new subscribers
* fix, refactor
* fix
* rename
* rename predicate in UI
* rename
* do not forward channel deletions from history
* remove redundant check
---------
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com >
2026-05-13 15:24:52 +01:00
spaced4ndy
24859e1281
core: announce added relay ( #6956 )
2026-05-12 12:36:23 +00:00
Evgeny and Evgeny @ SimpleX Chat
30ae0d864c
core: share links to channels and verify shared links when connecting ( #6810 )
...
* core: share links to channels and verify shared links when connecting
* refactor
* improve
* refactor case
* simplify
* exctract encodeChatBinding
* share api
* corrections
Co-authored-by: Evgeny <evgeny@poberezkin.com >
* tests
* verify signature in the tests
* drop signature if context does not match on reception
* try to test "fake" forward
* fix
* fix direct chat sharing test
* channel test
* sign link
* rename api
* refactor view
* chal link item CLI view, tests
* clean up
* share channel in channel as channel
* query plan
* fix test
* refactor
* whitespace
* simpler
* refactor
* dont use partial field update
---------
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com >
2026-04-16 23:48:19 +01:00
spaced4ndy and Evgeny Poberezkin
ac6f8b76ac
core: flatten MsgContainer type to match wire JSON format ( #6808 )
...
* core: refactor MsgContainer
* comment
* simplify
* refactor
* corrections
* update
* clean up
---------
Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com >
2026-04-15 20:28:31 +01:00
Evgeny and Evgeny @ SimpleX Chat
6f21826579
core, ui: chat item to show message error ( #6785 )
...
* core: chat item to show message error
* ui: chat item for removed messages
* remove local maven repo
* command to test dropped messages
* update nix config
* show parse errors
* error texts, simplexmq
* alert messages
* simplexmq, alert
* better parsing
* better parsing
* simplify
* correct message
* remove test api
* do not check size twice, bot types
* send error in relays
* do not create error item in relays
* diff
---------
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com >
2026-04-11 19:40:33 +01:00
Evgeny and Evgeny @ SimpleX Chat
5050e4858e
core: preset chat relays ( #6748 )
...
* core: preset chat relays
* refactor
---------
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com >
2026-04-04 16:50:07 +01:00
8167f7c2ab
core: add fields to chat relay profiles; remove unique name requirement; update relay profile in relay address link data ( #6743 )
...
* core: add fields to chat relay profiles
* wip
* wip
* fix
* fix
* fix
* enable tests
* schema
* api
---------
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com >
Co-authored-by: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com >
2026-04-03 12:42:43 +00:00
spaced4ndy
a14a66db14
core, ui: chat relay test ( #6736 )
2026-04-02 15:36:36 +00:00
spaced4ndy
929783eb6c
core: relay key and member id as immutable relay link data ( #6713 )
2026-03-30 10:48:39 +00:00
spaced4ndy
30386178ec
Revert "core: relay key and member id as immutable relay link data ( #6711 )"
...
This reverts commit d665b1f5d8 .
2026-03-28 14:03:09 +04:00
spaced4ndy
d665b1f5d8
core: relay key and member id as immutable relay link data ( #6711 )
2026-03-28 09:51:50 +00:00
Evgeny and Evgeny @ SimpleX Chat
674a545a33
core: signed messages status ( #6699 )
...
* XOcore: signed messages status
* remove empty lines
Co-authored-by: Evgeny <evgeny@poberezkin.com >
* EOL
* only mark verified as verified
* update API types
* todos
---------
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com >
2026-03-24 20:05:09 +00:00
spaced4ndy
58f47cbadf
core, ui: channel subscriber count ( #6696 )
2026-03-24 10:54:32 +00:00
spaced4ndy
b38fc62281
core: chat relays announce new members to owners (with keys); forward x.grp.mem.restrict; sign and verify x.grp.leave and x.info (member profile update) ( #6690 )
2026-03-19 19:47:02 +00:00
spaced4ndy
74fe5340f7
core: verify signed messages in channels (fix member keys not saved); sign deletion message for deleted member; relay member key ( #6683 )
2026-03-18 13:34:14 +04:00
2db92ff6ed
core: group member/owner keys for signing important messages ( #6597 )
...
* rfc: member keys
* update plan
* new encoding for message batches
* send new batch encoding in relay-based groups
* mvp launch plan
* update plan
* core: verify group member keys (#6669 )
* core: verify group member keys
* refactor, process forwards
* refactor parsing
* refactor parsing 2
* refactor parser 3
* update rfc
* simplify
* simplify
* log tag
* refactor tag logging
* refactor withVerifiedSig
* simplify
* refactor more
* comment
* fix encoding
* fix sending as group for the new binary batch encoding
* unify types
* update api docs
* clean up
---------
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com >
* core: signing messages with member keys (#6675 )
* core: signing messages with member keys (types)
* sign messages
* refactor batching
* better
* refactor
* remove unused Eq
---------
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com >
* core: forward signed messages as unchanged binary strings (#6678 )
* core: forward signed messages as unchanged binary strings
* refactor
* consolidate types
* refactor VerifiedMsg
* refactor more
* undo rename
Co-authored-by: Evgeny <evgeny@poberezkin.com >
* update schema and plans
* add signed status to chat items and events
* test signed chat items
* unify parser
* PostgreSQL fix, remove unused fields, option to send inline files in the tests
* change inline files config
* revert inline config change
* use different characters in batch encoding, to avoid conflict with inline files
* fix test, api docs, query plans
---------
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com >
---------
Co-authored-by: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com >
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com >
2026-03-16 10:46:35 +00:00
spaced4ndy
dedc57d328
Merge branch 'master' into chat-relays
2026-02-19 15:29:18 +04:00
sh
764fb27f1c
core, directory: allow voice messages during member approval phase to allow audio captchas in groups that prohibit voice messages ( #6624 )
...
* rfcs: add member-support-voice rfc
* update based on the feedback
* implement RFC
* add new tests
* fix protocol tests and update plans
* restrict voice captcha exemption to host approval phase
* update agent_query_plans.txt
2026-02-14 09:26:18 +00:00
628b00eb08
core: channel messages ( #6604 )
...
* core: channel messages (WIP)
* do not include member ID when quoting channel messages
* query plans
* reduce duplication
* refactor
* refactor plan
* refactor 2
* all tests
* remove plan
* refactor 3
* refactor 4
* refactor 5
* refactor 6
* plans
* plans to imrove test coverage and fix bugs
* update plan
* update plan
* bug fixes (wip)
* new plan
* fixes wip
* more tests
* comment, fix lint
* restore comment
* restore comments
* rename param
* move type
* simplify
* comment
* fix stale state
* refactor
* less diff
* simplify
* less diff
* refactor
---------
Co-authored-by: Evgeny @ SimpleX Chat <259188159+evgeny-simplex@users.noreply.github.com >
Co-authored-by: spaced4ndy <8711996+spaced4ndy@users.noreply.github.com >
2026-02-12 07:11:59 +00:00
Evgeny Poberezkin
e29712c2e8
Merge branch 'master' into chat-relays
2026-01-29 19:51:22 +00:00
Evgeny Poberezkin
14d5819ade
Merge branch 'stable'
2026-01-28 23:38:54 +00:00
Evgeny
a786693c1a
core: improve error handling ( #6602 )
...
* core: improve error handling
* simplexmq
2026-01-28 21:57:39 +00:00
spaced4ndy and Evgeny Poberezkin
bd8ba4d5c6
core: chat relays protocol ( #6383 )
...
* core: chat relays protocol wip
* types, notes
* remove file
* removal protocol
* schema
* status
* update
* recovery
* update
* formatting
* rename
* more types
* comment
* more docs
* decrease number of steps
* format
* correct
* update
* update protocol
* update
* typo
* todo
* update doc
* update
* update
* remove added
* update
* update
* XGrpRelayReady
* link to chat relays
* update
* remove from protocol
* update
* json
* wip
* remove comment
* wip
* update
* wip
* wip
* update
* wip
* wip
* plans
* better view
* fix
* fix
* relay acceptance
* rework api
* add relays to link
* comment
* active on con, fix send
* comments
* direct in group plan
* prepare
* member connection wip
* comments
* member connection wip
* fix forwarding
* introduce moderators to new member
* enable relay tests
* plans
* security objectives
* refactor
* add to threat model
* stress test wip
* stress test wip
* Revert "stress test wip"
This reverts commit acde8a1fb3 .
* Revert "stress test wip"
This reverts commit 6435808438 .
* remove stress test
* improve output
* invert relay fkey
* postgres schema
* comments
* group in progress, remove auto-select relays commented code
* comments
* corrections
* comment
* lint
* redundant import
* core: chat relay request worker (#6509 )
* update plans
* strict tables
* core: update group link asynchronously with relay link (#6548 )
* update simplexmq
* docs: connection to chat relays rfc (#6554 )
* add test for 2 relays (doesn't pass)
* create unknown member in same transaction as checking
* fix relays choosing different memberId (XContactRelay)
* plans, api
* use same incognito profile for relays, connect concurrently, save correct link for plan
* test
* don't duplicate items on group connection
* check relay record exists when joining
* use mapConcurrently when adding relays, update schemas
* fix multi-relay join for postgres (savepoint)
* core: async retry connection to chat relays (#6584 )
* update simplexmq
* fix api tests
* prefer throwing temp error on connection
* check group relays when deleting from configuration
* relay_request_err_reason
* relay role
* rename, fix syntax
* plans
* rename, style
---------
Co-authored-by: Evgeny Poberezkin <evgeny@poberezkin.com >
2026-01-21 13:19:06 +00:00