### 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": "

Hello, World!

", "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" } } ] } ``` ```