Dandelion is a fair source project. View the code on Github

Commits on Jan 24, 2026
e017799

♻️ (atproto_key_manager.rb): simplify memoized private-key getter by replacing begin/end block with inline if

6658c31

🐛 (atproto_key_manager): return nil instead of raising when ATPROTO_PRIVATE_KEY_PEM is missing

f0d6610

⚡️ (map_helper.rb): cache geocoding results to reduce external API calls and speed up bounding-box lookups

bc9160a

✨ Add Bluesky (AT Protocol) OAuth sign-in support

  • Integrate omniauth-atproto gem and configure provider
  • Create AtprotoKeyManager to handle ES256 keypair & client metadata
  • Add dynamic handle input UI for Bluesky sign-in/up/connect flows
  • Resolve and store Bluesky handle/avatar/displayName from profile
  • Remove legacy atproto_handle field in favor of provider link
  • Provide rake tasks to generate ES256 keys and show metadata
Commits on Jan 22, 2026
cfab24d

🐛 Fix broken license link in badges partial

b706ac5

🐛 (event_atproto): replace non-breaking spaces with regular spaces in description to prevent display issues

9ce414e

♻️ (event_validation): scope uniqueness check to non-deleted records only

3c41e19

🐛 Fix race condition by moving delete_atproto callback to before_destroy
♻️ Remove redundant handle_asynchronously for delete_atproto

7260f1e

🔥 Remove fallback location block for events without coordinates

ae90b10

⚡️ (event_atproto.rb): offload AT Protocol callbacks to background jobs to avoid blocking the main thread
🗃️ (event_atproto.rb): add facebook_event_url to the list of watched fields so AT Protocol updates trigger when it changes

b457dc1

🐛 (event_atproto): allow ATProto sync when event is unlocked or unsecreted even without existing URI

79abe24

✨ Add put_record method to AtprotoClient for in-place record updates
♻️ Replace delete-recreate cycle with atomic put_record in event update flow

0a892ee

✨ (event_atproto): add full ATProto CRUD support with update/delete hooks
🎨 (event_atproto): extract constants for modes & statuses, split record builder
🥅 (event_atproto): guard CRUD ops behind atproto_enabled? and track changes

954f26f

✨ (atproto.rb): add authenticated AT Protocol client with session management
✨ (event_atproto.rb): introduce auto-publishing of public events to Bluesky via AT Protocol
🔧 (event.rb): include EventAtproto concern to enable Bluesky syndication

Commits on Jan 21, 2026
ad35d80

🐛 Fix CSV header mismatch by renaming column from original_description to description
♻️ Replace original_description with description_elements.join(', ') to unify order description output

2f4379b

♻️ (pagelets.js): remove pendingRefreshOnVisible flag and always refresh pagelets when tab becomes visible

8d2417d

📝 (order.rb): add event_start_time and event_end_time columns to CSV export

33b79ed

🚀 (pagelets.js): pause pagelet refresh when tab is hidden and resume on visibility
✨ (pagelets.js): add visibility-change listener to skip background updates
🐛 (pagelets.js): prevent memory-leak by removing stale intervals on DOM removal

a0917bf

💬 (rack_attack_throttle.rb): add human-readable error messages to 403 responses for blocked bots and invalid XHR headers

300066e

🐛 (rack_attack_throttle.rb): use real client IP from CF-Connecting-IP header when present to correctly throttle behind Cloudflare