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
|
| 91ce189 |
♻️ (atproto_client.rb): replace explicit session caching with lazy getter
|
| 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
|
| 9fe21d4 |
🎨 (atproto_client.rb): move comment block to correct position above authenticated methods |
| d324d44 |
✨ Introduce AtprotoClient wrapper for Bluesky/ATProto API
|
| fe1825a |
♻️ rename |
Commits on Jan 24, 2026
| 006b8ce |
✨ Add per-organisation Bluesky/ATProto integration
|
| d61a053 |
💄 Change disconnect button style from danger to outline-secondary |
| 6063916 |
🎨 (erb): replace Ruby blocks with |
| 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
|
| 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
|
| 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 |