Jeremy Daer 5c5c82b27a Scope room lookup to the type each controller administers
Rooms::DirectsController relaxes ensure_can_administer to true, because every
participant in a direct room may administer it. set_room was inherited unscoped,
though, so that relaxation applied to any room the caller was merely a member of:
DELETE /rooms/directs/<id> destroyed open and closed rooms and all their messages.

The same unscoped lookup let a direct room be loaded by the opens and closeds
controllers, where force_room_type promoted it. Promoting a DM to open grants every
user on the account membership and republishes the whole conversation, including the
other participant's messages; converting it to closed lets the initiator revise who
is in it and lock the other participant out.

Each controller now narrows room_scope to the types it may act on. Opens and closeds
keep reach into each other, since converting between them is a feature. Neither can
reach a direct room, and directs can only reach directs.

Room also refuses to change type away from Rooms::Direct, so the invariant holds for
any future caller of becomes! rather than only these two controllers.
2026-08-03 14:55:04 -07:00
2026-07-16 21:17:17 +02:00
2025-08-21 09:31:59 +01:00
2025-08-21 09:31:59 +01:00
2026-07-15 13:29:13 +02:00
2025-08-21 09:31:59 +01:00
2025-12-01 10:40:24 +01:00
2025-08-21 09:31:59 +01:00
2025-08-21 09:31:59 +01:00
2025-08-21 09:31:59 +01:00
2025-08-21 09:31:59 +01:00
2025-08-21 09:31:59 +01:00
2025-09-18 14:51:42 +02:00
2025-12-01 10:40:24 +01:00
2026-07-16 02:13:05 -04:00
2025-08-21 09:31:59 +01:00
2025-08-21 09:31:59 +01:00
2025-08-21 09:31:59 +01:00

Campfire

Campfire is a web-based chat application. It supports many of the features you'd expect, including:

  • Multiple rooms, with access controls
  • Direct messages
  • File attachments with previews
  • Search
  • Notifications (via Web Push)
  • @mentions
  • API, with support for bot integrations

Running your own Campfire instance

Campfire's Docker image contains everything needed for a fully-functional, single-machine deployment. This includes the web app, background jobs, caching, file serving, and SSL. You can use our pre-built image at ghcr.io/basecamp/once-campfire:latest, or build your own from this repo.

Deploying with ONCE

The easiest way to self-host Campfire is with ONCE. It will guide you through the initial set up and then keep your instance up to date automatically.

If you don't already have once installed, run this on the machine you want to run Campfire on:

curl https://get.once.com | sh

once will launch as soon as the install is finished.

Choose Campfire from the list of applications, follow the instructions, and ONCE will take care of the rest.

If you prefer the command line to the dashboard, you can deploy directly:

once deploy ghcr.io/basecamp/once-campfire --host chat.example.com

Deploying with Docker

If you'd rather run the Docker image yourself, you can read more about that in the self-hosting guide.

Tip

When you start Campfire for the first time, you'll be guided through a wizard to create an admin account. The email address that you enter for the admin account will be visible on the sign-in page, it's there so that people have someone to contact if they need help with their account. If that bothers you, put in any email address you want and create yourself a new admin account.

Development

You are welcome - and encouraged - to modify Campfire to your liking. Please see our development guide for how to get Campfire set up for local development.

Security

See SECURITY.md for how to report a vulnerability and a description of our trust model.

S
Description
No description provided
Readme 87 MiB
Languages
Ruby 46.3%
HTML 23.5%
JavaScript 17.5%
CSS 11.7%
Shell 0.6%
Other 0.4%