Clone this repository
For self-hosted knots, clone URLs may differ based on your setup.
Download tar.gz
Rewrote tagline and description to better reflect Coves' cooperative
model and future multi-tenant ownership vision.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Reworked landing page with warm coral/teal color palette extracted
from brand SVGs. Switched to Shrikhand + Nunito fonts for a playful,
friendly feel. Added floating bubble decorations, subtle ocean
gradient, and improved mascot animation.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Corrected step numbering that jumped from 3 to 5.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Coves-fqg: Documents the root cause of slow vote creation (~2-3s)
and initial feed loads (~800ms) due to repeated listRecords calls
to user's PDS for vote existence checks.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Split the mascot into separate body and claw images to enable a smooth
waving animation. The claw rotates from the shoulder joint for a natural
wave effect. Also improved mobile layout with better spacing.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Register web frontend routes in main server
- Add post-login redirect support to OAuth handlers
- Store redirect URL in cookie during OAuth flow for delete-account
- Validate redirects are relative paths to prevent open redirect attacks
- Update user routes registration to include auth middleware
- Fix test mocks for actor handlers and comment service
- Update go.mod dependencies
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
- Add landing page template with custom typography (Fraunces + Plus Jakarta Sans)
- Implement brand lockup with mascot + logo side-by-side layout
- Add ambient gradient background with noise texture overlay
- Include floating decorative blur elements with drift animation
- Add staggered fade-in animations for hero content
- Implement responsive design with mobile-first approach
- Add delete account and success page templates
- Include static assets (mascot, logo, app icon)
- Add web routes and handlers for serving pages
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Critical fixes:
- Remove duplicate DeleteAccountHandler in tests, use actual production handler
- Add comprehensive integration test for complete deletion flow
- Tests now use middleware.SetTestUserDID() instead of X-User-DID header
Error handling improvements:
- Add InvalidDIDError domain type for DID validation errors
- Handler returns specific errors for timeout (504) and cancellation (400)
- Marshal JSON before writing headers to catch encoding errors early
- Include DID in all repository error messages for debugging
Logging improvements:
- Replace log.Printf with slog.Error/Warn for structured logging
- Consistent slog usage across handler, service, and repository layers
Documentation improvements:
- Update interface comments to list all 8 tables including votes
- Fix CASCADE statement: "FK CASCADE deletes posts" (not votes)
- Add authorization context to DeleteAccount service documentation
Test additions:
- DID with leading/trailing whitespace handling
- Concurrent delete requests (race condition scenario)
- Integration test verifying all 8 tables are cleaned up
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Add did:plc:jn4tlbpkdms5tahfrylct5g7 (Reddit Highlights aggregator)
to the TRUSTED_AGGREGATOR_DIDS list in development config.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Previously, trusted aggregators that didn't provide a thumbnailUrl would
get no thumbnail because unfurl was completely skipped.
Now the logic is:
- If trusted aggregator provides thumbnailUrl → use it (unchanged)
- If trusted aggregator has no thumbnail AND URL is unfurl-supported →
fetch thumbnail via unfurl service
- Regular users get full unfurl as before
This allows the Reddit Highlights aggregator to get Streamable thumbnails
automatically via the backend unfurl service, without needing to fetch
them client-side.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>
Add containerized deployment configuration:
- Dockerfile: Python 3.11-slim with cron support
- docker-compose.yml: Service definition with volume mounts
- docker-entrypoint.sh: Cron setup and environment handling
- crontab: 10-minute polling schedule
- .env.example: Environment variable template
Deployment uses the same pattern as the Kagi News aggregator.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Co-Authored-By: Claude <noreply@anthropic.com>