Arseniy Klempner 78b7ef64be
feat: add user following feature
Add ability for users to follow other users and see their posts in a
personalized feed. Following data is stored locally in IndexedDB.

Core (@opchan/core):
- Add Following type and FollowingCache interface
- Add FOLLOWING store to IndexedDB schema (v6)
- Add following CRUD methods to LocalDatabase
- Create FollowingService with follow/unfollow/toggle methods
- Add getFollowingPostsFromCache transformer function
- Export FollowingService from core index

React (@opchan/react):
- Add following state to ContentSlice in opchanStore
- Add following methods to useContent hook:
  - toggleFollow, followUser, unfollowUser
  - isFollowing (sync), getFollowingPosts, clearAllFollowing
- Add comprehensive JSDoc documentation with examples

App:
- Create FollowButton component
- Create FollowingCard and FollowingList components
- Create FollowingPage with Following and Feed tabs
- Add follow/unfollow button to PostCard and PostDetail
- Add FOLLOWING nav link to Header
- Add /following route to App

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2025-12-12 10:16:27 -08:00
2025-12-12 10:16:27 -08:00
2025-12-12 10:16:27 -08:00
2025-09-25 21:52:40 +05:30
2025-11-14 14:02:27 -05:00
2025-09-25 21:52:40 +05:30
2025-09-25 21:58:56 +05:30
2025-09-25 21:52:40 +05:30
2025-09-25 21:52:40 +05:30

Opchan

TypeScript libraries for building decentralized, Waku-powered forums.

Packages

  • @opchan/core Core browser library: Waku messaging, local database, identity/ENS & Ordinals resolution, delegation, and forum actions.
  • @opchan/react React provider and hooks on top of @opchan/core.

Install

# core only
npm i @opchan/core

# react integration
npm i @opchan/react @opchan/core react react-dom

Quickstart

React

import React from 'react';
import { createRoot } from 'react-dom/client';
import { OpChanProvider, useForum } from '@opchan/react';

const config = { ordiscanApiKey: 'YOUR_ORDISCAN_API_KEY' };

function NewPostButton({ cellId }: { cellId: string }) {
  const { content, permissions } = useForum();
  return (
    <button
      disabled={!permissions.canPost}
      onClick={() => content.createPost({ cellId, title: 'Hello', content: 'World' })}
    >
      New post
    </button>
  );
}

function App() {
  return (
    <OpChanProvider config={config}>
      <NewPostButton cellId="general" />
    </OpChanProvider>
  );
}

createRoot(document.getElementById('root')!).render(<App />);

More details:

  • React API docs: packages/react/README.md

Development

This is an npm workspace. From the repo root:

# install all deps
npm install

# build all packages
npm run build

# build a specific package
npm run build --workspace=@opchan/core
npm run build --workspace=@opchan/react

# watch mode during development
npm run dev --workspace=@opchan/core
npm run dev --workspace=@opchan/react

# test & lint
npm test
npm run lint

License

MIT

Description
Languages
TypeScript 98.6%
CSS 1%
JavaScript 0.3%
HTML 0.1%