Skip to content

Release history

Loomio releases

Collaborative decision-making tool that makes it easy for anyone to participate in decisions which affect them.

All releases

22 shown

v3.0.24 Breaking risk

Fixed comment editing when admins discard comments.

Full changelog

2026-05-11 (Loomio 3.0.24)

  • Fixed: Prevent comment authors from editing or restoring comments that an admin has discarded.
  • Fixed: Preserve group ownership when creating discussions from templates in grouped contexts.
  • Improved: Hardened deployment/runtime behavior with trusted ingress IP allowlisting and exec-based Docker startup processes.
  • Improved: Removed obsolete hocuspocus SQLite persistence and legacy document-list template calls.
  • Improved: Background jobs now avoid retrying forever for records that have already been deleted.
  • Maintenance: Updated dependencies including Devise, Vite, Bootsnap, Rollup, Sentry, Nokogiri, Puma, and tzinfo-data.

2026-05-06 (Loomio 3.0.23)

  • Fixed: Do not notify the actor when they @mention their own group.
  • Fixed: Improved German discussion context-menu translations and documented known translation traps.
  • Fixed: Make received-email allow/block actions idempotent.
  • Fixed: Retry mark-as-seen when concurrent requests hit a unique-constraint race.
  • Fixed: Guard transcription analysis against detached blobs and non-rich-text records.
  • Improved: Migrated legacy Document records to ActiveStorage attachments and removed the legacy Document model/workers.
  • Improved: Removed Rails Pulse and related schema/dependency leftovers.
  • Improved: Removed legacy loomio_channel_server setup.
  • Improved: Raised the global request-per-IP throttle from 300 to 900 per 5 minutes.
  • Improved: Made demo cloning more reliable by skipping Rails Pulse and bulk-writing translations.
  • Maintenance: Updated dependencies including Nokogiri and Puma.
v3.0.22 Breaking risk
⚠ Upgrade required
  • Bumped vue-i18n to 9.14.5 (addresses XSS + prototype pollution)
  • Ruby upgraded to 4.0.2, Puma to 8, Vite to 8, Vue Router to 5 with multiple dependency bumps
  • Admin login‑link sign‑in and sign‑in with a login code bypass Cloudflare Turnstile challenge
Security fixes
  • Fixed SQL injection in HasTimeframe via timeframe_for
  • Blocked SSRF in link preview service; now requires auth and limited to 20/hour per user
  • Stopped leaking errors in API responses; removed debug logging of secret tokens and emails from hocuspocus controller
Notable features
  • Single Transferable Vote (STV) poll type added as beta feature
  • Cloudflare Turnstile challenge integrated for sign‑in, signup and trial creation
Full changelog

This release is mostly a security hardening pass across the whole app — auth flows, uploads, rate limiting, link previews, SSO, SQL input handling, and dependencies.

There's a new Single Transferable Vote (STV) poll type (beta — feedback welcome on GitHub)

We also added support for Cloudflare Turnstile challenge on sign-in, sign-up, and trial creation.

New

  • STV (Single Transferable Vote) poll type — beta. Anonymous by default, results hidden until the poll closes. The form shows a warning asking users to report bugs and feedback on
    GitHub.
  • Cloudflare Turnstile challenge on password sign-in, login-token requests, signup, and trial creation. Admin login-link sign-in bypasses the challenge; sign-in with a login code also
    bypasses it.
  • Profile pictures via OAuth (OIDC defaults) on the OAuth client.
  • Track email bounces separately from complaints.
  • API v2b: new list endpoints for discussions and polls; limit/offset as the primary pagination params (per/from kept as aliases).
  • Rails Pulse added for request monitoring (Blazer removed).

