Files
psf-memo-client/specs/feature-backlog.md
T

6.2 KiB
Raw Blame History

psf-memo-client — Prioritized Feature Backlog

Status: DRAFT — saved for future development cycles. Owner: specifier Last updated: 2026-05-25


Goal

Make psf-memo-client feature-equivalent to memo.cash. Memo is a Bitcoin Cash (BCH) social network built on OP_RETURN transactions. Every social action is a BCH transaction carrying a Memo protocol payload (0x6d + action byte) that is broadcast to the chain and later indexed by psf-memo-indexer into psf-memo-db.

Architecture constraints

  • Identity/auth: the auto-generated HD wallet (12-word mnemonic) already persisted in browser Local Storage by the existing React app is the Memo identity. The wallet's first derived key pair is the posting/identification key.
  • Write path: broadcasting is done via minimal-slp-wallet.sendOpReturn(wallet, bchUtxos, msg, prefix, bchOutput, satsPerByte).
  • Read path: psf-memo-db REST API (/posts/*, /profile/*, /level/*). API may be refactored (in scope) to support a good UX.
  • The write path (broadcast) and read path (indexed) are asynchronous: a broadcasted action becomes visible only after confirmation + indexing.

Memo protocol action codes

Reference: https://memo.sv/protocol

Action byte Meaning
0x6d01 Set name
0x6d02 Post memo
0x6d03 Reply to memo
0x6d04 Like / tip memo
0x6d05 Set profile text
0x6d06 Follow user
0x6d07 Unfollow user
0x6d0a Set profile picture
0x6d0b Repost memo (planned)
0x6d0c Post topic message
0x6d0d Topic follow
0x6d0e Topic unfollow
0x6d10 Create poll
0x6d13 Add poll option
0x6d14 Poll vote
0x6d16 Mute user
0x6d17 Unmute user
0x6d24 Send money
0x6d300x6d35 MIP-0009 token sell / buy / attach signature / pin

Tier P1 — Core social verbs (write + read)

These are the foundational posting and identity actions. Each is a broadcast action plus its read/display surface. This is the recommended first development slice.

# Feature Memo action Write Read surface
1 Post a Memo 0x6d02 Compose + sendOpReturn Appears in recent feed & own profile after indexing
2 Set display name 0x6d01 Broadcast name Name shown on posts, profiles, feed
3 Reply to a Memo 0x6d03 Broadcast reply to parent txid Nested thread view
4 Like a Memo 0x6d04 Broadcast like for a post txid Like count + liked state on post
5 Set profile text (bio) 0x6d05 Broadcast bio Shown on profile page
6 Set profile picture 0x6d0a Broadcast avatar URL Avatar on profile + posts
7 Follow a user 0x6d06 Broadcast follow of address Follow button state
8 Unfollow a user 0x6d07 Broadcast unfollow Follow button state; following list

API/DB needs (P1): like counts + liked-state per post; my follow status per user; follower/following lists; name + profile + avatar joined into feed/profile responses (avoid N+1 lookups). Current /posts/recent omits name/avatar/likes.

Priority order within P1

  1. Post a Memo — the primary verb; unblocks all others. DONE
  2. Set display name — makes the feed readable and gives identity. DONE
  3. Reply to a Memo — core conversation; extends the existing thread modal. DONE
    • Decisions (2026-08-26, from memo.cash UI review): reply max = 184 bytes (UTF-8 byte count); reply form inside the thread modal; keep the existing comment-icon behavior (opens the thread modal); replicate the live [remaining] byte counter (turns red when over); update the thread optimistically after broadcast; users can reply to a reply (nested).
  4. Like a Memo — social signal; needs like-count API.
  5. Set profile text — bio for the profile page.
  6. Set profile picture — avatar for posts/profiles.
  7. Follow a user.
  8. Unfollow a user.

P2 — Topics

# Feature Memo action
9 Post a topic message 0x6d0c
10 Follow a topic 0x6d0d
11 Unfollow a topic 0x6d0e
12 Topic feed page read

Needs: topics index in psf-memo-db, topic feed endpoint, topic follow state.

P3 — Polls (later)

# Feature Memo action
13 Create a poll 0x6d10
14 Add a poll option 0x6d13
15 Vote in a poll 0x6d14

Needs: poll data model + rendering + vote aggregation in psf-memo-db.

P4 — Moderation (later)

# Feature Memo action
16 Mute a user 0x6d16
17 Unmute a user 0x6d17

Needs: per-wallet mute list applied to feed filtering.

P5 — Money & tokens (later)

# Feature Memo action
18 Send money 0x6d24
19 Token sell / buy / pin 0x6d300x6d35 (MIP-0009)

P6 — Discovery & UX (later)

# Feature Notes
20 Search (posts / profiles / topics / tags) needs DB search index
21 Tags / hashtags link + filter by tag
22 Notifications replies / likes / follows to my posts
23 Ranked feed memo.cash "ranked" post ordering
24 Repost 0x6d0b (planned in protocol)

Read-only vs write capability by cycle

  • Cycle 0 (current): read-only display of recent posts, profiles, post threads.
  • Cycle 1 (P1): add write code paths (broadcast via sendOpReturn). UI is read-only until a broadcasted action is confirmed + indexed; then the feed/profile refresh.
  • Later cycles: topics, polls, moderation, money/tokens, discovery.

Notes for future cycles

  • Broadcast result (txid) is returned immediately; the action appears in the feed only after block confirmation + indexing. Specs must reflect this async visibility.
  • Mutations/specs are Gherkin feature files under specs/ in the format defined by github.com/unclebob/Acceptance-Pipeline-Specification.