Clone this repository
For self-hosted knots, clone URLs may differ based on your setup.
Download tar.gz
Remove dependency on the legacy Lemmy `site` API for the sidebar,
navbar, meta tags, legal page, and favicon. Introduce Coves-branded
components with aggregated stats fetched from the Coves API.
Changes:
- Add CovesSidebar component with mascot, description, and site stats
- Add siteStats reactive store with 5-minute cache
- Add LilDude mascot SVG component and brand assets
- Add static favicon.svg and community-guidelines.md
- Move Home button from navbar to sidebar with exact URL matching
- Simplify layout meta tags to use static Coves branding
- Load legal/community guidelines from local markdown file
- Remove InstanceCard usage from layout, profile, and navbar
- Remove sidebar footer (version, source, donate links)
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Thread loadFeed callback through PostListShell and VirtualFeed to
restore infinite scroll pagination on home and community pages. Add
auth error detection (401/403) that shows session-expired message
with login button. Improve feed robustness with null-safe responses,
cursor-based hasMore logic, and proper error re-throwing.
Changes:
- Add loadFeed prop to PostListShell and pass to VirtualFeed
- Create loadFeed functions in home and community page loaders
- Detect XrpcError 401/403 and show login prompt instead of retry
- Move loading=false to finally block in VirtualFeed
- Guard against null feed responses with ?? []
- Add empty state placeholder on home page
- Fix /communities link to /explore/communities
- Update empty feed description copy
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove the Photon-era PascalCase sort mapping layer (Hot, TopDay, Subscribed,
etc.) and replace it with direct Coves API values (hot/new/top, discover/timeline).
Adds a timeframe parameter for top sort and introduces FeedTabs and SortMenu
components for the home feed.
Changes:
- Rewrite mapSort() to validate Coves sort/timeframe values directly
- Rewrite mapListing() for discover/timeline with auth guard
- Add CovesSortParams discriminated union for type-safe sort params
- Replace SortType/ListingType/CommentSortType with Coves-native literals
- Add timeframe field to settings.defaultSort
- Create FeedTabs.svelte (Discover/For You tab bar)
- Create SortMenu.svelte (sort type + timeframe dropdown)
- Update home page, community, and post routes to pass timeframe
- Make searchParam() async with error handling
- Add feed.discover/feed.forYou i18n keys
- Rewrite sort tests for Coves-native values
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Migrate the voting UI from a dual up/down chevron system to a single
heart-based like/unlike toggle, aligning with the Coves social model.
Changes:
- Replace PostVote and CommentVote chevron buttons with AnimatedHeart
- Add AnimatedHeart.svelte with pop/circle-burst/particle animation
- Simplify computeVoteState to only handle 'up' direction (like toggle)
- Score now equals upvotes count (no downvote subtraction)
- Remove vote ratio bar, voteColor, and shouldShowVoteColor utilities
- Add dev-mode hostname normalization for ATProto OAuth cookie domain
- Extract validateProxyPath into dedicated validate.ts module
- Fix proxy body forwarding: use blob() instead of streaming to avoid
Node.js undici "expected non-null body source" errors
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Rebrand the forked Photon project to Kelp, the Coves web frontend.
This is standard practice after forking - users should see Coves/Kelp
branding, not the upstream Photon name.
Changes:
- Rename package from "photon-lemmy" to "kelp-coves"
- Update PWA manifest name/description for Kelp/Coves
- Rename photonify() to localizeLink() across codebase and tests
- Rename Photon icon export to Kelp, PHOTON_DEFAULT to KELP_DEFAULT
- Update all 17 i18n files (Photon -> Kelp, with proper declension)
- Update source links to tangled.org/bretton.dev/coves-frontend
- Rewrite README with Kelp identity and Photon attribution
- Fix NSID casing: getprofile -> getProfile
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Migrate user profiles from /u/[handle] to /profile/[handle=handle] with
a validated SvelteKit param matcher that accepts handles and DIDs while
rejecting reserved route segments. The old /u/[handle] route now
301-redirects, and the legacy /profile/user route is removed entirely.
Changes:
- Add handle param matcher validating handles/DIDs against reserved segments
- Move profile page + UserActions from /u/[handle] to /profile/[handle=handle]
- Add 301 redirect from /u/[handle] to /profile/[handle] for backwards compat
- Redirect /profile to /profile/{handle} for authenticated users, /login for guests
- Move profile tabs and auth guard into (local_user) layout group
- Update all navigation links (sidebar, navbar, command palette) to use new paths
- Fix API NSIDs: getCommunityFeed and getProfile to match backend
- Rewrite markdown link generation (photonify, linkify) from /u/ to /profile/
- Add tests for handle matcher, profile redirect, /u/ redirect, and photonify
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Replace client-side image optimization (query param thumbnail/format)
with the Coves backend image proxy system. The proxy serves images at
/img/{preset}/plain/{did}/{cid} with presets like avatar, banner,
content_preview, content_full, and embed_thumbnail.
Changes:
- Add image-proxy module with parseProxyUrl, withPreset, imageUrl helpers
- Add thumb/fullsize fields to EmbedImage type
- Widen embed $type discriminants to accept non-#view variants
- Migrate Avatar, MdImage, PostLink, PostIframe, PostImage,
PostMediaCompact to use proxy presets instead of query params
- Add onerror handlers for graceful image fallbacks
- Simplify <picture> srcset generation across components
- Make all embed type switches exhaustive with never checks
- Deprecate optimizeImageURL in favor of withPreset
- Add comprehensive tests for image-proxy module
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Fix sort parameter handling in the post route to use mapSort for consistency
with the Coves migration. Previously the raw URL parameter was passed directly
to the API, but after migrating to Coves XRPC, sort values need to be mapped
from legacy Lemmy format to the new format.
Also expanded .gitignore to exclude Playwright browser testing artifacts that
were being generated during development.
Changes:
- Import and use mapSort to transform legacy sort parameter
- Rename 'sort' variable to 'legacySort' for clarity
- Add .gitignore patterns for Playwright outputs (.playwright-output, *.png, console-*.txt, network-*.txt, *-snapshot.md)
Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>