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

Commits on Jan 25, 2026
03b3396

♻️ (atproto_client): extract URI parsing into private helper to DRY delete/put
✨ (atproto_client): add put_record overload that accepts full URI
🎨 (event_atproto): use new URI-based put_record to simplify update call

91ce189

♻️ (atproto_client.rb): replace explicit session caching with lazy getter

  • Inline session creation into a memoized session helper so every request no longer needs an extra ensure_session call.
  • Simplifies code paths and removes duplicated @session['did'] access by always routing through the helper.
4e5b0e0

♻️ (atproto_client.rb): refactor repetitive request boilerplate into private get/post helpers

dba10fb

♻️ Reorder methods to keep public interface together

656d104

🎨 (atproto_client.rb): remove redundant section comments and re-indent method calls

7161dfb

♻️ (atproto_client): unify public & auth clients into single client
🔥 (atproto_client): drop unused PUBLIC_API constant and public_client

9fe21d4

🎨 (atproto_client.rb): move comment block to correct position above authenticated methods

d324d44

✨ Introduce AtprotoClient wrapper for Bluesky/ATProto API
♻️ Refactor event ATProto logic to use new client and constants
📝 Update connect page copy and remove fallback handle notice

fe1825a

♻️ rename verify_atproto_credentials! to verify_and_set_atproto_credentials!
✨ persist the app password when credentials are verified

Commits on Jan 24, 2026
006b8ce

✨ Add per-organisation Bluesky/ATProto integration

  • New controller & view let each org connect its own Bluesky handle
  • Organisation gains atproto_handle, atproto_app_password, atproto_did fields
  • Event publishing now uses org credentials when present, falls back to env
  • Adds “Integrations” tab in organisation settings for connect/disconnect
d61a053

💄 Change disconnect button style from danger to outline-secondary

6063916

🎨 (erb): replace Ruby blocks with do…end for consistency
🐛 (erb): ensure button_text is always passed to atproto partial to avoid nil fallback

6056437

🐛 Fix OmniAuth AT Protocol strategy to work with GET requests

The original gem only parsed POST form data, preventing login via GET. Added a custom setup proc that also reads the handle from the query string, letting the form switch from POST to GET. Also patched callback_url so the handle param is excluded from the redirect_uri, keeping the OAuth flow valid.

b9c8c9c

💄 Tighten spacing between handle field and Connect button

cd52186

🎨 Add parentheses around assignment in conditional for clarity

74ccbf9

✨ Add nickname & profile_url lambdas to Google & Ethereum providers

  • Google now shows the user’s e-mail as nickname and no link
  • Ethereum displays the wallet address as nickname and links to Etherscan; view hides the link tag when URL is nil
4bc610a

🐛 Fix DNS TXT resolution on Render by switching to Cloudflare DoH

d1e7637

🚚 Move AT Protocol OAuth metadata endpoint to /atproto/oauth-client-metadata.json

  • Update OmniAuth provider config to use new path
  • Update route definition to serve metadata from new location
  • Update AtprotoKeyManager to generate client_id with new path
79bd970

🐛 (atproto_key_manager.rb): add nil guards to prevent crashes when key is missing

217ab75

♻️ (map_helper.rb): replace custom Fragment-based cache with ActiveSupport::MongoStore - simplifies read/write helpers into a single geocode_cache method - delegates expiration to the store via expires_in: 30.days