code
Clone this repository
https://tangled.org/bretton.dev/coves-mobile
git@knot.bretton.dev:bretton.dev/coves-mobile
For self-hosted knots, clone URLs may differ based on your setup.
- Add banner image support with gradient fallback
- Add avatar drop shadow for depth
- Display handle and DID (with QR icon) instead of display name
- Add "Joined" date with calendar icon
- Add tabbed content bar with icons (Posts, Comments, Likes)
- Implement frosted glass effect on collapsed header
- Show Memberships stat instead of Communities/Reputation
- Add UserProfile model and UserProfileProvider
- Add TappableAuthor widget for navigating to profiles
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Tapping the feed tab while already on the feed screen now scrolls the
current feed to the top, matching common social media app behavior.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add hasMore prop to FeedPage widget to track pagination state
- Show "You're all caught up!" message with checkmark when feed ends
- Add _shouldShowFooter getter for cleaner footer logic
- Prevents confusing bounce behavior when reaching end of feed
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Adjust post detail text sizing to match feed (title 16px, text 14px)
- Remove bold styling from title and author handle
- Reduce author avatar size from 24px to 20px
- Keep external embed images at same height as feed view (180px)
- Add sources section for megathread posts with clickable source links
- Add EmbedSource model with URI validation and security checks
- Add SourceLinkBar widget matching ExternalLinkBar styling
- Improve ValueKey comment clarity in feed_page.dart
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add external link embed support (link cards with thumbnail, title, description)
- Add BlueskyExternalEmbed model with domain extraction
- Improve quoted posts: show handle, timestamp, media placeholder
- Handle unavailable quoted posts (blocked, deleted, detached)
- Add official Bluesky SVG icons (reply, repost, like, logo)
- Match Bluesky's dim theme colors exactly
- Remove text truncation for posts (Bluesky has 300 char limit)
- Add formatCount and formatFullDateTime utilities
- Add comprehensive tests for Bluesky post models (67 tests)
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add UI components to render Bluesky crosspost embeds in feeds with
Bluesky-styled post cards.
New files:
- lib/models/bluesky_post.dart: Data models for BlueskyPostEmbed,
BlueskyPostResult with URL helpers and robust JSON validation
- lib/constants/bluesky_colors.dart: Bluesky brand color palette
- lib/widgets/bluesky_action_bar.dart: Disabled action bar showing
engagement counts (view-only)
- lib/widgets/bluesky_post_card.dart: Main card widget with avatar,
author info, text, media placeholder, quote posts, and action bar
Changes:
- lib/models/post.dart: Add BlueskyPostEmbed parsing for
social.coves.embed.post type, fix nullable text field handling
- lib/widgets/post_card.dart: Conditionally render BlueskyPostCard
when embed is present
- lib/services/coves_api_service.dart: Add catch blocks for parsing
errors to prevent silent failures
Features:
- 42px circular avatar (tappable → opens Bluesky profile)
- Author name, handle, and relative timestamp
- Post text with max 6 lines
- Media placeholder with "View on Bluesky" link
- Nested quote post support (1 level)
- Disabled action bar with reply/repost/like counts
- "View on Bluesky" footer link
- Graceful unavailable post handling
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add CreateCommunityResponse model with defensive JSON parsing
- Add createCommunity() API method to CovesApiService
- Transform CommunitiesScreen to admin-aware with creation form
- Admin check via handle (coves.social, alex.local.coves.dev)
- Backend enforces actual permissions via DID allowlist
- DNS-valid name validation with regex
- Proper listener cleanup to prevent memory leaks
- Cached API service instance per screen lifecycle
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Update formatHandleForDisplay to handle both formats:
- New: c-gaming.coves.social → !gaming@coves.social
- Legacy: gaming.community.coves.social → !gaming@coves.social
Add null fallback in PostCard._buildCommunityHandle to prevent
crashes when handle format is unrecognized.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>