slack status without the slack
status.zzstoatzz.io/
quickslice
Status App Progress#
Completed ✅#
Core Functionality#
- Forked from Bailey Townsend's Rusty Statusphere
- Multi-user support with BlueSky OAuth authentication
- Custom lexicon:
io.zzstoatzz.status.recordwith emoji + optional text - Status expiration times (30min to 1 week)
- Real-time updates via Jetstream firehose
- Public profiles at status.zzstoatzz.io/@handle
- Global feed showing all statuses
- Database persistence on Fly.io
OAuth Implementation#
- Fixed OAuth callback error handling (missing 'code' field)
- Reverted to working state with
transition:genericscope - Research complete: No granular permissions available yet in AT Protocol
- Must use broad permissions until Auth Scopes feature ships
UI/UX#
- One-time walkthrough for new users (stored in localStorage)
- Fixed double @ symbol in feed username links
- Fixed feed ordering (newest first by startedAt)
- Emoji picker with visual selection
- Status expiration display with relative times
Current State 🚧#
- App deployed and functional at status.zzstoatzz.io
- OAuth works but requires broad permissions (AT Protocol limitation)
- All core features operational
Today's Progress (Sept 1, 2025)#
- Forked from Bailey's emoji-only statusphere
- Created custom lexicon with text + expiration support
- Added multi-user OAuth authentication
- Implemented emoji picker with keyword search
- Fixed mobile responsiveness
- Added status expiration (30min to 1 week)
- Set up CI/CD with GitHub Actions
- Renamed repo to "status"
- Improved delete UX (removed confusing clear button)
- Made feed handles visually distinct
- Updated link previews to be lowercase and include actual status
- Cleaned up dead code from original fork
- Posted thread about the launch
Progress Update (Sept 2, 2025)#
Major Features Added#
- Custom Emoji Support: Integrated 1600+ animated emojis from bufo.zone
- Scraped and stored in
/static/emojis/ - Searchable in emoji picker
- Supports GIF animation
- No database needed - served directly from filesystem
- Scraped and stored in
- Infinite Scrolling: Global feed now loads forever
- Added
/api/feedendpoint with pagination - Smooth loading with "beginning of time" indicator
- Handles large datasets efficiently
- Added
- Theme Consistency: Added theme toggle indicator across all pages
- Performance Optimization: Added database indexes on critical columns
idx_status_startedAtfor feed queriesidx_status_authorDid_startedAtfor user queries
Bug Fixes#
- Fixed favicon not loading in production
- Fixed custom emoji layout issues in picker
- Fixed theme toggle icons being invisible
- Removed unused CSS file and public directory
- Suppressed dead_code warning for auto-generated lexicons
Code Quality Improvements#
- Created 5 GitHub issues for technical debt:
- ✅ #1: Database indexes (COMPLETED)
- #2: Excessive unwrap() usage (57 instances)
- #3: Duplicated handle resolution code
- #4: Hardcoded configuration values
- #5: No rate limiting on API endpoints
- Cleaned up unused
public/cssdirectory - Removed hardcoded OWNER_DID references
Next Steps 📋#
Immediate#
- Persistent Session Storage: Users currently must re-login each visit
- UI Polish: Small visual improvements needed
Location Feature (Proposed)#
- Add optional location to statuses
- Browser geolocation API integration
- Privacy controls (location blurring)
- Future: Integrate with SmokeSignal's location standards
- Vision: Global map of statuses
Future Considerations#
- Migrate to granular OAuth scopes when available
- H3 hexagon location support
- SmokeSignal event integration
- Location-based discovery
Progress Update (Sept 2, 2025 - Evening)#
Testing Infrastructure & Resilience#
- Test Framework Setup: Established comprehensive testing with
just testcommand- 9 tests covering rate limiting, error handling, and API endpoints
- All tests passing
- Rate Limiting: Implemented token bucket algorithm
- 30 requests per minute per IP address on
/statusendpoint - Prevents spam and abuse
- Closes GitHub issue #5
- 30 requests per minute per IP address on
- Error Handling: Centralized error handling with
AppErrorenum- Consistent error responses across the application
- Better debugging and user feedback
Admin Moderation System#
- Soft Hide Capability: Added ability to hide inappropriate content
- Posts remain in database but excluded from global feed
- Admin DID hardcoded:
did:plc:xbtmt2zjwlrfegqvch7fboei(zzstoatzz.io) /admin/hide-statusendpoint for toggling visibility- Hide button in UI visible only to admin
- Confirmation dialog before hiding
UI Improvements#
- Fixed Emoji Alignment: Resolved custom emoji sizing issues in status history
- Standardized container dimensions (1.5rem x 1.5rem for history items)
- Consistent layout regardless of emoji type
DevOps & CI/CD#
- Review Apps: Set up automatic preview deployments for PRs
- Uses GitHub Actions with
superfly/fly-pr-review-apps@1.2.1 - Deploys to
pr-<number>-zzstoatzz-status.fly.dev - Smaller resources for review apps (256MB RAM)
- Updated FLY_API_TOKEN to org-level token for app creation
- Uses GitHub Actions with
Code Quality#
- Refactoring: Cleaned up parameter passing
- Replaced verbose
&dyn rusqlite::ToSqlwithrusqlite::params!macro - More idiomatic Rust code
- Replaced verbose
Technical Debt#
- ✅
No rate limiting on API endpoints(RESOLVED with issue #5) - OAuth scopes too broad (waiting on AT Protocol)
- Session persistence needed
- Location feature architecture planned but not implemented
- #2: Excessive unwrap() usage (57 instances)
- #3: Duplicated handle resolution code
- #4: Hardcoded configuration values
Resources#
- OAuth research:
/tmp/atproto-oauth-research/ - Location proposal:
/tmp/atproto-oauth-research/location_integration_proposal.md - PR #7: Testing, rate limiting, and moderation features