### Install and Setup Project
Source: https://github.com/basecamp/fizzy/blob/main/docs/development.md
Run these commands to install dependencies and set up the project. Use the --reset flag to clear and re-seed the database.
```sh
bin/setup
bin/setup --reset # Reset the database and seed it
```
--------------------------------
### Initial Kamal Setup
Source: https://github.com/basecamp/fizzy/blob/main/docs/kamal-deployment.md
Run this command for the first-time setup of your application with Kamal. It configures Docker, builds the app container, and starts it.
```sh
bin/kamal setup
```
--------------------------------
### Initial Setup and Development Server
Source: https://github.com/basecamp/fizzy/blob/main/AGENTS.md
Run initial setup scripts and start the development server. The server runs on port 3006. Login credentials are provided for development fixtures.
```bash
bin/setup # Initial setup (installs gems, creates DB, loads schema)
```
```bash
bin/dev # Start development server (runs on port 3006)
```
--------------------------------
### Start Stripe Development Environment
Source: https://github.com/basecamp/fizzy/blob/main/saas/README.md
This command sets up the necessary environment variables and starts the tunneling for local Stripe integration. Ensure Stripe CLI is installed and logged in. The dev server must be started in the same terminal session.
```sh
eval "$(BUNDLE_GEMFILE=Gemfile.saas bundle exec stripe-dev)"
bin/dev
```
--------------------------------
### Setup Kamal Deployment
Source: https://github.com/basecamp/fizzy/blob/main/docs/kamal-deployment.md
Execute this command after configuring `config/deploy.yml` and `.kamal/secrets` to perform the initial deployment setup.
```bash
kamal setup
```
--------------------------------
### Start Development Server
Source: https://github.com/basecamp/fizzy/blob/main/docs/development.md
Command to launch the local development server.
```sh
bin/dev
```
--------------------------------
### Activity Particulars Examples
Source: https://github.com/basecamp/fizzy/blob/main/docs/api/sections/activities.md
Examples of the 'particulars' object for various activity actions. These objects contain action-specific metadata.
```json
{
"action": "card_assigned", "particulars": { "assignee_ids": ["03f5user123"] }
}
```
```json
{
"action": "card_unassigned", "particulars": { "assignee_ids": ["03f5user123"] }
}
```
```json
{
"action": "card_board_changed", "particulars": { "old_board": "Backlog", "new_board": "Mobile" }
}
```
```json
{
"action": "card_title_changed", "particulars": { "old_title": "Fix login", "new_title": "Fix mobile login" }
}
```
```json
{
"action": "card_triaged", "particulars": { "column": "In Progress" }
}
```
```json
{
"action": "card_closed", "particulars": {}
}
```
--------------------------------
### Subsequent Kamal Deployments
Source: https://github.com/basecamp/fizzy/blob/main/docs/kamal-deployment.md
Use this command for all deployments after the initial setup. It efficiently deploys updates to your running application.
```sh
bin/kamal deploy
```
--------------------------------
### Activity Response Example
Source: https://github.com/basecamp/fizzy/blob/main/docs/api/sections/activities.md
An example of a 'card_closed' activity returned by the API. Includes details about the event, the associated card, board, and creator.
```json
[
{
"id": "03faevt004",
"action": "card_closed",
"created_at": "2026-03-25T15:11:04.000Z",
"description": "David Heinemeier Hansson moved \"Fix mobile login\" to \"Done\"",
"particulars": {},
"url": "http://app.fizzy.localhost:3006/897362094/cards/42",
"eventable_type": "Card",
"eventable": {
"id": "03f6card042",
"number": 42,
"title": "Fix mobile login",
"status": "closed",
"description": "Users cannot complete login on iOS.",
"description_html": "
Users cannot complete login on iOS.
",
"image_url": null,
"has_attachments": false,
"tags": ["ios", "auth"],
"closed": true,
"postponed": false,
"golden": false,
"last_active_at": "2026-03-25T15:11:04.000Z",
"created_at": "2026-03-25T09:00:00.000Z",
"url": "http://app.fizzy.localhost:3006/897362094/cards/42"
},
"board": {
"id": "03f6abc123",
"name": "Mobile",
"all_access": true,
"created_at": "2026-03-01T10:00:00.000Z",
"auto_postpone_period_in_days": 14,
"url": "http://app.fizzy.localhost:3006/897362094/boards/03f6abc123"
},
"creator": {
"id": "03f5user123",
"name": "David Heinemeier Hansson",
"role": "owner",
"active": true,
"email_address": "david@example.com",
"created_at": "2026-03-01T09:00:00.000Z",
"url": "http://app.fizzy.localhost:3006/897362094/users/03f5user123",
"avatar_url": "http://app.fizzy.localhost:3006/897362094/users/03f5user123/avatar"
}
},
{
"id": "03faevt003",
"action": "comment_created",
"created_at": "2026-03-25T14:17:22.000Z",
"description": "David Heinemeier Hansson commented on \"Fix mobile login\"",
"particulars": {},
"url": "http://app.fizzy.localhost:3006/897362094/cards/42#comment_03facomment9",
"eventable_type": "Comment",
"eventable": {
"id": "03facomment9",
"created_at": "2026-03-25T14:17:22.000Z"
}
}
]
```
--------------------------------
### Docker Compose for Fizzy Deployment
Source: https://github.com/basecamp/fizzy/blob/main/docs/docker-deployment.md
Example docker-compose.yml for running Fizzy. Configure environment variables for secrets, domain, mailer, VAPID keys, and storage.
```yaml
services:
web:
image: ghcr.io/basecamp/fizzy:main
restart: unless-stopped
ports:
- "80:80"
- "443:443"
environment:
- SECRET_KEY_BASE=abcdefabcdef
- TLS_DOMAIN=fizzy.example.com
- BASE_URL=https://fizzy.example.com
- MAILER_FROM_ADDRESS=fizzy@example.com
- SMTP_ADDRESS=mail.example.com
- SMTP_USERNAME=user
- SMTP_PASSWORD=pass
- VAPID_PRIVATE_KEY=myvapidprivatekey
- VAPID_PUBLIC_KEY=myvapidpublickey
volumes:
- fizzy:/rails/storage
volumes:
fizzy:
```
--------------------------------
### Fetching Paginated Cards
Source: https://github.com/basecamp/fizzy/blob/main/docs/api/README.md
Example of how to fetch paginated results for cards. The 'Link' header in the response indicates the URL for the next page of results.
```bash
curl -H "Authorization: Bearer put-your-access-token-here" -H "Accept: application/json" -v http://app.fizzy.localhost:3006/686465299/cards
# ...
< link: ; rel="next"
# ...
```
--------------------------------
### File Upload with Curl
Source: https://github.com/basecamp/fizzy/blob/main/docs/api/README.md
Example of uploading a file using curl. It shows how to send a 'multipart/form-data' request, combining file uploads with other parameters.
```bash
curl -X PUT \
-H "Authorization: Bearer put-your-access-token-here" \
-F "user[name]=David H. Hansson" \
-F "user[avatar]=@/path/to/avatar.jpg" \
http://app.fizzy.localhost:3006/686465299/users/03f5v9zjw7pz8717a4no1h8a7
```
--------------------------------
### Start Account Export
Source: https://github.com/basecamp/fizzy/blob/main/docs/api/sections/exports.md
Initiates an asynchronous export for the entire account. This operation is restricted to account administrators and owners. The response includes an export ID and initial status.
```APIDOC
## POST /:account_slug/account/exports
### Description
Starts an account export for the current account. Only account admins and owners can create account exports.
### Method
POST
### Endpoint
/:account_slug/account/exports
### Response
#### Success Response (201 Created)
- **id** (string) - The unique identifier for the export job.
- **status** (string) - The initial status of the export, typically "pending".
- **created_at** (string) - The timestamp when the export was created.
### Response Example
```json
{
"id": "03f8huu0sog76g3s97596abcd",
"status": "pending",
"created_at": "2026-04-02T12:34:56Z"
}
```
```
--------------------------------
### Get Specific Step
Source: https://github.com/basecamp/fizzy/blob/main/docs/api/sections/steps.md
Retrieves the details of a specific step using its ID.
```APIDOC
## GET /:account_slug/cards/:card_number/steps/:step_id
### Description
Returns a specific step.
### Method
GET
### Endpoint
/:account_slug/cards/:card_number/steps/:step_id
### Response
#### Success Response (200)
- **id** (string) - The unique identifier of the step.
- **content** (string) - The text content of the step.
- **completed** (boolean) - Indicates if the step is completed.
### Response Example
```json
{
"id": "03f5v9zo9qlcwwpyc0ascnikz",
"content": "Write tests",
"completed": false
}
```
```
--------------------------------
### GET /:account_slug/account/settings
Source: https://github.com/basecamp/fizzy/blob/main/docs/api/sections/account.md
Retrieves the current account settings, including its ID, name, card count, creation date, and the default auto-postpone period.
```APIDOC
## GET /:account_slug/account/settings
### Description
Returns the current account settings.
### Method
GET
### Endpoint
/:account_slug/account/settings
### Response
#### Success Response (200)
- **id** (string) - The account ID.
- **name** (string) - The account name.
- **cards_count** (integer) - The number of cards in the account.
- **created_at** (string) - The timestamp when the account was created.
- **auto_postpone_period_in_days** (integer) - The account-level default auto-postpone period in days.
#### Response Example
```json
{
"id": "03f5v9zjvypwh0t0e2rfh0h7k",
"name": "37signals",
"cards_count": 5,
"created_at": "2025-12-05T19:36:35.401Z",
"auto_postpone_period_in_days": 30
}
```
```
--------------------------------
### Caching with ETags in Ruby
Source: https://github.com/basecamp/fizzy/blob/main/docs/api/README.md
Example of how to implement ETag caching in a Ruby client. It shows storing the ETag from a response and using it in subsequent requests.
```ruby
# Store the ETag from the response
etag = response.headers["ETag"]
# On next request, send it back
headers = { "If-None-Match" => etag }
response = client.get("/1234567/cards/42.json", headers: headers)
if response.status == 304
# Nothing to do, the card hasn't changed
else
# The card has changed, process the new data
end
```
--------------------------------
### Kamal Secrets Configuration
Source: https://github.com/basecamp/fizzy/blob/main/docs/kamal-deployment.md
Example of how to configure sensitive environment variables in the `.kamal/secrets` file. Ensure this file is not committed to your repository.
```ini
SECRET_KEY_BASE=12345
VAPID_PUBLIC_KEY=something
VAPID_PRIVATE_KEY=somethingelse
SMTP_USERNAME=email-provider-username
SMTP_PASSWORD=email-provider-password
```
--------------------------------
### Example Rich Text JSON
Source: https://github.com/basecamp/fizzy/blob/main/docs/api/sections/rich_text.md
Demonstrates the structure of a JSON object with a rich text field containing HTML.
```json
{
"card": {
"title": "My card",
"description": "This is bold and this is italic.
"
}
}
```
--------------------------------
### Start User Data Export
Source: https://github.com/basecamp/fizzy/blob/main/docs/api/sections/exports.md
Initiates an asynchronous export of personal data for a specific user. This operation can only be performed by the user themselves. The response provides an export ID and initial status.
```APIDOC
## POST /:account_slug/users/:user_id/data_exports
### Description
Starts a personal data export for the current user. You can only create exports for your own user record.
### Method
POST
### Endpoint
/:account_slug/users/:user_id/data_exports
### Response
#### Success Response (201 Created)
- **id** (string) - The unique identifier for the export job.
- **status** (string) - The initial status of the export, typically "pending".
- **created_at** (string) - The timestamp when the export was created.
### Response Example
```json
{
"id": "03f8huu0sog76g3s97596wxyz",
"status": "pending",
"created_at": "2026-04-02T12:34:56Z"
}
```
```
--------------------------------
### Get Activities
Source: https://github.com/basecamp/fizzy/blob/main/docs/api/sections/activities.md
Retrieves a list of activities for a given account. The response includes details about each activity, such as its creator, associated card, and timestamps.
```APIDOC
## GET /:account_slug/activities
### Description
Retrieves a list of activities for a given account.
### Method
GET
### Endpoint
/:account_slug/activities
### Response
#### Success Response (200)
- **updated_at** (string) - The timestamp when the activity was last updated.
- **body** (object) - The content of the activity.
- **plain_text** (string) - The activity content in plain text.
- **html** (string) - The activity content in HTML format.
- **creator** (object) - Information about the user who created the activity.
- **id** (string) - The unique identifier of the creator.
- **name** (string) - The name of the creator.
- **role** (string) - The role of the creator.
- **active** (boolean) - Indicates if the creator is active.
- **email_address** (string) - The email address of the creator.
- **created_at** (string) - The timestamp when the creator was created.
- **url** (string) - The URL of the creator's profile.
- **avatar_url** (string) - The URL of the creator's avatar.
- **card** (object) - Information about the card associated with the activity.
- **id** (string) - The unique identifier of the card.
- **url** (string) - The URL of the card.
- **reactions_url** (string) - The URL for managing reactions to the activity.
- **url** (string) - The URL of the activity.
- **board** (object) - Information about the board associated with the activity.
- **id** (string) - The unique identifier of the board.
- **name** (string) - The name of the board.
- **all_access** (boolean) - Indicates if the creator has all access to the board.
- **created_at** (string) - The timestamp when the board was created.
- **auto_postpone_period_in_days** (integer) - The auto-postpone period for the board in days.
- **url** (string) - The URL of the board.
All `url` fields are opaque absolute URLs for the current Fizzy instance. Clients should not construct them.
```
--------------------------------
### Get Account Settings
Source: https://github.com/basecamp/fizzy/blob/main/docs/api/sections/account.md
Retrieves the current account's settings, including its ID, name, card count, creation date, and the default auto-postpone period.
```json
{
"id": "03f5v9zjvypwh0t0e2rfh0h7k",
"name": "37signals",
"cards_count": 5,
"created_at": "2025-12-05T19:36:35.401Z",
"auto_postpone_period_in_days": 30
}
```
--------------------------------
### Get a Specific Step
Source: https://github.com/basecamp/fizzy/blob/main/docs/api/sections/steps.md
Retrieve details of a single step using its ID. The response includes the step's content and completion status.
```json
{
"id": "03f5v9zo9qlcwwpyc0ascnikz",
"content": "Write tests",
"completed": false
}
```
--------------------------------
### Test Native Push Notifications
Source: https://github.com/basecamp/fizzy/blob/main/saas/README.md
Start the development server with the --push flag to test native push notifications (APNs and FCM) locally. This will prompt for 1Password authorization to fetch production APNs and FCM credentials.
```sh
bin/dev --push
```
--------------------------------
### Initialize Kamal Deployment
Source: https://github.com/basecamp/fizzy/blob/main/docs/kamal-deployment.md
Run this command to generate the necessary Kamal configuration files, including the secrets file.
```bash
kamal init
```
--------------------------------
### GET /:account_slug/users/:user_id
Source: https://github.com/basecamp/fizzy/blob/main/docs/api/sections/users.md
Returns the specified user.
```APIDOC
## GET /:account_slug/users/:user_id
### Description
Returns the specified user.
### Method
GET
### Endpoint
/:account_slug/users/:user_id
### Response
#### Success Response (200)
- **id** (string) - User ID
- **name** (string) - User's name
- **role** (string) - User's role (e.g., owner, member)
- **active** (boolean) - Indicates if the user is active
- **email_address** (string) - User's email address
- **created_at** (string) - Timestamp of user creation
- **url** (string) - URL to the user resource
### Response Example
```json
{
"id": "03f5v9zjw7pz8717a4no1h8a7",
"name": "David Heinemeier Hansson",
"role": "owner",
"active": true,
"email_address": "david@example.com",
"created_at": "2025-12-05T19:36:35.401Z",
"url": "http://app.fizzy.localhost:3006/897362094/users/03f5v9zjw7pz8717a4no1h8a7"
}
```
```
--------------------------------
### GET /:account_slug/users
Source: https://github.com/basecamp/fizzy/blob/main/docs/api/sections/users.md
Returns a list of active users in the account.
```APIDOC
## GET /:account_slug/users
### Description
Returns a list of active users in the account.
### Method
GET
### Endpoint
/:account_slug/users
### Response
#### Success Response (200)
- **id** (string) - User ID
- **name** (string) - User's name
- **role** (string) - User's role (e.g., owner, member)
- **active** (boolean) - Indicates if the user is active
- **email_address** (string) - User's email address
- **created_at** (string) - Timestamp of user creation
- **url** (string) - URL to the user resource
### Response Example
```json
[
{
"id": "03f5v9zjw7pz8717a4no1h8a7",
"name": "David Heinemeier Hansson",
"role": "owner",
"active": true,
"email_address": "david@example.com",
"created_at": "2025-12-05T19:36:35.401Z",
"url": "http://app.fizzy.localhost:3006/897362094/users/03f5v9zjw7pz8717a4no1h8a7"
}
]
```
```
--------------------------------
### Configure Database Adapter
Source: https://github.com/basecamp/fizzy/blob/main/docs/development.md
Switch the database adapter to MySQL for local development and testing by setting the DATABASE_ADAPTER environment variable.
```sh
DATABASE_ADAPTER=mysql bin/setup --reset
DATABASE_ADAPTER=mysql bin/ci
```
--------------------------------
### Get Board
Source: https://github.com/basecamp/fizzy/blob/main/docs/api/sections/boards.md
Retrieves the details of a specific board identified by its ID.
```APIDOC
## GET /:account_slug/boards/:board_id
### Description
Returns the specified board.
### Method
GET
### Endpoint
/:account_slug/boards/:board_id
### Response
#### Success Response (200)
- **id** (string) - The unique identifier for the board.
- **name** (string) - The name of the board.
- **all_access** (boolean) - Indicates if the user has access to all features of the board.
- **created_at** (string) - The timestamp when the board was created.
- **auto_postpone_period_in_days** (integer) - The default period in days for auto-postponing tasks.
- **url** (string) - The URL to access the board.
- **creator** (object) - Information about the user who created the board.
- **id** (string) - The unique identifier for the creator.
- **name** (string) - The name of the creator.
- **role** (string) - The role of the creator.
- **active** (boolean) - Indicates if the creator account is active.
- **email_address** (string) - The email address of the creator.
- **created_at** (string) - The timestamp when the creator account was created.
- **url** (string) - The URL to access the creator's profile.
- **public_description** (string) - The public description of the board (present only if published).
- **public_description_html** (string) - The public description in HTML format (present only if published).
- **user_ids** (array of strings) - A list of user IDs with access to the board (present only if `all_access` is `false`).
- **public_url** (string) - The public URL for the board (present only if published).
### Response Example
```json
{
"id": "03f5v9zkft4hj9qq0lsn9ohcm",
"name": "Fizzy",
"all_access": false,
"created_at": "2025-12-05T19:36:35.534Z",
"auto_postpone_period_in_days": 30,
"url": "http://app.fizzy.localhost:3006/897362094/boards/03f5v9zkft4hj9qq0lsn9ohcm",
"creator": {
"id": "03f5v9zjw7pz8717a4no1h8a7",
"name": "David Heinemeier Hansson",
"role": "owner",
"active": true,
"email_address": "david@example.com",
"created_at": "2025-12-05T19:36:35.401Z",
"url": "http://app.fizzy.localhost:3006/897362094/users/03f5v9zjw7pz8717a4no1h8a7"
},
"public_description": "Follow along with public product updates.",
"public_description_html": "Follow along with public product updates.
",
"user_ids": [
"03f5v9zjw7pz8717a4no1h8a7",
"03f5v9zppzlksuj4mxba2nbzn"
],
"public_url": "http://app.fizzy.localhost:3006/897362094/public/boards/aB3dEfGhIjKlMnOp"
}
```
```
--------------------------------
### Enable Multi-tenant Mode
Source: https://github.com/basecamp/fizzy/blob/main/docs/docker-deployment.md
Set the MULTI_TENANT environment variable to 'true' to allow multiple accounts to be created in your Fizzy instance.
```bash
MULTI_TENANT=true
```
--------------------------------
### Run Unit Tests
Source: https://github.com/basecamp/fizzy/blob/main/docs/development.md
Execute unit tests for quick feedback during development.
```sh
bin/rails test
```
--------------------------------
### Get Notification Settings
Source: https://github.com/basecamp/fizzy/blob/main/docs/api/sections/notifications.md
Retrieves the current user's notification settings.
```APIDOC
## GET /:account_slug/notifications/settings
### Description
Returns the current user's notification settings.
### Response
#### Success Response (200)
- **bundle_email_frequency** (string) - How often to bundle notification emails. Possible values: `never`, `every_few_hours`, `daily`, `weekly`.
### Response Example
```json
{
"bundle_email_frequency": "every_few_hours"
}
```
```
--------------------------------
### Database Management Commands
Source: https://github.com/basecamp/fizzy/blob/main/AGENTS.md
Commands for loading fixture data, running database migrations, and resetting the database to a clean state.
```bash
bin/rails db:fixtures:load # Load fixture data
```
```bash
bin/rails db:migrate # Run migrations
```
```bash
bin/rails db:reset # Drop, create, and load schema
```
--------------------------------
### Multiple List Parameters
Source: https://github.com/basecamp/fizzy/blob/main/docs/api/README.md
Demonstrates how to provide multiple values for a list parameter by repeating the parameter name with '[]' appended.
```http
?tag_ids[]=tag1&tag_ids[]=tag2&tag_ids[]=tag3
```
--------------------------------
### Get Comment Reactions
Source: https://github.com/basecamp/fizzy/blob/main/docs/api/sections/reactions.md
Retrieves a list of all reactions associated with a specific comment.
```APIDOC
## GET /:account_slug/cards/:card_number/comments/:comment_id/reactions
### Description
Returns a list of reactions on a comment.
### Response
#### Success Response (200)
- **id** (string) - The unique identifier for the reaction.
- **content** (string) - The reaction text.
- **reacter** (object) - Information about the user who reacted.
- **id** (string) - The user's unique identifier.
- **name** (string) - The user's name.
- **role** (string) - The user's role in the account.
- **active** (boolean) - Indicates if the user account is active.
- **email_address** (string) - The user's email address.
- **created_at** (string) - The timestamp when the user was created.
- **url** (string) - The URL to the user's profile.
- **url** (string) - The URL to the reaction resource.
### Response Example
```json
[
{
"id": "03f5v9zo9qlcwwpyc0ascnikz",
"content": "👍",
"reacter": {
"id": "03f5v9zjw7pz8717a4no1h8a7",
"name": "David Heinemeier Hansson",
"role": "owner",
"active": true,
"email_address": "david@example.com",
"created_at": "2025-12-05T19:36:35.401Z",
"url": "http://app.fizzy.localhost:3006/897362094/users/03f5v9zjw7pz8717a4no1h8a7"
},
"url": "http://app.fizzy.localhost:3006/897362094/cards/3/comments/03f5v9zjw7pz8717a4no1h8a7/reactions/03f5v9zo9qlcwwpyc0ascnikz"
}
]
```
```
--------------------------------
### Get Specific Column Metadata
Source: https://github.com/basecamp/fizzy/blob/main/docs/api/sections/columns.md
Retrieves the metadata for a single, specified column on a board.
```APIDOC
## GET /:account_slug/boards/:board_id/columns/:column_id
### Description
Returns the specified column metadata.
### Method
GET
### Endpoint
/:account_slug/boards/:board_id/columns/:column_id
### Response
#### Success Response (200)
- **id** (string) - The unique identifier for the column.
- **name** (string) - The name of the column.
- **color** (string) - The color associated with the column.
- **created_at** (string) - The timestamp when the column was created.
- **cards_url** (string) - The URL to fetch cards within this column.
### Response Example
```json
{
"id": "03f5v9zkft4hj9qq0lsn9ohcm",
"name": "In Progress",
"color": "var(--color-card-default)",
"created_at": "2025-12-05T19:36:35.534Z",
"cards_url": "http://fizzy.localhost:3006/897362094/boards/03f5v9zkft4hj9qq0lsn9ohcm/columns/03f5v9zkft4hj9qq0lsn9ohcm/cards"
}
```
```
--------------------------------
### Get Notifications
Source: https://github.com/basecamp/fizzy/blob/main/docs/api/sections/notifications.md
Retrieves a list of notifications for the current user. Unread notifications are prioritized.
```APIDOC
## GET /:account_slug/notifications
### Description
Returns a list of notifications for the current user. Unread notifications are returned first, followed by read notifications.
### Response
#### Success Response (200)
- **id** (string) - Unique identifier for the notification.
- **read** (boolean) - Indicates if the notification has been read.
- **read_at** (string) - Timestamp when the notification was read, or null if unread.
- **created_at** (string) - Timestamp when the notification was created.
- **title** (string) - The title of the notification.
- **body** (string) - The main content of the notification.
- **creator** (object) - Information about the user who created the notification.
- **id** (string)
- **name** (string)
- **role** (string)
- **active** (boolean)
- **email_address** (string)
- **created_at** (string)
- **url** (string)
- **card** (object) - Information about the related card, if applicable.
- **id** (string)
- **title** (string)
- **status** (string)
- **url** (string)
- **url** (string) - The URL to access the notification.
### Response Example
```json
[
{
"id": "03f5va03bpuvkcjemcxl73ho2",
"read": false,
"read_at": null,
"created_at": "2025-11-19T04:03:58.000Z",
"title": "Plain text mentions",
"body": "Assigned to self",
"creator": {
"id": "03f5v9zjw7pz8717a4no1h8a7",
"name": "David Heinemeier Hansson",
"role": "owner",
"active": true,
"email_address": "david@example.com",
"created_at": "2025-12-05T19:36:35.401Z",
"url": "http://app.fizzy.localhost:3006/897362094/users/03f5v9zjw7pz8717a4no1h8a7"
},
"card": {
"id": "03f5v9zo9qlcwwpyc0ascnikz",
"title": "Plain text mentions",
"status": "published",
"url": "http://app.fizzy.localhost:3006/897362094/cards/3"
},
"url": "http://app.fizzy.localhost:3006/897362094/notifications/03f5va03bpuvkcjemcxl73ho2"
}
]
```
```
--------------------------------
### Enable SaaS Mode in Fizzy
Source: https://github.com/basecamp/fizzy/blob/main/saas/README.md
Run this command to enable SaaS mode for Fizzy development. This is necessary to use the hosted version.
```ruby
bin/rails saas:enable
```
--------------------------------
### Get Card Reactions
Source: https://github.com/basecamp/fizzy/blob/main/docs/api/sections/reactions.md
Retrieves a list of all reactions (boosts) associated with a specific card.
```APIDOC
## GET /:account_slug/cards/:card_number/reactions
### Description
Returns a list of reactions on a card.
### Response
#### Success Response (200)
- **id** (string) - The unique identifier for the reaction.
- **content** (string) - The reaction text (max 16 characters).
- **reacter** (object) - Information about the user who reacted.
- **id** (string) - The user's unique identifier.
- **name** (string) - The user's name.
- **role** (string) - The user's role in the account.
- **active** (boolean) - Indicates if the user account is active.
- **email_address** (string) - The user's email address.
- **created_at** (string) - The timestamp when the user was created.
- **url** (string) - The URL to the user's profile.
- **url** (string) - The URL to the reaction resource.
### Response Example
```json
[
{
"id": "03f5v9zo9qlcwwpyc0ascnikz",
"content": "👍",
"reacter": {
"id": "03f5v9zjw7pz8717a4no1h8a7",
"name": "David Heinemeier Hansson",
"role": "owner",
"active": true,
"email_address": "david@example.com",
"created_at": "2025-12-05T19:36:35.401Z",
"url": "http://app.fizzy.localhost:3006/897362094/users/03f5v9zjw7pz8717a4no1h8a7"
},
"url": "http://app.fizzy.localhost:3006/897362094/cards/3/reactions/03f5v9zo9qlcwwpyc0ascnikz"
}
]
```
```
--------------------------------
### Utility Commands for Development and Deployment
Source: https://github.com/basecamp/fizzy/blob/main/AGENTS.md
Utilities for managing email previews, background jobs, and deployment processes. Kamal requires the 1Password CLI for secrets management.
```bash
bin/rails dev:email # Toggle letter_opener for email preview
```
```bash
bin/jobs # Manage Solid Queue jobs
```
```bash
bin/kamal deploy # Deploy (requires 1Password CLI for secrets)
```
--------------------------------
### Get Card by Number
Source: https://github.com/basecamp/fizzy/blob/main/docs/api/sections/cards.md
Retrieves a specific card using its account slug and card number.
```APIDOC
## GET /:account_slug/cards/:card_number
### Description
Returns a specific card by its number.
### Method
GET
### Endpoint
/:account_slug/cards/:card_number
### Response
#### Success Response (200)
- **id** (string) - Unique identifier for the card.
- **number** (integer) - The card's number.
- **title** (string) - The title of the card.
- **status** (string) - The current status of the card (e.g., "published").
- **description** (string) - The plain text description of the card.
- **description_html** (string) - The HTML formatted description of the card.
- **image_url** (string) - URL of the card's image, or null if none.
- **has_attachments** (boolean) - Indicates if the card has attachments.
- **tags** (array) - List of tags associated with the card.
- **closed** (boolean) - Indicates if the card is closed (in the "Done" state).
- **golden** (boolean) - Indicates if the card is marked as golden.
- **last_active_at** (string) - Timestamp of the last activity on the card.
- **created_at** (string) - Timestamp when the card was created.
- **url** (string) - The URL of the card.
- **board** (object) - Information about the board the card belongs to.
- **column** (object) - Information about the column the card is in (present if triaged).
- **creator** (object) - Information about the user who created the card.
- **comments_url** (string) - URL to fetch comments for the card.
- **reactions_url** (string) - URL to fetch reactions for the card.
- **steps** (array) - List of steps associated with the card.
### Response Example
```json
{
"id": "03f5vaeq985jlvwv3arl4srq2",
"number": 1,
"title": "First!",
"status": "published",
"description": "Hello, World!",
"description_html": "",
"image_url": null,
"has_attachments": false,
"tags": ["programming"],
"closed": false,
"golden": false,
"last_active_at": "2025-12-05T19:38:48.553Z",
"created_at": "2025-12-05T19:38:48.540Z",
"url": "http://app.fizzy.localhost:3006/897362094/cards/4",
"board": {
"id": "03f5v9zkft4hj9qq0lsn9ohcm",
"name": "Fizzy",
"all_access": true,
"created_at": "2025-12-05T19:36:35.534Z",
"auto_postpone_period_in_days": 30,
"url": "http://app.fizzy.localhost:3006/897362094/boards/03f5v9zkft4hj9qq0lsn9ohcm",
"creator": {
"id": "03f5v9zjw7pz8717a4no1h8a7",
"name": "David Heinemeier Hansson",
"role": "owner",
"active": true,
"email_address": "david@example.com",
"created_at": "2025-12-05T19:36:35.401Z",
"url": "http://app.fizzy.localhost:3006/897362094/users/03f5v9zjw7pz8717a4no1h8a7"
}
},
"column": {
"id": "03f5v9zkft4hj9qq0lsn9ohcn",
"name": "In Progress",
"color": {
"name": "Lime",
"value": "var(--color-card-4)"
},
"created_at": "2025-12-05T19:36:35.534Z"
},
"creator": {
"id": "03f5v9zjw7pz8717a4no1h8a7",
"name": "David Heinemeier Hansson",
"role": "owner",
"active": true,
"email_address": "david@example.com",
"created_at": "2025-12-05T19:36:35.401Z",
"url": "http://app.fizzy.localhost:3006/897362094/users/03f5v9zjw7pz8717a4no1h8a7"
},
"comments_url": "http://app.fizzy.localhost:3006/897362094/cards/4/comments",
"reactions_url": "http://app.fizzy.localhost:3006/897362094/cards/4/reactions",
"steps": [
{
"id": "03f8huu0sog76g3s975963b5e",
"content": "This is the first step",
"completed": false
},
{
"id": "03f8huu0sog76g3s975969734",
"content": "This is the second step",
"completed": false
}
]
}
```
> **Note:** The `closed` field indicates whether the card is in the "Done" state. The `column` field is only present when the card has been triaged into a column; cards in "Maybe?", "Not Now" or "Done" will not have this field.
```
--------------------------------
### Run CI Tests
Source: https://github.com/basecamp/fizzy/blob/main/docs/development.md
Execute the full suite of continuous integration tests.
```sh
bin/ci
```
--------------------------------
### Get Notifications
Source: https://github.com/basecamp/fizzy/blob/main/docs/api/sections/notifications.md
Fetches a list of notifications for the current user. Unread notifications appear first.
```json
[
{
"id": "03f5va03bpuvkcjemcxl73ho2",
"read": false,
"read_at": null,
"created_at": "2025-11-19T04:03:58.000Z",
"title": "Plain text mentions",
"body": "Assigned to self",
"creator": {
"id": "03f5v9zjw7pz8717a4no1h8a7",
"name": "David Heinemeier Hansson",
"role": "owner",
"active": true,
"email_address": "david@example.com",
"created_at": "2025-12-05T19:36:35.401Z",
"url": "http://app.fizzy.localhost:3006/897362094/users/03f5v9zjw7pz8717a4no1h8a7"
},
"card": {
"id": "03f5v9zo9qlcwwpyc0ascnikz",
"title": "Plain text mentions",
"status": "published",
"url": "http://app.fizzy.localhost:3006/897362094/cards/3"
},
"url": "http://app.fizzy.localhost:3006/897362094/notifications/03f5va03bpuvkcjemcxl73ho2"
}
]
```
--------------------------------
### Get My Identity
Source: https://github.com/basecamp/fizzy/blob/main/docs/api/sections/identity.md
Retrieves a list of accounts the current identity has access to, along with user details for each account.
```APIDOC
## GET /my/identity
### Description
Returns a list of accounts the identity has access to, including the user for each account.
### Method
GET
### Endpoint
/my/identity
### Response
#### Success Response (200)
- **accounts** (array) - A list of accounts the identity can access.
- **id** (string) - The unique identifier for the account.
- **name** (string) - The name of the account.
- **slug** (string) - A URL-friendly identifier for the account.
- **created_at** (string) - The timestamp when the account was created.
- **user** (object) - Details about the user associated with this account.
- **id** (string) - The unique identifier for the user.
- **name** (string) - The name of the user.
- **role** (string) - The role of the user within the account.
- **active** (boolean) - Indicates if the user account is active.
- **email_address** (string) - The email address of the user.
- **created_at** (string) - The timestamp when the user was created.
- **url** (string) - The URL to the user's profile.
### Response Example
```json
{
"accounts": [
{
"id": "03f5v9zjskhcii2r45ih3u1rq",
"name": "37signals",
"slug": "/897362094",
"created_at": "2025-12-05T19:36:35.377Z",
"user": {
"id": "03f5v9zjw7pz8717a4no1h8a7",
"name": "David Heinemeier Hansson",
"role": "owner",
"active": true,
"email_address": "david@example.com",
"created_at": "2025-12-05T19:36:35.401Z",
"url": "http://app.fizzy.localhost:3006/users/03f5v9zjw7pz8717a4no1h8a7"
}
},
{
"id": "03f5v9zpko7mmhjzwum3youpp",
"name": "Honcho",
"slug": "/686465299",
"created_at": "2025-12-05T19:36:36.746Z",
"user": {
"id": "03f5v9zppzlksuj4mxba2nbzn",
"name": "David Heinemeier Hansson",
"role": "owner",
"active": true,
"email_address": "david@example.com",
"created_at": "2025-12-05T19:36:36.783Z",
"url": "http://app.fizzy.localhost:3006/users/03f5v9zppzlksuj4mxba2nbzn"
}
}
]
}
```
```