Clone this repository
For self-hosted knots, clone URLs may differ based on your setup.
Download tar.gz
Use proper M3 tonal layering with surface/surfaceContainer colors,
ElevatedCards, SuggestionChips, left-aligned action buttons, inline
timestamps, and compact FlowRow notification avatars.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Display "via Bluesky" or "via Blacksky" (or the domain for unknown
appviews) under the "Feeds" title in the navigation rail drawer so
users know which appview they're connected through.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
The atproto-proxy header was set on all requests, but PDS procedures
(createRecord, deleteRecord, putRecord, uploadBlob, muteActor, etc.)
should not be proxied. When Blacksky was selected as appview, the PDS
tried to proxy writes to Blacksky which returned XRPCNotSupported.
Add a separate pdsClient without the proxy header for all PDS-native
calls. The appview client (with proxy header) is used only for queries
like getTimeline, getProfile, searchPosts, etc.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Replace the from:user chip with a PersonSearch icon in the top bar
actions. Tapping it opens a dialog to enter a handle; when active, the
top bar title shows from:handle and the People tab is hidden. Tapping
the icon again clears the filter.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Switch search to Latest/Top/People tabs via PrimaryTabRow. Add a
from:user filter chip that opens an AlertDialog to enter a handle,
applying the from: query prefix to post searches.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Use M3 PrimaryTabRow with Posts, Replies, Media, Video tabs instead of
FilterChip pills for profile feed filtering.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Multiple notifications (likes, reposts, quotes) can reference the same
post, causing duplicate URIs in the getPosts batch request. This created
URLs too large for the 15s timeout. Add .distinct() to postsToFetch.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>