Security

  • Hardened OAuth/SAML authentication flows; added Google and Nextcloud OAuth controller tests; trust SSO providers fully on auto-link.
  • Fixed SQL injection in HasTimeframe via timeframe_for.
  • Blocked SSRF in the link preview service; link previews now require auth and are throttled to 20/hour per user.
  • Fixed operator precedence in the Group create ability.
  • Restricted sensitive fields in serializers.
  • Fixed trial email enumeration.
  • Direct upload size limit (25 MB trial, 1 GB paid); blocked dangerous uploads.
  • Stopped leaking errors in API responses; removed debug logging of secret tokens and emails from the hocuspocus controller.
  • X-Robots-Tag: noindex header for non-public instances.
  • Bumped vue-i18n to 9.14.5 (XSS + prototype pollution).
  • Added Brakeman + bundler-audit to CI.
  • Sent rate-limit events to Sentry (grouped by rule+IP to cut noise).
  • Safelisted private-network IPs in rack_attack.
  • Split the profile GET throttle (tight on email_status, looser elsewhere).
  • Gave /bug_tunnel its own throttle and skipped Sentry alerts for it.

Fixes

  • Refresh a user's groups after joining or being added to a group.
  • Fix translator-mangled i18n interpolation vars + a CI check to catch regressions.
  • Handle legacy ImageMagick-style variation keys and Vips::Error in the ActiveStorage variation translator.
  • Return a token error on session failure when a login token is pending; translate sessions errors server-side; surface server errors on login code entry.
  • Guard Events::PollExpired and real_participant fallback against nil / non-participant eventables.
  • Fix demo poll cloning (missing opening_at/opened_at).
  • Translation fixes: needs_a_rethink_meaning, "vote in" → "vote on", German typo in discard.

Internal

  • Ruby 4.0.2; Puma 8; Vite 8; Vue Router 5; many dep bumps.
  • Switched to Minitest/fixtures for group export and OAuth controller tests.
v3.0.21 Security relevant
Security fixes
  • CVE-2023-XXXXX – Prevented exposure of secret subgroup names to non-members via reports controller responses
Notable features
  • New template button for creating discussion/poll templates from examples
  • Fewer default discussion templates per group
  • Updated Sense Check poll options
Full changelog

Changes to the Discussion and Poll templates UI. I've had people tell me they couldn't find how to create a template. Now there is a New template button, which opens the example templates page, you can use an example as the starting point for a new template.

Fewer discussion templates in a group by default. Updates to the Sense Check poll options, so they're more helpful.

  • Materialize default discussion templates as DB records by @robguthrie in https://github.com/loomio/loomio/pull/12182
  • Discussion template UI improvements by @robguthrie in https://github.com/loomio/loomio/pull/12181
  • Add opening_at to polls for scheduled voting by @robguthrie in https://github.com/loomio/loomio/pull/12174
  • Poll template updates by @robguthrie in https://github.com/loomio/loomio/pull/12184

This release also addresses a minor security issue, where a member of a group could see the names of secret subgroups they did not belong to, if they inspected the server responses of the reports controller.

v3.0.20 Breaking risk
⚠ Upgrade required
  • Refer to https://github.com/loomio/loomio-deploy/pull/130 for step‑by‑step upgrade instructions
  • Unused containers (loomio_channel_server, separate hocuspocus repo) will remain operational but can be removed after migration
Breaking changes
  • Removed loomio_channel_server (SocketIO server) – real‑time updates now handled by Rails via ActionCable
  • Matrix bot SDK execution moved from loomio_channel_server to the Rails app
  • hocuspocus collaboration server integrated into the main Loomio repository, eliminating a separate service
Notable features
  • Converted HAML view templates to Phlex for Ruby‑only view code
Full changelog

Some fairly substantial changes here, with lots more work in the pipeline too, hold on to your hats!

Convert HAML view templates to Phlex

Using Phlex makes life easier. View code is just ruby. This makes maintaining all our server generated views so much easier.

Replace SocketIO with ActionCable (remove loomio_channel_server)

I'm on a mission to reduce the complexity of Loomio's architecture.

loomio_channel_server ran a SocketIO server to send realtime updates to connected clients. Now the rails app handles websocket connections directly.

Move hocuspocus server into the main Loomio repository

Another repository removed. We now include the hocuspocus collaboration server within the main Loomio repository.

Handle Matrix bot notfications from Rails app

We no longer use loomio_channel_server to host a matrix_bot_sdk. We do that work from the Rails app now.

Please see this loomio-deploy PR to read how to upgrade your server:
https://github.com/loomio/loomio-deploy/pull/130

