commits
actor-typeahead component doesn't expose avatar data via events or attributes.
Added debounced API fetch (300ms) to searchActorsTypeahead endpoint when
handle is entered. Avatar now displays for both typeahead selections and
manually entered handles.
Created useRotatingPlaceholder hook:
- Rotates through 4 platform examples every 3 seconds
- .bsky.social, .blacksky.app, .tgnl.sh, .com
- Demonstrates platform flexibility without overwhelming users
Created HandleInput component:
- Shows @ symbol by default
- Replaces @ with profile pic when handle selected from typeahead
- Extracts avatar from typeahead data-avatar or actor-select event
- Clears avatar when input is cleared
Reduced from 389 to 236 lines (39% reduction):
- Use HeroSection for logo/title/fireflies
- Use ValuePropsSection for 3 value prop cards
- Use HowItWorksSection for 4 step cards
Main component now focuses on form logic and state.
Created reusable components:
- ValuePropCard: icon + title + description card
- StepCard: numbered step with color variant
- HeroSection: logo, title, firefly animation
- ValuePropsSection: 3 value prop cards
- HowItWorksSection: 4 step cards
- dynamically measure height so it uses fixed pb-4 gap correctly
Remove redundant success/info toasts (logout, upload loaded, no results).
Keep only error toasts for critical feedback.
Add AriaLiveAnnouncer component for screen reader accessibility.
Typeahead fix:
- Add event listeners for input/change/blur to sync actor-typeahead selections with form state
- Ensures Enter/Tab selections from typeahead dropdown properly update form
- Allows Enter key to submit form after selection
@ stripping:
- Automatically remove leading @ from handle input
- Show helpful inline message when @ is stripped
- Inform users the @ symbol isn't needed
Add critical note that each commit should address ONE specific fix or feature.
Multiple unrelated changes should be committed separately for clearer history.
Removed backward compatibility for deprecated 'followed' field:
- Removed from AtprotoMatch type
- Updated 6 files to use only followStatus Record
- Replaced simple boolean check with multi-lexicon support
- Database schema preserved (no migration needed)
Removed backward-compatible useSettings hook:
- Updated App.tsx to use zustand store directly
- Smaller bundle size (284.11 KB vs 284.27 KB)
Updated CLAUDE.md with git commit message format guidelines.
Removed empty 'nul' file created accidentally.
Optimization #12:
- created rateLimit.middleware with in-memory rate limiting
- batch-search-actors: 5 requests/min (conservative)
- batch-follow-users: 8 requests/hr (conservative)
- calculated based on AT Protocol limits with 50% buffer
- DRY implementation with applyRateLimit helper function
- prevents users from exhausting AT Protocol API limits
- leaves buffer for likes, replies, posts
Note: In-memory (resets on cold starts). Upgrade to Upstash Redis for production-grade shared state.
Optimization #11:
- added float-1, float-2, float-3 animation variants to tailwind.config.js
- replaced inline animation and animationDelay styles with Tailwind classes
- use modulo pattern to cycle through 3 animation variants
- maintains visual variety without Math.random() for animation timing
- consistent with Tailwind conventions, easier to maintain
Optimization #10:
- created useSettingsStore with zustand persist middleware
- removed SettingsContext.tsx (88 lines) and provider wrapper
- added SSR-safe storage with cross-tab synchronization
- automatic JSON serialization, no manual parse/stringify
- maintained backward-compatible API (useSettings hook)
- bundle size: +2.3KB for zustand library
Optimization #9:
- created atproto.types.ts with proper AT Protocol interfaces
- replaced 7 any types in batch-search-actors.ts
- added ATProtoActor, ATProtoProfile, RankedActor, EnrichedActor types
- improves type safety, compile-time error catching, IDE support
Optimization #8:
- removed 3 duplicate type definitions (atprotoSession, SourceUser, SearchResult)
- import AtprotoSession and SearchResult from central types
- prevents type drift, establishes single source of truth
Optimizations #6 & #7:
- #6: verified early exit optimization already implemented in FollowService
- #7: created validation.utils.ts with Zod schemas for array validation
- replaced 3 duplicate validation blocks with reusable Zod schemas
- updated batch-follow-users, check-follow-status, batch-search-actors
Typeahead fix:
- Add event listeners for input/change/blur to sync actor-typeahead selections with form state
- Ensures Enter/Tab selections from typeahead dropdown properly update form
- Allows Enter key to submit form after selection
@ stripping:
- Automatically remove leading @ from handle input
- Show helpful inline message when @ is stripped
- Inform users the @ symbol isn't needed
Removed backward compatibility for deprecated 'followed' field:
- Removed from AtprotoMatch type
- Updated 6 files to use only followStatus Record
- Replaced simple boolean check with multi-lexicon support
- Database schema preserved (no migration needed)
Removed backward-compatible useSettings hook:
- Updated App.tsx to use zustand store directly
- Smaller bundle size (284.11 KB vs 284.27 KB)
Updated CLAUDE.md with git commit message format guidelines.
Removed empty 'nul' file created accidentally.
Optimization #12:
- created rateLimit.middleware with in-memory rate limiting
- batch-search-actors: 5 requests/min (conservative)
- batch-follow-users: 8 requests/hr (conservative)
- calculated based on AT Protocol limits with 50% buffer
- DRY implementation with applyRateLimit helper function
- prevents users from exhausting AT Protocol API limits
- leaves buffer for likes, replies, posts
Note: In-memory (resets on cold starts). Upgrade to Upstash Redis for production-grade shared state.
Optimization #11:
- added float-1, float-2, float-3 animation variants to tailwind.config.js
- replaced inline animation and animationDelay styles with Tailwind classes
- use modulo pattern to cycle through 3 animation variants
- maintains visual variety without Math.random() for animation timing
- consistent with Tailwind conventions, easier to maintain
Optimization #10:
- created useSettingsStore with zustand persist middleware
- removed SettingsContext.tsx (88 lines) and provider wrapper
- added SSR-safe storage with cross-tab synchronization
- automatic JSON serialization, no manual parse/stringify
- maintained backward-compatible API (useSettings hook)
- bundle size: +2.3KB for zustand library
Optimizations #6 & #7:
- #6: verified early exit optimization already implemented in FollowService
- #7: created validation.utils.ts with Zod schemas for array validation
- replaced 3 duplicate validation blocks with reusable Zod schemas
- updated batch-follow-users, check-follow-status, batch-search-actors