-
v2.0.0 — social feed + Twitter-style client
released this
2026-04-18 21:06:56 +02:00 | 10 commits to main since this releaseThis is the first major bump: the old channel/broadcast model is
fully removed, replaced with a VK/Twitter-style public feed. A new
Phase of the stack (media scrubbing + FFmpeg sidecar) ships
alongside, and the client app is folded into the main repo as a
first-class part of the release.Chain
- New events: CREATE_POST, DELETE_POST, FOLLOW, UNFOLLOW,
LIKE_POST, UNLIKE_POST - New payloads: PostRecord, CreatePostPayload, DeletePostPayload,
FollowPayload, LikePostPayload, UnlikePostPayload - New state prefixes: post:, postbyauthor:, follow:, followin:,
like:, likecount: - Queries: Post, PostsByAuthor (with before-ts pagination),
Following, Followers, LikeCount, HasLiked - Pricing: BasePostFee 1000 µT + PostByteFee 1 µT/byte;
MaxPostSize 256 KiB; fee credited to HostingRelay - Integrity: reply_to/quote_of mutex; only-author DELETE;
duplicate FOLLOW/LIKE rejected; content_hash required 32 B
Relay
- New feed_mailbox.go: per-post body storage, view counter,
hashtag inverted index, TTL auto-eviction - envelope.Store: canonicalised ID + server-stamped SentAt
(v1.0.1 hardening, preserved)
Node HTTP
- New /feed endpoints: publish, post/{id}, post/{id}/attachment,
post/{id}/stats, post/{id}/view, author/{pub}, timeline,
trending, foryou, hashtag/{tag} - /relay/broadcast promoted to primary E2E path; /relay/send
flagged non-E2E (still served for backward compat) - DELETE /relay/inbox/{id} now requires Ed25519 signed auth
against identity-registry - Rate limits on all /relay/* and /feed/* (withSubmitTxGuards
- withReadLimit)
- Feature flags: feed_v2, media_scrub, relay_broadcast added;
channels_v1 removed
Media
- New media/ package with Scrubber type — mandatory EXIF/GPS/
camera-info strip on every /feed/publish attachment - docker/media-sidecar/: FFmpeg-based video/audio re-encoder
(runs alongside the node; node calls it via
DCHAIN_MEDIA_SIDECAR_URL)
Tests
- blockchain: TestFeedCreatePost, TestFeedInsufficientFee,
TestFeedFollowUnfollow, TestFeedLikeUnlike,
TestFeedDeletePostByOther - relay: TestFeedMailbox{StoreAndGet,TooLarge,HashtagIndex,
ViewCounter,ByAuthor,Delete,RecentIDs} - media: EXIF-canary regression test
- node: end-to-end HTTP integration (TestE2EFullFlow +
TestE2E{LikeUnlike,Timeline,Trending,ForYou,Hashtag,
Scrubber,RejectsMIMEMismatch,BadSignature,StaleTimestamp}) - node: two-node propagation (TestTwoNode{PostPropagation,
LikeCounterSharedAcrossNodes,FollowGraphReplicates})
Client (new in repo)
- app/(app)/feed/ — three-tab feed (Подписки/Для вас/В тренде)
with Twitter-style PostCard, infinite scroll, visibility-
driven view counter, share-to-chat via embedded post card - app/(app)/compose.tsx — full-screen post composer with
client-side image compression (expo-image-manipulator),
live fee estimate, hashtag preview - app/(app)/feed/[id].tsx — full post detail screen
- app/(app)/feed/tag/[tag].tsx — hashtag feed
- app/(app)/profile/[address].tsx — profile page with
Follow/Unfollow + info card - lib/feed.ts — every endpoint wrapped + tx builders
- lib/forwardPost.ts — share-post-to-chat payload encoding
- components/feed/ShareSheet.tsx, PostCard.tsx
- components/chat/PostRefCard.tsx — embedded-post bubble
Channels removal (breaking)
- EventCreateChannel, EventAddMember removed
- CreateChannelPayload, AddMemberPayload, ChannelMember removed
- prefixChannel, prefixChanMember removed
- chain.Channel(), chain.ChannelMembers() removed
- node/api_channels.go removed
- ExplorerQuery.GetChannel / GetChannelMembers removed
- Client ContactKind stripped to 'direct' | 'group'
- NavBar Feed tab: SOON pill removed
Docs
- New docs/api/feed.md — full feed API reference
- docs/api/relay.md — rewritten with broadcast/send distinction
- docs/architecture.md — L2 description updated, new social-feed
section with flow diagram - docs/node/README.md — BadgerDB schema reference updated
- README.md — feed mentioned in features, endpoint tables added
Downloads
- New events: CREATE_POST, DELETE_POST, FOLLOW, UNFOLLOW,