The convenient thing about these changes is, even if you don't update your server setup, it will work correctly, you'll just have unused services.

As a result of this, there are two fewer repositories, and one fewer containers.

The intention is to eventually remove Redis from the system by switching to SolidCache and SolidQueue. Then we'll just have App, Worker, DB, Hocuspocus and Haraka services.

Bugfixes and improvements

v3.0.19 Breaking
Breaking changes
  • Removed ability to set profile picture from SSO provider list on change_picture_form.
Full changelog
  • Removed the ability to set your profile picture from SSO provider list on change_picture_form.
  • Massive rewrite of the rspec test suite to minitest. This drops the runtime from 14 to 3 minutes on Github Actions. Makes a huge difference in local development productivity.

Note.. in app version still says 3.0.18. I forgot to bump the version in the code before making this release.

v3.0.18 Breaking risk
Breaking changes
  • Removed automatic linking of existing user accounts when signing in via SSO; now requires explicit confirmation.
  • Changed first‑time SSO sign‑in behavior to always create a new account instead of prompting to link or create.
Notable features
  • Added LOOMIO_RESTRICT_EXPLORE_TO_SIGNED_IN_USERS configuration flag
  • Added polls for voting on page content
  • Replaced "invite‑only" terminology with "direct discussions"
Full changelog

We've rewritten how sign in and sign up work with SSO. Previously if you signed in via SSO and were already signed into Loomio it would link your accounts together. Now Loomio will not automatically link accounts, it will always ask you to confirm.
Also when you sign in for the first time, via SSO, we don't ask if you want to create account or link account, we just create a new account for you.

  • Add LOOMIO_RESTRICT_EXPLORE_TO_SIGNED_IN_USERS by @robguthrie in https://github.com/loomio/loomio/pull/12143
  • Add polls to vote on page by @robguthrie in https://github.com/loomio/loomio/pull/12142
  • Replace invite-only terminology with direct discussions by @robguthrie in https://github.com/loomio/loomio/pull/12144
  • fix for missing translation on invite only discussions page
v3.0.16 Bug fix
⚠ Upgrade required
  • If using loomio-deploy, update docker-compose.yml to set redis image version to 8.4 (redis:8.4).
Full changelog

The last release was broken. Apologies. This addresses those problems.

  • The app would not boot due to redis and sidekiq connection_pool incompatibilities
  • Google SSO was broken.

If you tried 3.0.15, sorry for wasting your time. We've improved the testing environment to catch these problems sooner.

Upgrade note: If you're running loomio-deploy, you will need to edit docker-compose.yml and update redis to 8.4

  redis:
    container_name: loomio-redis
    image: redis:8.4
v3.0.15 Breaking risk
Breaking changes
  • Minimum Redis version increased to 8.4; docker-compose.yml must be updated accordingly.
Notable features
  • SSO can auto-create user accounts when FEATURES_DISABLE_EMAIL_LOGIN=1.
  • LOOMIO_SSO_FORCE_USER_ATTRS=1 prevents users from changing their name, email, or username.
  • 'Anyone can join' group privacy mode allows registered users to join without invitation/approval (FEATURES_DISABLE_CREATE_USER=1).
Full changelog

Note: If you're running loomio-deploy, you will need to edit docker-compose.yml and update redis to 8.4

  redis:
    container_name: loomio-redis
    image: redis:8.4

Rails 8 upgrade and SSO features

  • With FEATURES_DISABLE_EMAIL_LOGIN=1, and someone signs in via SSO, and they don't have a Loomio account we just create user and sign them in. No link/Create account screen (and no Terms of Service acceptance either).

  • You can prevent users changing their name, email, username. Set LOOMIO_SSO_FORCE_USER_ATTRS=1

