From 9353d3fe3b20c96c340eaeebeb9c656516acefb7 Mon Sep 17 00:00:00 2001 From: Owais Jamil Date: Sat, 21 Mar 2026 16:57:14 -0500 Subject: [PATCH] docs: add changelog --- CHANGELOG.md | 42 ++++++++++++++++++++++++++++++ docs/tasks/phase-1.md | 32 +++-------------------- docs/tasks/phase-2.md | 42 +++--------------------------- docs/tasks/phase-3.md | 46 +++----------------------------- docs/tasks/phase-4.md | 55 +++------------------------------------ docs/tasks/ui-refactor.md | 49 +++++----------------------------- 6 files changed, 64 insertions(+), 202 deletions(-) create mode 100644 CHANGELOG.md diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..924dab1 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,42 @@ +# CHANGELOG + +## v0.1.0 (Unreleased) + +### Added + +#### 2026-03-16 + +- OAuth2 authentication flow (app password for debugging) +- Theming - Oxocarbon, Rose Pine, Nord, Catppuccin + +#### 2026-03-17 + +- Profile screen (post viewing) +- Feed view and management screens (reordering & pinning) +- Post actions (like, reply, repost) +- Local and ATProto/cloud saving of posts + +#### 2026-03-18 + +- Post composer with persisted drafts +- Post deletion +- "Dev Tools" -> view logs and explore PDS records ([pdsls](https://pds.ls)) style + +#### 2026-03-19 + +- Notification viewing +- Search screen for posts and users +- Jump to profile action from search screen with autocomplete +- Direct messages and requests +- Media players and downloading of images and videos + +#### 2026-03-20 + +- Post thread screen +- Threaded replies with collapse/expand +- Auto-collapse replies after a certain depth + +#### 2026-03-21 + +- Moderation service integration +- Labels added to users in posts diff --git a/docs/tasks/phase-1.md b/docs/tasks/phase-1.md index 86959be..e684a66 100644 --- a/docs/tasks/phase-1.md +++ b/docs/tasks/phase-1.md @@ -2,40 +2,16 @@ ## M0 — Project Scaffolding -- [x] Add dependencies (`bluesky`, `atproto_oauth`, `bluesky_text`, `flutter_bloc`, `drift`, `go_router`) -- [x] Set up feature-first folder structure (`core/`, `features/auth|profile|settings/`) -- [x] Configure Drift database with `accounts`, `cached_profiles`, `cached_posts`, `settings` tables -- [x] Configure `go_router` with initial route definitions (login, home, profile, settings) +Completed [2026-03-16](../../CHANGELOG.md#2026-03-16) ## M1 — Authentication -- [x] Implement App Password login (`createSession`) behind `kDebugMode` flag -- [x] Implement OAuth 2.0 flow (DPoP + PAR + PKCE) via `atproto_oauth` -- [x] Set up loopback redirect listener (`http://127.0.0.1/callback`) -- [x] Build `AuthBloc` — events: `LoginRequested`, `LogoutRequested`, `SessionRestored`; states: `Unauthenticated`, `Authenticating`, `Authenticated`, `AuthError` -- [x] Session persistence: store/restore tokens in Drift, silent refresh on launch -- [x] Build login screen (handle input, OAuth button, debug app-password form) -- [x] Logout: revoke tokens, clear Drift row, reset Bloc, navigate to login +Completed [2026-03-16](../../CHANGELOG.md#2026-03-16) ## M2 — Profile Rendering -- [x] Build `ProfileBloc` — fetch via `getProfile` / `getProfiles` -- [x] Profile screen: avatar, banner, display name, handle, description, stats (followers/following/posts), pronouns, website -- [x] Build `FeedBloc` — paginated fetch via `getAuthorFeed` with cursor + filter support -- [x] Post card widget: text, timestamps, embeds (images, quote posts, link cards) -- [x] Facet rendering: parse via `bluesky_text`, render mentions / links / hashtags as tappable spans (UTF-8 byte-safe) +Completed [2026-03-17](../../CHANGELOG.md#2026-03-17) ## M3 — Settings & Theming -- [x] `SettingsCubit` backed by Drift — theme mode preference (system / light / dark) -- [x] Oxocarbon Dark `ThemeData` / `ColorScheme` -- [x] Oxocarbon Light `ThemeData` / `ColorScheme` -- [x] Catppuccin Mocha (Dark) `ThemeData` / `ColorScheme` -- [x] Catppuccin Latte (Light) `ThemeData` / `ColorScheme` -- [x] Nord Polar Night (Dark) `ThemeData` / `ColorScheme` -- [x] Nord Snow Storm (Light) `ThemeData` / `ColorScheme` -- [x] Rosé Pine Main (Dark) `ThemeData` / `ColorScheme` -- [x] Rosé Pine Dawn (Light) `ThemeData` / `ColorScheme` -- [x] Theme picker in settings screen (all 4 palettes × 2 variants + system) -- [x] Respect system theme when set to "system" -- NOTE: sans font changed to dmsans from geist +Completed [2026-03-16](../../CHANGELOG.md#2026-03-16) diff --git a/docs/tasks/phase-2.md b/docs/tasks/phase-2.md index ac3c5ff..d30590e 100644 --- a/docs/tasks/phase-2.md +++ b/docs/tasks/phase-2.md @@ -2,50 +2,16 @@ ## M4 — Logging -- [x] Add `logger` package dependency -- [x] `AppLogger` wrapper — singleton with `DevelopmentFilter` + `PrettyPrinter` for console, `AdvancedFileOutput` + `SimplePrinter` for file -- [x] File rotation — daily log files in app documents dir (`lazurite_YYYY-MM-DD.log`), 3-day retention -- [x] `LoggingBlocObserver` — log BLoC state transitions at `debug` level -- [x] HTTP logging interceptor — request/response summaries, redact `Authorization` header, truncate bodies -- [x] `NavigatorObserver` subclass — log route changes at `info` level -- [x] Log viewer screen — scrollable list reading from log files on disk -- [x] Level filter chip bar — toggle visibility per log level -- [x] Free-text search across log messages -- [x] Share button — export current day's log file via system share sheet -- [x] Clear all logs with confirmation dialog -- [x] Add "Logs" entry under Dev Tools in Settings screen +Completed [2026-03-18](../../CHANGELOG.md#2026-03-18) ## M5 — Feeds -- [x] Build home screen with horizontally-swipable tab bar (one tab per pinned feed) -- [x] Implement timeline feed via `getTimeline` with cursor pagination -- [x] Implement feed generator rendering via `getFeed` (AT-URI + pagination) -- [x] `FeedPreferencesCubit` — read/write `savedFeedsPrefV2` via `getPreferences` / `putPreferences` -- [x] Cache feed preferences in Drift for offline access -- [x] Feed discovery screen via `getSuggestedFeeds` — browse and add generators -- [x] Feed management UI — pin/unpin, drag-to-reorder, remove saved feeds +Completed [2026-03-18](../../CHANGELOG.md#2026-03-18) ## M6 — Search -- [x] Search screen with text input, sort toggle (`top` / `latest`), and result tabs (posts / actors) -- [x] `SearchBloc` — events: `QuerySubmitted`, `TypeaheadRequested`, `HistoryCleared`, `HistoryEntryDeleted` -- [x] Post search via `searchPosts` with paginated results -- [x] Actor search via `searchActors` with paginated results -- [x] Typeahead autocomplete via `searchActorsTypeahead` -- [x] Drift migration: add `search_history` table (query, type, searched_at, account_did) -- [x] Persisted search history — display recent queries, tap to re-execute, swipe to delete, cap at 50 per account -- [x] Search with `@` should autocomplete with avatars + handles (debounced) +Completed [2026-03-19](../../CHANGELOG.md#2026-03-19) ## M7 — Dev Tools (PDS Explorer) -- [x] `DevToolsCubit` with request/response state for stateless exploration -- [x] Handle / DID input with resolution via `resolveHandle` -- [x] Repository overview via `describeRepo` — list collections with record counts -- [x] Collection browser via `listRecords` — paginated record list per collection -- [x] Record inspector via `getRecord` — pretty-printed JSON with syntax highlighting -- [x] AT-URI input — paste `at://` URI to jump directly to a record -- [x] Add Dev Tools entry in Settings screen, navigable by all users -- [x] Include link to as inspiration (pdsls) -- [x] Construct links from AT-URI. - - ex. `at://did:plc:ewvi7nxzyoun6zhxrhs64oiz/app.bsky.feed.post/3m6mwoadjbp2d` becomes - +Completed [2026-03-18](../../CHANGELOG.md#2026-03-18) diff --git a/docs/tasks/phase-3.md b/docs/tasks/phase-3.md index 4269fcc..439b023 100644 --- a/docs/tasks/phase-3.md +++ b/docs/tasks/phase-3.md @@ -2,54 +2,16 @@ ## M8 — Post Composition -- [x] Full-screen compose modal with text input, live grapheme counter (300 max), and submit button -- [x] `ComposeBloc` — events: `TextChanged`, `MediaAttached`, `MediaRemoved`, `AltTextUpdated`, `VideoAttached`, `VideoRemoved`, `DraftSaved`, `DraftLoaded`, `PostScheduled`, `PostSubmitted` -- [x] Image attachment via `uploadBlob` — up to 4 images, alt text input per image, file size (1 MB max) and MIME type (JPEG, PNG, WebP) validation -- [x] Video attachment via `app.bsky.video.uploadVideo` — 1 per post (mutually exclusive with images), 100 MB max, MP4 only -- [x] Video upload quota check via `getUploadLimits` before upload; show limit message if `canUpload` is false -- [x] Video processing job polling via `getJobStatus` with progress indicator; handle `JOB_STATE_FAILED` with error display and retry -- [x] Video embed via `app.bsky.embed.video` with alt text, aspectRatio, and optional captions -- [x] Live facet detection and preview via `bluesky_text` (mentions, links, hashtags) -- [x] Post creation via `com.atproto.repo.createRecord` with `app.bsky.feed.post` collection -- [x] Reply support — pass `parent` + `root` refs when composing from a post thread -- [x] Drift migration: add `drafts` table (id, account_did, text, reply_uri, embed_json, media_paths, created_at, updated_at, scheduled_at) -- [x] Draft save on network failure, explicit save, and back-navigation -- [x] Drafts list UI accessible from compose toolbar -- [x] Scheduled posts — date/time picker, background task via WorkManager / BGTaskScheduler -- [x] Floating action button on home screen to open compose modal +Completed [2026-03-18](../../CHANGELOG.md#2026-03-18) ## M9 — Notifications -- [x] Notifications screen with grouped-by-day notification list -- [x] `NotificationBloc` — events: `NotificationsRequested`, `NotificationsRefreshed`, `NotificationsPageLoaded`, `NotificationsMarkedRead` -- [x] Fetch notifications via `listNotifications` with cursor pagination -- [x] Render all notification reasons: like, repost, follow, mention, reply, quote -- [x] Each notification row: author avatar, reason icon, summary text, optional post preview -- [x] Unread count badge on nav bar via `getUnreadCount` polling (30s interval) -- [x] Mark as read via `updateSeen` when notifications screen opens -- [x] Tap notification to navigate to relevant post or profile +Completed [2026-03-19](../../CHANGELOG.md#2026-03-19) ## M10 — Post & Profile Actions -- [x] `PostActionRepository` — like, repost, delete via `com.atproto.repo.createRecord` / `deleteRecord` -- [x] `PostActionCubit` — optimistic state updates for like / repost toggle with rollback on failure -- [x] Like toggle: create `app.bsky.feed.like` record or delete by rkey; update `viewer.like` and `likeCount` -- [x] Repost toggle: create `app.bsky.feed.repost` record or delete by rkey; update `viewer.repost` and `repostCount` -- [x] Post action bar UI — like, repost, reply, share buttons with animated state transitions -- [x] `ProfileActionRepository` — follow, mute, block, report -- [x] `ProfileActionCubit` — optimistic follow/mute/block state with rollback -- [x] Follow toggle: create `app.bsky.graph.follow` record or delete by rkey; update `viewer.following` -- [x] Mute toggle via `app.bsky.graph.muteActor` / `unmuteActor`; update `viewer.muted` -- [x] Block toggle: create `app.bsky.graph.block` record or delete by rkey; update `viewer.blocking` -- [x] Profile action buttons: Follow / Following / Mute / Block in profile header and overflow menu -- [x] Report dialog: reason picker + optional description, submit via `com.atproto.moderation.createReport` -- [x] Report for both posts (RepoStrongRef subject) and accounts (RepoRef subject) -- [x] Confirmation dialog before mute / block actions -- [x] Thread muting via `app.bsky.feed.threadgate` awareness (show muted-thread indicator) +Completed [2026-03-17](../../CHANGELOG.md#2026-03-17) ## M11 — Saved Posts -- [x] Drift migration: add `saved_posts` table (id, account_did, post_uri, post_json, saved_at) with unique constraint on (account_did, post_uri) -- [x] `SavedPostsCubit` — read/write saved posts, expose stream of saved URIs for icon state -- [x] Bookmark icon on post action bar — toggle saved state -- [x] Saved posts list screen accessible from profile or settings +Completed [2026-03-17](../../CHANGELOG.md#2026-03-17) diff --git a/docs/tasks/phase-4.md b/docs/tasks/phase-4.md index 4231591..ee5c2ff 100644 --- a/docs/tasks/phase-4.md +++ b/docs/tasks/phase-4.md @@ -2,40 +2,11 @@ ## M12 — Direct Messages -- [x] Conversation list screen via `chat.bsky.convo.listConvos` with pagination -- [x] `ConvoListBloc` — events: `ConvosRequested`, `ConvosRefreshed`, `ConvoMuted`, `ConvoUnmuted` -- [x] Primary / Requests tab filtering on conversation list -- [x] Message thread screen via `chat.bsky.convo.getMessages` with pagination -- [x] `MessageBloc` — events: `MessagesRequested`, `MessagesPageLoaded`, `MessageSent`, `MessageDeleted`, `ConvoMarkedRead` -- [x] Chat bubble layout — current user right-aligned, others left-aligned -- [x] Send messages via `chat.bsky.convo.sendMessage` -- [x] New conversation via `chat.bsky.convo.getConvoForMembers` -- [x] Long-press to copy individual messages, overflow menu "Copy All" for full thread -- [x] Mute / unmute conversations -- [x] Mark conversation as read via `chat.bsky.convo.updateRead` +Completed [2026-03-19](../../CHANGELOG.md#2026-03-19) ## M13 — Media Playback & Download -- [x] Add `photo_view`, `video_player`, `chewie`, `dio`, `gal`, `permission_handler` to `pubspec.yaml` - -### Images - -- [x] `ImageViewerScreen` — full-screen `PageView` of `PhotoView` widgets loading `fullsize` URLs with hero animation from thumbnail -- [x] Page indicator for multi-image posts; alt text bar at the bottom of each page -- [x] Swipe-down-to-dismiss gesture on image viewer -- [x] Download button in image viewer toolbar — request permission, download via `dio` with progress indicator, save via `gal`, show snackbar result -- [x] Share button in image viewer toolbar via `share_plus` -- [x] Long-press context menu on image thumbnails in post cards — "Save image" and "Share" options - -### Video Player - -- [x] `VideoPlayerScreen` — `chewie` wrapping `VideoPlayerController.networkUrl` with HLS `playlist` URL -- [x] Video player uses embed `aspectRatio` when available, defaults to 16:9 -- [x] Video thumbnail as placeholder until player initialises; controller disposed on screen pop -- [x] GIF-presentation mode — auto-play, loop, muted, controls hidden when `presentation` is `"gif"` -- [x] Download button in video player toolbar — parse `.m3u8` for highest-bandwidth variant URL, download MP4 via `dio` with progress, save via `gal` -- [x] Declare `NSPhotoLibraryAddUsageDescription` in `Info.plist` and storage permissions in `AndroidManifest.xml` -- [x] Replace `_launchExternal` calls for image/video embeds in `PostCard` with navigation to the new viewer screens +Completed [2026-03-19](../../CHANGELOG.md#2026-03-19) ## M14 — Account Switching @@ -59,29 +30,11 @@ ## M16 — Jump to Profile -- [x] Floating action button on search screen -- [x] Handle input dialog with autocomplete via `searchActorsTypeahead` -- [x] Navigate to profile screen on selection or enter -- [x] Update bottom navigation to include Notifications and Messages tabs (5-tab layout) +Completed [2026-03-19](../../CHANGELOG.md#2026-03-19) ## M17 — Labelers & Content Moderation -- [x] Fetch user's labeler subscriptions from preferences via `app.bsky.actor.getPreferences` (`labelersPref`) -- [x] Include subscribed labeler DIDs in `atproto-accept-labelers` header on all XRPC requests -- [x] `ModerationService` — wraps the `bluesky` package's `moderatePost`, `moderateProfile`, `moderateNotification` functions -- [x] Run moderation decisions on all displayed posts and profiles -- [x] Apply `ModerationUI` results: filter, blur, alert, inform per display context (contentList, contentView, contentMedia, avatar, profileList, profileView) -- [x] Blur overlay on posts/media with click-through "Show content" button -- [x] Warning badges on profiles and posts for alert/inform labels -- [x] Content filtering — remove posts with `filter` decisions from feed and notification lists -- [x] Labeler management screen: list subscribed labelers via `app.bsky.labeler.getServices` -- [x] Subscribe / unsubscribe to labelers by updating `labelersPref` via `putPreferences` -- [x] Per-label preference configuration: ignore / warn / hide per label value per labeler -- [x] Store label preferences as `contentLabelPref` entries via `putPreferences` -- [x] Adult content toggle (requires `adultContentEnabled` preference) -- [x] Self-label support — render self-labels embedded in posts and profiles -- [x] Labeler detail screen: show labeler creator, policies, and custom label definitions with localised names -- [x] Drift table: `labeler_cache` (labeler_did, policies_json, fetched_at) for offline label definition lookup +Completed [2026-03-21](../../CHANGELOG.md#2026-03-21) ## M18 — Lists diff --git a/docs/tasks/ui-refactor.md b/docs/tasks/ui-refactor.md index 4797548..665b146 100644 --- a/docs/tasks/ui-refactor.md +++ b/docs/tasks/ui-refactor.md @@ -2,48 +2,23 @@ ## M0 — Foundation & Layout Settings Persistence -- [x] Add `ui_density` and `feed_architecture` keys to Drift `settings` table -- [x] Drift migration for new settings keys -- [x] Extend `SettingsCubit` / `SettingsState` with density and feed architecture fields -- [x] `UiDensity` enum (`compact`, `standard`, `relaxed`) with padding scale factors -- [x] `FeedArchitecture` enum (`grid`, `linear`) -- [x] Theme extension or `InheritedWidget` that provides density-scaled spacing values +Completed 2026-03-20 ## M1 — Navigation Chrome -- [x] Custom top app bar widget replacing stock `AppBar` — hamburger, section label, avatar -- [x] Home-screen variant with inline feed switcher tabs -- [x] Navigation drawer with Messages and Settings entries -- [x] Refactor `AppShell` bottom nav: 6 tabs → 4 (Home, Search, Alerts, Profile) -- [x] Bottom nav styling: `h-80`, semi-transparent blur background, labels, filled active icon -- [x] Route updates — Messages and Settings accessible via drawer instead of bottom tabs -- [x] Tests for navigation (drawer opens, tabs switch, routes resolve) +Completed 2026-03-20 ## M2 — Post Card Variants -- [x] Refactor `PostCard` to the linear variant: square avatars, uppercase handle, bordered footer -- [x] New `GridPostCard` widget — image region, content region, footer -- [x] Text-only grid card variant (no image — expanded body text) -- [x] Shared `PostCardFooter` widget (action icons left, timestamp right, top border) -- [x] Wire both variants to `PostCardWithActions` for action state management -- [x] Tests for both card variants +Completed 2026-03-20 ## M3 — Home Feed Grid Layout -- [x] `HomeFeedScreen` reads `feed_architecture` from `SettingsCubit` -- [x] Grid mode: responsive `SliverGrid` with breakpoint-based column count -- [x] Linear mode: existing `ListView` of linear post cards (with more space around cards) -- [x] Feed architecture toggle triggers rebuild without re-fetch -- [x] Tests for grid/linear switching and column count at breakpoints +Completed 2026-03-20 ## M4 — Profile Screen Refactor -- [x] Profile header: square avatar, cover image (grayscale, opacity), stats row with border -- [x] Display name uppercase + tight tracking, handle below -- [x] Sticky tab bar with backdrop blur and uppercase labels -- [x] Large-card grid layout for profile posts in grid mode, with the metadata info card retained above the feed -- [x] Linear fallback for profile posts when feed architecture is "linear" -- [x] Tests for profile header rendering and layout mode switching +Completed 2026-03-20 ## M5 — Layout Settings Screen @@ -56,16 +31,4 @@ ## M6 — Collapsible Threaded Replies -- [x] Recursive `ThreadReplyNode` widget that renders nested replies from `ThreadViewPost.replies` -- [x] Indentation with cumulative `24px` left padding per depth level -- [x] Color-coded vertical threadlines (cycle palette of 6 muted theme-derived colors) -- [x] Tap-threadline-to-collapse interaction with `24dp` touch target -- [x] Long-press-to-collapse as secondary affordance -- [x] Collapsed state: header visible, body/children hidden, "N replies hidden" indicator -- [x] `AnimatedSize` / `AnimatedCrossFade` collapse transition (`200ms`) -- [x] Depth cap at 6 with "Continue this thread →" navigation link -- [x] Local collapse state via `Set` of post URIs in screen `State` -- [x] `thread_auto_collapse_depth` setting in Drift + Drift migration -- [x] Expose auto-collapse depth in Layout Settings screen -- [x] Never auto-collapse OP replies -- [x] Tests for thread tree rendering, collapse/expand, depth cap, and auto-collapse behavior +Completed [2026-03-21](../../CHANGELOG.md#2026-03-21) -- 2.51.2