v2.0.0

vsecoder
Sat, 18 Apr 2026 21:06:56 +0200

This 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