Group settings changes:

  • How do people join? supports "Anyone can join”. Meaning registered users can just click “Join group” - no invitation or approval required. Set FEATURES_DISABLE_CREATE_USER=1 and Group privacy to “closed”.

  • List in group directory, means the group will show on /explore (also linked from the sidebar as “Find a group”. Set FEATURES_EXPLORE_PUBLIC_GROUPS=1

To test SSO flows I created https://github.com/loomio/dev-saml-idp for SAML and used https://github.com/bencase/dev-sso-idp for ODIC testing.

v3.0.14 Bugfix

Fixed the edit comment bug (issue #11903).

Full changelog

I believe this release fixes #11903 - the edit comment bug.

Please try it and let me know if you see or don't see the bug. 🤞

v3.0.13 Bugfix
Notable features
  • Support for building amd64 and arm64 Docker images under the same tag
Full changelog

Fix an issue with the Github Action that builds docker images.

We should now be building amd64 and arm64 images, under the same tag, for branches and releases.

v3.0.12 Bug fix
Notable features
  • Upgrade to Tiptap v3
  • Autotranslate off by default
  • Add zh_tw locale
Full changelog

Happy new year, Loomio friends! I'm slowly getting back into work - we have a new baby at home - so sleep and work time are less available to me right now.

However, I'm very excited about Loomio in 2026 - we some very exciting news coming soon. Thanks for your continued support. This is a small business supporting a small community of people with an open source product - I'm reminded how rare that is, and we are so grateful for you all.

BUG WATCH: If you upgrade to this version and continue to see the edit comment bug (ie: you click edit comment, or edit discussion, and the content is missing) please let me know. I think this bug may be fixed in this release - so please let me know either way.

What's Changed

New Contributors

  • @Clayblockunova made their first contribution in https://github.com/loomio/loomio/pull/12019

Full Changelog: https://github.com/loomio/loomio/compare/v3.0.11...v3.0.12

v3.0.11 Breaking risk
Breaking changes
  • Thread renamed to Discussion
  • Decision renamed to Poll
Notable features
  • B2 API endpoint for creating comments
  • Automatic translation of user‑generated content (including emails)
  • Add zh_CN locale
Full changelog

Terminology Change

  • Rename Thread and Decision to Discussion and Poll by @robguthrie in https://github.com/loomio/loomio/pull/11995

New features

  • Add B2 API endpoint for creating comments by @etiennechabert in https://github.com/loomio/loomio/pull/11963
  • update email settings page to see each group setting by @robguthrie in https://github.com/loomio/loomio/pull/11947
  • automatic translation of user generated content by @robguthrie in https://github.com/loomio/loomio/pull/11954
  • auto translate user content in emails by @robguthrie in https://github.com/loomio/loomio/pull/11982
  • Add zh_CN locale by @robguthrie in https://github.com/loomio/loomio/pull/12008

Bug fixes

  • Fix RFC 2047 encoded email subject headers not being decoded by @etiennechabert in https://github.com/loomio/loomio/pull/11964
  • addressing error: Invalid Stance: mismatched poll_options by @robguthrie in https://github.com/loomio/loomio/pull/11979
  • Fix poll option deletion by preserving _destroy parameter by @etiennechabert in https://github.com/loomio/loomio/pull/12017
  • Fix NoMethodError in avatar_kind for Rails 7.2 by @etiennechabert in https://github.com/loomio/loomio/pull/11949

Full Changelog: https://github.com/loomio/loomio/compare/v3.0.10...v3.0.11

Special thanks to @etiennechabert for all the fantastic contributions!

v3.0.10 Bug fix
Notable features
  • ARM64 support for Docker images (beta)
  • Unsubscribe from poll via email footer link
Full changelog

Here's the most significant stuff. It's a minor release.

  • Unsubscribe from poll via email footer link - stance_created was missing the unsubscribe link
  • Fix translations and ensure we don't have any missing placeholders
  • ARM64 support for docker images (beta)
  • Attempt to address stance voting bug, where poll option ids were from another poll
  • Show error and offer to reload if loading fails
  • return a "message was not delivered" email when people reply to notifications email address rather than reply-to value

I'm currently in conversation with a few customers about how to improve email notifications, with reports that people are receiving too many notifications - but I've not seen evidence that there is a bug, rather this is a design issue. If you have feedback about this, get in touch.

v3.0.9 Breaking risk
⚠ Upgrade required
  • Update docker-compose.yml by pulling loomio-deploy changes or manually copying the latest file.
  • Add required environment variables to .env: HARAKA_CONTAINER_IMAGE, HARAKA_CONTAINER_TAG, CHANNELS_CONTAINER_IMAGE, CHANNELS_CONTAINER_TAG, PUBLIC_APP_URL, PRIVATE_APP_URL, RAILS_INBOUND_EMAIL_URL, RAILS_INBOUND_EMAIL_PASSWORD.
  • Run `docker compose pull && docker compose down && docker compose run app rake db:migrate && docker compose down && docker compose up -d --remove-orphans` to apply changes.
Breaking changes
  • Removes Mailin support; replaces with ActionMailbox using Haraka docker image (loomio/haraka-rails-docker).
Full changelog

This release adds support for receiving inbound email via ActionMailbox. There is a complimentary Haraka docker image to support this.

This replaces Mailin, which, somehow has been just amazing, serving Loomio installs without issue for years. However the time has come for better performance, security & maintainability.

To upgrade a loomio-deploy install

Either:

  • pull loomio-deploy changes: run git pull origin master and it will update your docker-compose.yml file. (recommended)
  • or manually update your docker-compose.yml file, by copying the current master text over the top of your existing file.

Then add the following ENV's to your .env file:

HARAKA_CONTAINER_IMAGE=loomio/haraka-rails-docker
HARAKA_CONTAINER_TAG=stable
CHANNELS_CONTAINER_IMAGE=loomio/loomio_channel_server
CHANNELS_CONTAINER_TAG=stable
PUBLIC_APP_URL=https://REPLACE_WITH_HOSTNAME
PRIVATE_APP_URL=http://app:3000
RAILS_INBOUND_EMAIL_URL=http://app:3000/rails/action_mailbox/relay/inbound_emails
RAILS_INBOUND_EMAIL_PASSWORD=make_up_a_strong_password_here

Pull the fresh docker images

If you've pulled down loomio-deploy changes, then you'll notice that I've moved scripts/update to ./update.sh
If you don't have the update script, all we're really doing is

docker compose pull && docker compose down && docker compose run app rake db:migrate && docker compose down && docker compose up -d --remove-orphans

Test it's working

You should be able to send email to your group email address and have it appear as a thread.

Trouble shooting

You may want to review the updated default env_template and docker-compose.yml files and compare them to your own setup.

Other (non dependabot) changes in this release:

v3.0.7 Bug fix
Notable features
  • Verify participants in anonymous polls
  • Enable vote share requirement for Simple Poll
Full changelog
v3.0.6 New feature
Notable features
  • Quorum: specify minimum percentage of eligible voters required for results to be valid
  • Vote share requirement: set minimum support percentage needed for a proposal to pass
Full changelog

Introducing Quorum and Vote share requirement features.

This work was sponsored by Igalia, and we're so grateful for their support. Thank you @anarute!

The release notes are my first draft for the help manual update. Please let me know if you have any comments or feedback.

Quorum

You can now specify what percentage of eligible voters must participate for the results to be considered valid.
For example you could say, we need 80% of the group to vote on this for the results to be significant.

Vote share requirement

You can also specify what percentage of support an option needs for the proposal to pass.
For example you could have both of these rules at once

  • At least 70% of votes cast must be for Consent
  • No more than 5% of votes should be Objection





v3.0.5 Breaking risk
Breaking changes
  • Removed ability to reverse thread order; threads always display newest comments at the bottom.
Notable features
  • New "new" badge in comment headers indicates unread comments since last view.
  • Dynamic loading collapses read content, showing only new comments and their parents.
  • Reworked "Load more" to show first few replies per nested set, enabling drill‑down or skipping tangents.
Full changelog

This release is dedicated to all of you nice people who've felt frustrated with how Loomio works with large discussions.

The major focus of work in this release has been refining the thread page. We focused on feedback from users having large discussions often with hundreds of comments.

The visual design has been updated. Previously we made the "stem" colour of a comment change when it was unread. It was not obvious what this meant, and also it looked a bit garish. Now we have a little "new" badge in the comment header to indicate new comments since you last read the thread.

We no longer support reversing the order of the thread. Previously you could rearrange the thread "Newest First" so new comments appeared at the top of the page. This created an uncertainty - the thread could be going in either direction and it's not obvious which direction is applied. Now threads always display newest comments at the bottom.

We support a more dynamic loading system when returning to a thread with some new comments - we collapse/hide content you've already read, allowing the new comments and their parent comments to be more easily read - I hope this makes catching up on large conversations easier, with a more deliberate display of new comments.

We've reworked "Load more". I think it's best to experience this yourself, but the gist of it is that we don't always show all the replies to replies. Instead the thread will display the first few comments from each nested set of comments, allowing you to drill down into a particular part of the conversation, or skip over tangents and see the boarder discussion.

Previously there were lots of bugs that meant that clicking "load more" could make the page jump and you would lose your place. I believe I've fixed all cases where this happened.

If you're using Loomio in a realtime setting, the page will no longer jump around as new comments appear. Instead the "x more" button will appear, allowing you to choose to see the new comments when it suits you. This is similar to how Gmail or other apps notify you that new messages have arrived. Poll results and edits will still update in real time. After clicking "x more" live updates will just appear, so you only need to click once to switchto a continuously updating view of the discussion.

The right sidebar - where we show some navigation options for the thread has been improved. You can easily jump to Latest or Unread or Top - and there is a button on mobile screens to open this sidebar.

Other fixes and improvements

  • fix a bug where notifications could show a blank page when clicked
  • Show the group URL when adjusting group settings to "Ask to join"
  • Fix for adding aliases for member email addresses when inbound email is received
  • Hide the onboarding checklist for groups older than 28 days
  • Add ability to customize the light and dark theme colours from ENVs
  • Fix for the Participation report for large datasets. Now you can see all the data. (broken since v3 release)
  • Some fixes so the page does not overflow on mobile screens - more to come very soon
  • Add a "View all votes" button so it's easier to get to the poll page
  • Add a "Search" button to the serach modal - this fixes searching on mobile
  • Fix for handling quoted text in comments sent via email

There is ongoing work to fix problems with Loomio on mobile phones. I hope to fix the remaining issues in the next week or so.

We have LOTS of new stuff coming. Including quorum rules, vote auditing tools and more. Thanks for reading you absolute legends!

v3.0.4 Bugfix

Fixed the crash caused by a missing SECRET_KEY_BASE.

Changelog

Fix issue with missing SECRET_KEY_BASE

v3.0.3 Bug fix
⚠ Upgrade required
  • Migrated to Rails 7.2
Notable features
  • Include attachments in tracked changes
Full changelog

Fix a horrid bug where attachments would be dropped when you edit the thread layout (ie: change direction or nesting levels).

Other changes include

  • include attachments in tracked changes
  • move to rails Rails 7.2
  • fix CSS when you attach a file with a very long name
v3.0.2 Bug fix

Fixed edit username, Sentry locale errors, poll min score default, move comments modal, poll preview handling, and stance validation.

Full changelog
  • fix edit another users username modal
  • fix missing Sentry error when locale is not supported
  • score poll min score defaults to 0 rather than 1
  • fix move comments modal
  • update the poll preview list item to handle long titles and show the group name
  • validate that stances are not corrupted with a poll option from another poll
  • update npm and gem dependencies as usual
v3.0.0 New feature
Notable features
  • Subgroup creation/join moved to sidebar
  • New onboarding experience for groups
Full changelog

I'm so pleased to say we've released Loomio 3!

This release represents more than 18 months of work to upgrade our core UI libraries (Vue.js and Vuetify) from version 2 to version 3.

The goal of the v3 release was that users wouldn't notice anything had changed. They might notice it looks better and is faster, but otherwise it's a drop in replacement for v2.

There has been more than 6 months of testing in production for this release. Using feature flags, we've been running v3 alongside v2 on loomio.com. This has allowed us to do extensive real world testing and be confident that v3 is in every way an improvement on v2.

If I were to describe what all the work means, it's pretty simple:

  • The UI looks better, is smaller to download, faster to respond and fit for future development
  • Creating and joining subgroups has been moved to the sidebar
  • We have a new onboarding experience to help groups get started

With this work done, we're able to focus on delivering our mobile app (PWA) and AI integrations.

Just so it's linked to the release notes, here's the PR: https://github.com/loomio/loomio/pull/10150

Beta — feedback welcome: [email protected]