- Renamed apps/web/src/app/twitter/ -> feed/ - Renamed TwitterComposer -> FeedComposer, TwitterSidebar -> FeedSidebar - TwitterPage -> FeedPage, TwitterComposerProps -> FeedComposerProps - Shell nav: 'Twitter' -> 'Feed', route /twitter -> /feed - BottomNav: 'Twitter' -> 'Feed' - Root page: redirect / -> /feed (was /twitter) - All 'Twitter' product references purged from codebase
8.8 KiB
DegenFeed Web — TODO
Rebuild Sprint: Make DegenFeed a Real Web3 Aggregator
The current app is functionally broken for users. The backend exists and is mostly wired, but feeds feel empty, cache is stale, the frontend does not look or behave like a modern web3 social app, and the newsletter does not actually pull from the protocols it advertises. This sprint is the hard reset.
Critical fixes (this session)
- Fix
/api/newsletter/digestso it fetches from each selected protocol (Nostr, Farcaster, Lens, Bluesky, Mastodon, Threads) instead of only RMI + RSS - Fix
GTS_AUTH_CONFIG.apiBasedefault (http://127.0.0.1:8082→https://social.degenfeed.xyz) - Add
noCacheJsonResponsehelper and disable stale caching for/api/feed/newsand/api/newsletter/digest - Add
cache: 'no-store'to client-side fetches in/news,/newsletter, and/home/[section] - Run
make ciandmake securityand fix regressions - Smoke-test
/newsletter,/news, and/home/nostrin local dev / wrangler dev
15 Next Moves (ranked by impact)
-
Make
/homeper-protocol sections actually work Ensure/home/nostr,/home/farcaster,/home/bluesky,/home/lens,/home/mastodon,/home/threads, and/home/redditeach call the correct provider endpoint and render a real feed with loading, error, and empty states. Fix/home/mastodonto use/api/feed/home?protocols=mastodon(or keep/api/feed/activitypubbut wire it to the deployed GotoSocial instance). -
Rebuild the landing experience The current app looks like a generic dashboard. Design a web3-first
/twittertimeline with: compact PostCards, hover actions, quote/repost counts, protocol badges, embedded link previews, and image lightbox. Copy the best parts of Warpcast / Bluesky / X, not a Bootstrap card layout. -
Fix the empty-state problem everywhere Every feed currently shows an empty card with no personality. Add protocol-specific empty states: "No Nostr notes found — try a different relay", "Mastodon timeline is quiet — create the first post @social.degenfeed.xyz", etc., with one-click fixes (switch relay, create account, sign in).
-
Add real-time / polling updates The news page polls every 60s for new stories but other timelines do not. Add a global
useFeedPollerhook that shows a "New posts" banner and lets users pull-to-refresh on mobile and click-to-refresh on desktop. -
Replace the RMI hard dependency with a resilient pipeline RMI is unreachable from Cloudflare edge. The feed should always fall back to public sources without the user noticing. Remove all user-facing "RMI DataBus" copy until the backend is actually deployed and reachable from the edge.
-
Harden the Mastodon/GotoSocial integration Our own instance is the most important protocol. Add a dedicated GotoSocial provider path that reads the public timeline from
https://social.degenfeed.xyz/api/v1/timelines/public, supports hashtag timelines, and lets signed-in users see their home timeline. -
Add protocol-aware composer The composer now shows all protocols. Signed-in protocols are selectable; unsigned protocols show a lock icon and open sign-in when clicked. Added live publish preview (
ComposePreview) and per-protocol character-limit warnings that disable the Post button when exceeded. Updated both the inlineTwitterComposerand theComposeModal. -
Implement wallet-first authentication Wallet sign-in is now the primary path in the
SignInModal(Ethereum + Solana buttons at the top). Added/api/auth/signoutto clear the__Host-dfidcookie, addedsignOuttoAuthProvider, and exposed it in the/twitterheader and sidebar./api/bridge/rss-to-nostrnow requires the session cookie too. -
Add a unified notifications stream Added
useNotificationshook that builds auth from all linked identities, pollsPOST /api/notificationsevery 60s, and persists read state in localStorage. Extended the backend to aggregate notifications from Nostr, Mastodon, and Bluesky. Added theNotificationBellto the/twitterheader and kept it in/home/[section]. -
Fix ranking and deduplication Backend now computes and attaches a per-post score breakdown (recency, engagement, relevance, quality, diversity, source, velocity, reasons).
PostCardshows a★badge with hover tooltip exposing each component. Added a "hide low-quality" toggle in/twitter(persisted in localStorage) that filters posts withscore.total < 1.0. The toggle respects the session-boundhideLowQualitypreference so it can later be moved to a profile page. -
Add cross-posting to the bridge Wire
/api/bridge/rss-to-nostrand a general/api/publishto cross-post from Mastodon to Nostr, Farcaster to Bluesky, etc. Start with one working pair (Mastodon → Nostr) and expose it in the composer. -
Build a mobile-first responsive layout The current layout is desktop-only with a hidden right sidebar. Implement a bottom nav (Home, Search, Notifications, Profile) for mobile, collapsible sidebars, and proper safe-area handling.
-
Add protocol health dashboard
/api/feed/healthexists but is not exposed in the UI. Add a/statuspage (or admin panel) showing each protocol's latency, success rate, and last fetched time so users know when a feed is degraded. -
Add search that actually searches
/api/searchand/api/search/identityare wired. Add a global search bar in the shell that searches posts, identities, and niches across protocols, with filters for protocol and time range. -
Ship the newsletter as a real product After the digest works, add an actual email-sending path (Postmark / SES) and a cron trigger that builds the daily digest from live data and sends it to subscribers. Add a
/newsletter/managepage with preferences and unsubscribe.
Active
- Add lightweight Twitter/X-style timeline (
/twitter) - Inline composer with per-protocol toggles, lock icons, and preview
- Wallet-first authentication with sign-out UI
- Unified notifications stream with real bell and unread counts
- Ranking transparency: score badge, hover breakdown, hide-low-quality toggle
- "For You" and "Following" tabs
- Wire logo into Shell and home page
- Backend fixes: Nostr NIP-23 long-form support + HTTP fallback
- Fix newsletter digest to fetch from all selected protocols
- Fix GotoSocial default API base URL
- Add no-cache helpers for dynamic feed endpoints
- Add no-store fetches to client feed pages
- Rebuild PostCard and protocol-aware composer
Next
- Cross-posting bridge (#11): Mastodon → Nostr working pair exposed in composer
- Set
RMI_BACKEND_URLinworkers/api/wrangler.tomlfor production RSS data - Harden Reddit fetching against CF Worker blocks (prefer
old.reddit.comRSS) - Harden Threads scraper or reduce curated handle set
- Cache provider results in
CACHEKV for 60–180s to reduce latency - Server-side filter for Following tab instead of client-side filtering
- Add real-time updates to timeline
- Add repost/quote preview in composer
- Improve mobile layout (currently hides right sidebar)
- Add notification bell to Twitter timeline
- Fix GotoSocial
trusted-proxieswarning on deployed instance (social.degenfeed.xyz)
Blocked
- None
Done
- apps/landing live at degenfeed.xyz
- apps/web live at app.degenfeed.xyz
- CI, Makefile, pre-commit configured
- Protocol SDKs, feed-core, ranking, identity packages
/news, wallet sign-in, composer, feed aggregation- Fixed critical syntax error in
packages/feed-providers/src/providers/nostr.ts - Fixed monorepo type errors across utils, ranking, feed-providers, ui, api-worker, web
- Fixed Biome lint errors across packages and worker
- Created
/twitterroute with X-style layout using existing components - Added
@degenfeed/storagedependency to@degenfeed/uipackage - Created
packages/utils/tsconfig.json - Upgraded
@biomejs/biomein@degenfeed/api-workerto match monorepo version - Replaced
<img>elements withnext/imageacross the web app for performance - Fixed all remaining Biome lint warnings (unused imports/variables in legacy files)
- Made
/twitterthe default landing page (redirect/→/twitter) - Added DegenFeed logo to the Twitter timeline header
- Fixed RSS/RMI fallback to avoid the 6s timeout when
RMI_BACKEND_URLis unset - Fixed default protocols in
/api/feed/hometo excludeethereum/solana - Audited full feed data flow: providers are wired to real endpoints; RMI timeout was the main blocker
- Mocked
@degenfeed/rss-sdkinworkers/api/src/__tests__/curated.test.tsto stop flaky network timeouts - Added
.gitleaks.tomlallowlist for generated.vercelbuild tokens and markedGTS_CLIENT_IDas allowed;make securitynow passes