Dandelion is a fair source project. View the code on Github
Commits on Jul 14, 2026
| 4426bb5 |
✨ Add slug generation to library films based on name |
| 21f9c70 |
🏷️ Make slug human-readable The slug is now based on the book title instead of the book ID, to be more readable in URLs. |
| 177b7cc |
♻️ refactor library books loading to use separate dandelion_books list Replace inline dandelion flag filtering with a join against a dedicated dandelion_books CSV to determine which books to display. Normalize CSV keys to snake_case symbols and merge in derived fields (slug, cover image, publication year) at load time so callers no longer need to know about the underlying Goodreads schema. Simplify controller and view to consume the unified library_books list. |
| 85ed620 |
🔥 remove book detail page and always redirect to goodreads The custom book detail page is removed in favor of always redirecting users to the Goodreads page for the book. This simplifies the library feature and ensures users always see the most up-to-date book information from Goodreads. |
| de1d693 |
♻️ Migrate library data source from Airtable to CSV files Replace Airtable-backed Book and Film models with CSV-based helpers that fetch data from a GitHub-hosted repository. This removes the airrecord gem dependency and eliminates the need for Airtable API credentials, simplifying the data pipeline and reducing external service reliance. |
| fc373fa |
🦺 (local_group.rb, _map.erb): add validation for GeoJSON Polygon and MultiPolygon types to prevent rendering errors with invalid geometry data |
Commits on Jul 12, 2026
| 39c758a |
🔒️ Upgrade oauth2, crass, excon, json, and websocket-driver for RubySec advisories |
Commits on Jul 11, 2026
| 19a347b |
🛂 Add viewable? permission checks to account routes Restrict access to following, organisations, local_groups, activities, gatherings, and followers endpoints by kicking unauthorized users before rendering the partial. |
| aae8fbb |
🦺 Add Gathering#protected_attributes and prevent currency mutation |
| c49c4e1 |
🔒️ Escape event redirect_url in post-checkout JS redirect Prevent organizers from breaking out of the window.location string via crafted redirect URLs. |
| 7ab91c1 |
🔒️ Switch destructive routes from GET to POST Destructive actions were previously exposed as GET endpoints, making
them vulnerable to CSRF and accidental triggers (image tags, link
prefetching, etc.). Convert all Update Rename |
| 083c442 |
🔒️ Block SSRF in ATProto OAuth discovery and DID resolution |
| 3287a25 |
🔒️ Escape user input in notification text to prevent XSS |
| 08a0b8f |
Add expiry and purpose to Stripe Connect OAuth state tokens Extend TokenVerifier with optional expires_in and purpose, then use a 15-minute stripe_connect purpose for OAuth state to limit replay while keeping reload tolerance. |
| 22ec75e |
Fix Stripe Connect OAuth state surviving page reloads Replace session-stored random state with signed TokenVerifier tokens so each authorize URL remains valid even if the org page is re-rendered before callback. |
Commits on Jul 10, 2026
| afd7b5a |
🔒️ Sanitize HTML and add CSP header to public pmail endpoint Harden public pmail rendering against XSS and unsafe content:
|
| ecb9fe0 |
🔧 Upgrade Cursor model variant to xhigh in bug review workflow The grok-4.5-xhigh variant provides deeper reasoning capabilities, which should yield more thorough and accurate bug detection in the daily automated review. |
| bad283c |
👽️ Switch Cursor model from composer-2.5 to grok-4.5 in daily bug review workflow |
| 5dc17da |
🔥 Remove obsolete |
| 8856448 |
🔒️ Prevent XSS via uploaded files Add RejectsActiveContent concern to Attachment, Comment, and Upload models to block active content (html, htm, xhtml, svg, svgz, xml, js) from being uploaded. Return proper error messages on upload and comment failures. |