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 */destroy and */hard_destroy and */refund_and_destroy routes to POST across controllers.

Update app.js and pagelets.js to detect destroy links and submit hidden POST forms so existing UI keeps working.

Rename orders/confirm_destroy to confirm_cancel (with redirect for backwards compatibility) and update email/notification templates and tests accordingly.

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:

  • Add Content-Security-Policy header on the public pmail route to restrict resource loading.
  • Sanitize both markdown-rendered and raw email bodies via Sanitize.fragment using Sanitize::Config::DANDELION to strip dangerous tags/attributes before they reach the browser.
  • Replace javascript:; placeholder link in mailer docs with a real https URL to avoid encouraging unsafe link patterns.
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 .windsurf/workflows symlink pointing to ../commands

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.