From 465ede3e822d696c36ea67b4ad9ed4ef32597b76 Mon Sep 17 00:00:00 2001 From: Jason Zimdars Date: Tue, 21 Oct 2025 13:42:24 -0700 Subject: [PATCH 01/11] 'Fizzy' -> 'Boxcar' The menu button should always display the product name --- app/views/filters/menu/_button.html.erb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/views/filters/menu/_button.html.erb b/app/views/filters/menu/_button.html.erb index 5c8dd0bad..46e1719ce 100644 --- a/app/views/filters/menu/_button.html.erb +++ b/app/views/filters/menu/_button.html.erb @@ -3,5 +3,5 @@ action: "click->dialog#open:stop keydown.j@document->hotkey#click keydown.meta+j@document->hotkey#click keydown.ctrl+j@document->hotkey#click", controller: "hotkey" } do %> <%= image_tag "fizzy-logo.png" %> - <%= Current.user.identity.memberships.many? ? Account.sole.name : "Fizzy" %> -<% end %> + Boxcar +<% end %> \ No newline at end of file From 675515522d4c3ae017d90a3793ebbe1db766dce2 Mon Sep 17 00:00:00 2001 From: Mike Dalessio Date: Tue, 21 Oct 2025 13:56:11 -0700 Subject: [PATCH 02/11] bin/setup detects when it needs to set up seeds --- bin/setup | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/bin/setup b/bin/setup index f2a2d9737..153fd34de 100755 --- a/bin/setup +++ b/bin/setup @@ -34,6 +34,15 @@ step() { return $exit_code } +needs_seeding() { + has_tenant=$(bin/rails runner "pp ApplicationRecord.tenants.any? { ApplicationRecord.with_tenant(_1) { Account.sole } }" 2>/dev/null) + if [ "$has_tenant" = "true" ] ; then + return 1 + else + return 0 + fi +} + echo gum style --foreground 153 " ˚ ∘ ∘ ˚ " gum style --foreground 111 --bold " ∘˚˳°∘° 𝒻𝒾𝓏𝓏𝓎 °∘°˳˚∘ " @@ -60,6 +69,8 @@ fi if [[ $* == *--reset* ]]; then step "Resetting the database" rails db:reset +elif needs_seeding; then + step "Setting up the database" rails db:reset else step "Preparing the database" rails db:prepare fi From 6fa5b3d8b7c16185e5243b52c2b42c62488f8f46 Mon Sep 17 00:00:00 2001 From: Jason Zimdars Date: Tue, 21 Oct 2025 14:10:37 -0700 Subject: [PATCH 03/11] Menu button always has the product name - Indicate the current account in the menu --- app/assets/stylesheets/popup.css | 12 +++--------- app/helpers/filters_helper.rb | 5 +++-- app/views/filters/menu/_accounts.html.erb | 4 ++-- app/views/filters/menu/_button.html.erb | 2 +- 4 files changed, 9 insertions(+), 14 deletions(-) diff --git a/app/assets/stylesheets/popup.css b/app/assets/stylesheets/popup.css index 11c394ff8..b3b8172be 100644 --- a/app/assets/stylesheets/popup.css +++ b/app/assets/stylesheets/popup.css @@ -138,18 +138,12 @@ padding: var(--inline-space-half) var(--popup-item-padding-inline); text-align: start; - &:has(input:checked) { - --btn-color: var(--color-ink); + .icon.checked { + display: none; - .icon.checked { + .popup__item--current & { display: block; } - - @media (any-hover: hover) { - &:where(:not(:active):hover) { - --btn-background: var(--color-selected); - } - } } } diff --git a/app/helpers/filters_helper.rb b/app/helpers/filters_helper.rb index c93eb9735..1f89eb390 100644 --- a/app/helpers/filters_helper.rb +++ b/app/helpers/filters_helper.rb @@ -15,12 +15,13 @@ module FiltersHelper user_filtering.selected_collection_titles.collect { tag.strong it }.to_sentence.html_safe end - def filter_place_menu_item(path, label, icon, new_window: false) + def filter_place_menu_item(path, label, icon, new_window: false, current: false) link_to_params = new_window ? { target: "_blank" } : {} - tag.li class: "popup__item", id: "filter-place-#{label.parameterize}", data: { filter_target: "item", navigable_list_target: "item" } do + tag.li class: [ "popup__item", { "popup__item--current": current } ], id: "filter-place-#{label.parameterize}", data: { filter_target: "item", navigable_list_target: "item" } do concat icon_tag(icon, class: "popup__icon") concat(link_to(path, link_to_params.merge(class: "popup__btn btn")) do concat tag.span(label, class: "overflow-ellipsis") + concat icon_tag("check", class: "checked flex-item-justify-end", "aria-hidden": true) end) end end diff --git a/app/views/filters/menu/_accounts.html.erb b/app/views/filters/menu/_accounts.html.erb index 8d182ed3e..a7532cea8 100644 --- a/app/views/filters/menu/_accounts.html.erb +++ b/app/views/filters/menu/_accounts.html.erb @@ -1,5 +1,5 @@ <%= collapsible_nav_section "Accounts" do %> - <% Current.user.identity.memberships.where.not(user_tenant: Current.user.tenant).each do |membership| %> - <%= filter_place_menu_item root_url(script_name: "/#{membership.user_tenant}"), "#{membership.account_name}", "marker", new_window: true %> + <% Current.user.identity.memberships.each do |membership| %> + <%= filter_place_menu_item root_url(script_name: "/#{membership.user_tenant}"), "#{membership.account_name}", "marker", new_window: true, current: membership.user_tenant == Current.user.tenant %> <% end %> <% end %> diff --git a/app/views/filters/menu/_button.html.erb b/app/views/filters/menu/_button.html.erb index 46e1719ce..0ef4afbc4 100644 --- a/app/views/filters/menu/_button.html.erb +++ b/app/views/filters/menu/_button.html.erb @@ -4,4 +4,4 @@ controller: "hotkey" } do %> <%= image_tag "fizzy-logo.png" %> Boxcar -<% end %> \ No newline at end of file +<% end %> From 2d0b1e82a3fa7a73823d7628bbf8da23309e105d Mon Sep 17 00:00:00 2001 From: Jason Zimdars Date: Tue, 21 Oct 2025 14:17:24 -0700 Subject: [PATCH 04/11] Indicate account name in settings --- app/views/account/settings/show.html.erb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/views/account/settings/show.html.erb b/app/views/account/settings/show.html.erb index 732c49abc..e0b8cc14a 100644 --- a/app/views/account/settings/show.html.erb +++ b/app/views/account/settings/show.html.erb @@ -1,4 +1,4 @@ -<% @page_title = "Account Settings" %> +<% @page_title = "Account Settings for #{Account.sole.name}" %> <% content_for :header do %> <%= render "filters/menu" %> From 437c1872eecde45d7a9ef3d4062c013f6bdebbf5 Mon Sep 17 00:00:00 2001 From: Andy Smith Date: Tue, 21 Oct 2025 15:41:40 -0700 Subject: [PATCH 05/11] Pinstripe background --- app/assets/stylesheets/card-columns.css | 135 +++++++----------- .../collections/columns/_pinstripes.html.erb | 4 + app/views/collections/show/_stream.html.erb | 5 +- .../collections/show/_considering.html.erb | 5 +- .../public/collections/show/_stream.html.erb | 5 +- 5 files changed, 65 insertions(+), 89 deletions(-) create mode 100644 app/views/collections/columns/_pinstripes.html.erb diff --git a/app/assets/stylesheets/card-columns.css b/app/assets/stylesheets/card-columns.css index e095e7e28..5cc2ab060 100644 --- a/app/assets/stylesheets/card-columns.css +++ b/app/assets/stylesheets/card-columns.css @@ -24,6 +24,7 @@ margin-inline: auto; max-inline-size: var(--main-width); overflow-x: auto; + overflow-y: hidden; position: relative; /* When it has something expanded */ @@ -462,93 +463,12 @@ /* ------------------------------------------------------------------------ */ .cards--considering { - --gradient-opacity: 25%; - --bottom-gradient-size: 4em; - - padding-bottom: var(--bottom-gradient-size); position: relative; - @supports(mask: linear-gradient(black)) { - &:before { - background-image: linear-gradient(90deg, - transparent 0%, - color-mix(in srgb, var(--color-considering) var(--gradient-opacity), transparent) 33%, - color-mix(in srgb, var(--color-considering) var(--gradient-opacity), transparent) 66%, - transparent 100%); - content: ""; - inset: calc(var(--column-width-collapsed) + var(--block-space-half)) 0 0 0; - position: absolute; - z-index: 0; - } - - &:after { - background: linear-gradient(90deg, - color-mix(in oklch, var(--color-considering) 0%, transparent) 0%, - color-mix(in oklch, var(--color-considering) 20%, transparent) 25%, - color-mix(in oklch, var(--color-considering) 20%, transparent) 50%, - color-mix(in oklch, var(--color-considering) 0%, transparent) 100%); - content: ""; - inset: calc(var(--column-width-collapsed) + var(--block-space-half)) 0 0 0; - mask: var(--wavy-background-mask); - position: absolute; - z-index: -1; - } - } - @media (min-width: 640px) { padding-inline: var(--cards-gap); } - @media (prefers-color-scheme: dark) { - --gradient-opacity: 10%; - } - - .cards__decoration { - --gradient-opacity: 30%; - --size: 2.2em; - - background-color: var(--color-canvas); - background-image: radial-gradient(ellipse at bottom, - color-mix(in srgb, var(--color-considering) var(--gradient-opacity), transparent) 0%, - transparent 70%); - block-size: var(--size); - inline-size: 100%; - inset: calc(var(--column-width-collapsed) + var(--block-space) - var(--size)) 0 auto 0; - position: absolute; - z-index: -1; - - @media (prefers-color-scheme: dark) { - --gradient-opacity: 15%; - } - - @supports(mask: radial-gradient(black)) { - --gradient-opacity: 30%; - - &:before { - background: radial-gradient(ellipse at bottom, - color-mix(in srgb, var(--color-considering) var(--gradient-opacity), transparent) 0%, - transparent 70%); - content: ""; - inset: 0; - mask: radial-gradient(6px at 50% calc(100% + 3px), - transparent calc(99% - 2px), - black calc(101% - 2px) 99%, transparent 101%) calc(50% - 8px) calc(50% - 3px + .5px)/16px 6px, - radial-gradient(6px at 50% -3px, transparent calc(99% - 2px), black calc(101% - 2px) 99%, transparent 101%) 50% calc(50% + 3px)/16px 6px; - position: absolute; - z-index: 0; - } - } - } - - .cards__decoration-end { - background: linear-gradient( transparent 0%, var(--color-canvas) 90%); - block-size: var(--bottom-gradient-size); - content: ""; - inset: auto 0 0; - position: absolute; - z-index: 1; - } - .card { --avatar-size: 2.75em; --text-small: 1.1em; @@ -589,6 +509,59 @@ } } + /* Pinstripes + /* -------------------------------------------------------------------------- */ + + .pinstripes { + --pinstripe-color: oklch(var(--lch-blue-light)); + --pinstripe-spacing: 3px; + + background: repeating-linear-gradient( + 90deg, + var(--pinstripe-color), + var(--pinstripe-color) 1px, + transparent 1px, + transparent var(--pinstripe-spacing) + ); + inset: -24px 0; + overflow: hidden; + position: absolute; + + /* Fade */ + &:before, + &:after { + background: radial-gradient( + circle at center bottom, + transparent, + transparent 65%, + white 70%, + white + ); + block-size: 480px; + inline-size: 200%; + content: ""; + inset: 0; + position: absolute; + translate: -25% 0; + } + + &:after { + inset-block: auto 0; + rotate: 180deg; + } + } + + .pinstripes--alt { + --pinstripe-spacing: 6px; /* 2x previous spacing value */ + } + + .pinstripes__fade { + background: linear-gradient(to right, var(--color-canvas), transparent 10%, transparent 90%, var(--color-canvas)); + content: ""; + inset: 0; + position: absolute; + } + /* Collection tools /* -------------------------------------------------------------------------- */ diff --git a/app/views/collections/columns/_pinstripes.html.erb b/app/views/collections/columns/_pinstripes.html.erb new file mode 100644 index 000000000..d3c3dcfe5 --- /dev/null +++ b/app/views/collections/columns/_pinstripes.html.erb @@ -0,0 +1,4 @@ +
+
+
+
diff --git a/app/views/collections/show/_stream.html.erb b/app/views/collections/show/_stream.html.erb index 56f0ee3e2..c60e67e3e 100644 --- a/app/views/collections/show/_stream.html.erb +++ b/app/views/collections/show/_stream.html.erb @@ -2,7 +2,8 @@ data-drag-and-drop-target="container" data-action="turbo:before-morph-attribute->collapsible-columns#preventToggle" data-drag-and-drop-url="<%= columns_card_drops_stream_path("__id__") %>"> -
+ + <%= render "collections/columns/pinstripes" %>

The Stream

@@ -19,6 +20,4 @@ <%= render "collections/columns/list", cards: page.records, draggable: true %> <% end %> <% end %> - -
diff --git a/app/views/public/collections/show/_considering.html.erb b/app/views/public/collections/show/_considering.html.erb index 32c01b865..de72329f1 100644 --- a/app/views/public/collections/show/_considering.html.erb +++ b/app/views/public/collections/show/_considering.html.erb @@ -1,5 +1,7 @@
-
+ + <%= render "collections/columns/pinstripes" %> + <% if page.used? %> <%= render partial: "cards/display/public_preview", collection: page.records, as: :card, cached: true %> @@ -11,5 +13,4 @@ <% else %>

Nothing here

<% end %> -
diff --git a/app/views/public/collections/show/_stream.html.erb b/app/views/public/collections/show/_stream.html.erb index 346c5c309..41ab9d6b8 100644 --- a/app/views/public/collections/show/_stream.html.erb +++ b/app/views/public/collections/show/_stream.html.erb @@ -1,6 +1,7 @@
-
+ + <%= render "collections/columns/pinstripes" %>

The Stream

@@ -11,6 +12,4 @@ <%= render "public/collections/columns/list", cards: page.records %> <% end %> <% end %> - -
From fb8968c141cecbe842d7ef7e6635463d011c8610 Mon Sep 17 00:00:00 2001 From: Andy Smith Date: Tue, 21 Oct 2025 15:42:59 -0700 Subject: [PATCH 06/11] Use canvas BG color --- app/assets/stylesheets/card-columns.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/assets/stylesheets/card-columns.css b/app/assets/stylesheets/card-columns.css index 5cc2ab060..8bfc9bf1c 100644 --- a/app/assets/stylesheets/card-columns.css +++ b/app/assets/stylesheets/card-columns.css @@ -534,8 +534,8 @@ circle at center bottom, transparent, transparent 65%, - white 70%, - white + var(--color-canvas) 70%, + var(--color-canvas) ); block-size: 480px; inline-size: 200%; From 3e37269437775eec05d97c9971523ac7091f9932 Mon Sep 17 00:00:00 2001 From: Andy Smith Date: Tue, 21 Oct 2025 15:54:15 -0700 Subject: [PATCH 07/11] Transitions wipe from right --- app/assets/stylesheets/card-columns.css | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/assets/stylesheets/card-columns.css b/app/assets/stylesheets/card-columns.css index 8bfc9bf1c..e3090d4c7 100644 --- a/app/assets/stylesheets/card-columns.css +++ b/app/assets/stylesheets/card-columns.css @@ -66,7 +66,7 @@ inline-size: var(--column-width-expanded); position: relative; scroll-snap-align: start; - transition: inline-size 200ms ease-out; + transition: inline-size 300ms ease-out; will-change: inline-size; .no-transitions & { @@ -102,7 +102,9 @@ /* The wrapper around the cards used to clip overflow while transitioning. * Also, don't resize cards while transitioning to avoid reflow. */ .cards__list { - display: grid; + align-items: flex-end; /* use flex-start to wipe from left */ + display: flex; + flex-direction: column; gap: var(--cards-gap); margin-block-start: -1ch; margin-inline: -1ch; From 60b48145c41642b739a97560df6768a88fb70616 Mon Sep 17 00:00:00 2001 From: Andy Smith Date: Wed, 22 Oct 2025 12:13:54 -0700 Subject: [PATCH 08/11] SPace out pinstripes --- app/assets/stylesheets/card-columns.css | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/assets/stylesheets/card-columns.css b/app/assets/stylesheets/card-columns.css index e3090d4c7..895f59203 100644 --- a/app/assets/stylesheets/card-columns.css +++ b/app/assets/stylesheets/card-columns.css @@ -516,7 +516,7 @@ .pinstripes { --pinstripe-color: oklch(var(--lch-blue-light)); - --pinstripe-spacing: 3px; + --pinstripe-spacing: 5px; background: repeating-linear-gradient( 90deg, @@ -554,7 +554,7 @@ } .pinstripes--alt { - --pinstripe-spacing: 6px; /* 2x previous spacing value */ + --pinstripe-spacing: 10px; /* 2x previous spacing value */ } .pinstripes__fade { From 49e87310d7d4915b53270bf538626c6e9f067a1b Mon Sep 17 00:00:00 2001 From: Jason Zimdars Date: Wed, 22 Oct 2025 13:42:41 -0700 Subject: [PATCH 09/11] Rename Fizzy, Boxcar --- app/helpers/application_helper.rb | 2 +- .../conversation/message/response_generator_job.rb | 2 +- app/mailers/application_mailer.rb | 2 +- app/mailers/notification/bundle_mailer.rb | 2 +- .../account/settings/_entropy_configuration.html.erb | 2 +- app/views/collections/edit/_auto_close.html.erb | 2 +- app/views/collections/edit/_publication.html.erb | 2 +- app/views/conversations/_composer.html.erb | 2 +- app/views/events/index.html.erb | 2 +- app/views/filters/menu/_places.html.erb | 2 +- app/views/layouts/error.html.erb | 4 ---- app/views/layouts/public.html.erb | 2 +- .../notification/bundle_mailer/notification.html.erb | 2 +- .../notification/bundle_mailer/notification.text.erb | 2 +- app/views/notifications/settings/_install.html.erb | 8 ++++---- app/views/notifications/settings/_system.html.erb | 12 ++++++------ app/views/notifications/unsubscribes/show.html.erb | 4 ++-- app/views/pwa/manifest.json.erb | 2 +- app/views/searches/_form.html.erb | 2 +- app/views/sessions/login_menu.html.erb | 6 +++--- app/views/sessions/new.html.erb | 2 +- app/views/users/new.html.erb | 2 +- app/views/webhooks/index.html.erb | 4 ++-- app/views/webhooks/new.html.erb | 2 +- 24 files changed, 35 insertions(+), 39 deletions(-) diff --git a/app/helpers/application_helper.rb b/app/helpers/application_helper.rb index f6afd0ba4..f7e82417c 100644 --- a/app/helpers/application_helper.rb +++ b/app/helpers/application_helper.rb @@ -1,6 +1,6 @@ module ApplicationHelper def page_title_tag - tag.title @page_title || "Fizzy" + tag.title @page_title || "Boxcar" end def icon_tag(name, **options) diff --git a/app/jobs/conversation/message/response_generator_job.rb b/app/jobs/conversation/message/response_generator_job.rb index 0ec4de601..723de9108 100644 --- a/app/jobs/conversation/message/response_generator_job.rb +++ b/app/jobs/conversation/message/response_generator_job.rb @@ -9,7 +9,7 @@ class Conversation::Message::ResponseGeneratorJob < ApplicationJob retry_on RubyLLM::RateLimitError, RubyLLM::ServiceUnavailableError, wait: 2.seconds, attempts: 3 do |job, error| message = job.arguments.first - message.conversation.respond("Fizzy is very busy at the moment. Please try again in a minute.") + message.conversation.respond("Boxcar is very busy at the moment. Please try again in a minute.") end def perform(message) diff --git a/app/mailers/application_mailer.rb b/app/mailers/application_mailer.rb index 562bc0e3c..9d55c04a4 100644 --- a/app/mailers/application_mailer.rb +++ b/app/mailers/application_mailer.rb @@ -1,5 +1,5 @@ class ApplicationMailer < ActionMailer::Base - default from: "The Fizzy team " + default from: "The Boxcar team " layout "mailer" append_view_path Rails.root.join("app/views/mailers") diff --git a/app/mailers/notification/bundle_mailer.rb b/app/mailers/notification/bundle_mailer.rb index 06bce5aa0..fed19d721 100644 --- a/app/mailers/notification/bundle_mailer.rb +++ b/app/mailers/notification/bundle_mailer.rb @@ -11,6 +11,6 @@ class Notification::BundleMailer < ApplicationMailer mail \ to: bundle.user.email_address, - subject: "Latest Activity in Fizzy" + subject: "Latest Activity in Boxcar" end end diff --git a/app/views/account/settings/_entropy_configuration.html.erb b/app/views/account/settings/_entropy_configuration.html.erb index fb96fe67f..0a0ae04dd 100644 --- a/app/views/account/settings/_entropy_configuration.html.erb +++ b/app/views/account/settings/_entropy_configuration.html.erb @@ -1,5 +1,5 @@

Auto close

-

Fizzy doesn’t let stale cards stick around forever. Cards automatically close as “Not Now” without activity for specific period of time. This is the default, global setting — you can override it on each Board.

+

Boxcar doesn’t let stale cards stick around forever. Cards automatically close as “Not Now” without activity for specific period of time. This is the default, global setting — you can override it on each Board.

<%= render "entropy/auto_close", model: account.default_entropy_configuration, url: account_entropy_configuration_path %>
diff --git a/app/views/collections/edit/_auto_close.html.erb b/app/views/collections/edit/_auto_close.html.erb index a8ba6cd59..9bb035275 100644 --- a/app/views/collections/edit/_auto_close.html.erb +++ b/app/views/collections/edit/_auto_close.html.erb @@ -1,7 +1,7 @@ <%= turbo_frame_tag @collection, :entropy_configuration do %>

Auto close

-

Fizzy doesn’t let stale cards stick around forever. Cards automatically close as “Not now” if no one updates, comments, or moves a card for…

+

Boxcar doesn’t let stale cards stick around forever. Cards automatically close as “Not now” if no one updates, comments, or moves a card for…

<%= render "entropy/auto_close", model: collection, url: collection_entropy_configuration_path(collection) %>
<% end %> diff --git a/app/views/collections/edit/_publication.html.erb b/app/views/collections/edit/_publication.html.erb index cedd85b56..d185b8c2e 100644 --- a/app/views/collections/edit/_publication.html.erb +++ b/app/views/collections/edit/_publication.html.erb @@ -1,7 +1,7 @@ <%= turbo_frame_tag @collection, :publication do %>

Public link

-
Turn on the Public link to share this Board with anyone in the world. They won’t need to log in and they won’t be able to see anything else in Fizzy.
+
Turn on the Public link to share this board with anyone in the world. They won’t need to log in and they won’t be able to see anything else in Boxcar.
<% if collection.published? %> diff --git a/app/views/conversations/_composer.html.erb b/app/views/conversations/_composer.html.erb index 36ab71173..21db67268 100644 --- a/app/views/conversations/_composer.html.erb +++ b/app/views/conversations/_composer.html.erb @@ -8,7 +8,7 @@ <%= render "conversations/composer/thinking_indicator", conversation: nil %> <%= form.hidden_field :client_message_id, data: { conversation__composer_target: "clientMessageIdInput" } %> - <%= form.label :content, "Ask Fizzy", class: "font-weight-black txt-nowrap" %> + <%= form.label :content, "Ask Boxcar", class: "font-weight-black txt-nowrap" %> <%= form.text_field :content, autofocus: true, autocomplete: "off", diff --git a/app/views/events/index.html.erb b/app/views/events/index.html.erb index f946c9bd9..e66e57527 100644 --- a/app/views/events/index.html.erb +++ b/app/views/events/index.html.erb @@ -29,7 +29,7 @@ diff --git a/app/views/filters/menu/_places.html.erb b/app/views/filters/menu/_places.html.erb index 02195add5..a42f5cc43 100644 --- a/app/views/filters/menu/_places.html.erb +++ b/app/views/filters/menu/_places.html.erb @@ -1,5 +1,5 @@ <%= collapsible_nav_section "Jump to…" do %> - <%= filter_place_menu_item "https://www.youtube.com/watch?v=rNKRdk7DLHM", "Fizzy beta orientation", "youtube", new_window: true %> + <%= filter_place_menu_item "https://www.youtube.com/watch?v=rNKRdk7DLHM", "Boxcar beta orientation", "youtube", new_window: true %> <%= filter_place_menu_item account_settings_path, "Account Settings", "settings" %> <%= filter_place_menu_item user_path(Current.user), "My Profile", "person" %> <%= filter_place_menu_item notifications_path, "Notifications", "bell" %> diff --git a/app/views/layouts/error.html.erb b/app/views/layouts/error.html.erb index 0aa244f09..3baec3c6e 100644 --- a/app/views/layouts/error.html.erb +++ b/app/views/layouts/error.html.erb @@ -153,10 +153,6 @@ - <%= yield %> <%= link_to "← Back home".html_safe, root_url %> diff --git a/app/views/layouts/public.html.erb b/app/views/layouts/public.html.erb index 0df344476..d02777fb5 100644 --- a/app/views/layouts/public.html.erb +++ b/app/views/layouts/public.html.erb @@ -15,7 +15,7 @@ diff --git a/app/views/mailers/notification/bundle_mailer/notification.html.erb b/app/views/mailers/notification/bundle_mailer/notification.html.erb index f051cf426..aafa2c66e 100644 --- a/app/views/mailers/notification/bundle_mailer/notification.html.erb +++ b/app/views/mailers/notification/bundle_mailer/notification.html.erb @@ -3,7 +3,7 @@

Everything since <%= @bundle.starts_at.strftime("%-l%P on %A, %B %-d") %>

You have <%= link_to pluralize(@notifications.count, "new notification"), notifications_url %>.

<%= render partial: "notification/bundle_mailer/notification", collection: @notifications, as: :notification %> - diff --git a/app/views/mailers/notification/bundle_mailer/notification.text.erb b/app/views/mailers/notification/bundle_mailer/notification.text.erb index 0149767e6..ac5cd15bd 100644 --- a/app/views/mailers/notification/bundle_mailer/notification.text.erb +++ b/app/views/mailers/notification/bundle_mailer/notification.text.erb @@ -4,7 +4,7 @@ You have <%= pluralize @notifications.count, "new notification" %>. <%= render partial: "notification/bundle_mailer/notification", collection: @notifications, as: :notification %> -------------------------------------------------------------------------------- -Fizzy emails you about new notifications every few hours. +Boxcar emails you about new notifications every few hours. Change how often you get these: <%= notifications_settings_url %> diff --git a/app/views/notifications/settings/_install.html.erb b/app/views/notifications/settings/_install.html.erb index f8d664043..e671cb664 100644 --- a/app/views/notifications/settings/_install.html.erb +++ b/app/views/notifications/settings/_install.html.erb @@ -1,10 +1,10 @@ <% unless (platform.chrome? && !platform.ios?) || (platform.firefox? && !platform.android?) %>
-

<%= platform.safari? && platform.desktop? ? "…or install" : "Install " -%> Fizzy as a web app.

+

<%= platform.safari? && platform.desktop? ? "…or install" : "Install " -%> Boxcar as a web app.

<% case when platform.edge? %>
    -
  1. Click <%= icon_tag "install-edge", alt: "the app available - install Fizzy button" %>in the address bar.
  2. +
  3. Click <%= icon_tag "install-edge", alt: "the app available - install Boxcar button" %>in the address bar.
  4. Click Install.
<% when platform.chrome? && platform.android? %> @@ -23,13 +23,13 @@
  • Click Add to Dock….
  • <% when (platform.safari? || platform.chrome?) && platform.ios? %> -

    To receive push notifications in <%= platform.browser.capitalize %> for <%= platform.operating_system %>, you must first install Fizzy as a web app.

    +

    To receive push notifications in <%= platform.browser.capitalize %> for <%= platform.operating_system %>, you must first install Boxcar as a web app.

    1. Tap <%= icon_tag "share", alt: "the share button" %>
    2. Tap Add to Home Screen.
    <% else %> -

    Some platforms require you to install Fizzy as a web app to receive push notifications.

    +

    Some platforms require you to install Boxcar as a web app to receive push notifications.

    <% end %>
    <% end %> diff --git a/app/views/notifications/settings/_system.html.erb b/app/views/notifications/settings/_system.html.erb index afe0efd45..1af0a7dd9 100644 --- a/app/views/notifications/settings/_system.html.erb +++ b/app/views/notifications/settings/_system.html.erb @@ -12,19 +12,19 @@
    1. Click Start, then Settings.
    2. Go to System > Notification.
    3. -
    4. Click <%= icon_tag "switch", alt: "the toggle button" %> ON for Fizzy.
    5. +
    6. Click <%= icon_tag "switch", alt: "the toggle button" %> ON for Boxcar.
    <% when (platform.firefox? || platform.chrome?) && platform.desktop? %>
      <% if platform.windows? %>
    1. Click Start, then Settings.
    2. Go to System > Notification.
    3. -
    4. Click <%= icon_tag "switch", alt: "the toggle button" %> ON for Fizzy.
    5. +
    6. Click <%= icon_tag "switch", alt: "the toggle button" %> ON for Boxcar.
    7. <% else %>
    8. Click in the top left.
    9. Click System Settings….
    10. Click Notifications.
    11. -
    12. Click Fizzy.
    13. +
    14. Click Boxcar.
    15. Click <%= icon_tag "switch", alt: "the allow notifications switch" %> to Allow notifications.
    16. <% end %>
    @@ -33,13 +33,13 @@
  • Click in the top left.
  • Click System Settings….
  • Click Notifications.
  • -
  • Click Fizzy.
  • +
  • Click Boxcar.
  • Click <%= icon_tag "switch", alt: "the allow notifications switch" %> to Allow notifications.
  • <% when (platform.safari? || platform.chrome?) && platform.ios? %>
    1. Open the <%= icon_tag "gear", aria: { hidden: "true" } %> Settings app.
    2. -
    3. Scroll to and tap Fizzy.
    4. +
    5. Scroll to and tap Boxcar.
    6. Tap Notifications.
    7. Tap <%= icon_tag "switch", alt: "the allow notifications switch button" %> to Allow Notifications.
    @@ -48,7 +48,7 @@
  • Open the <%= icon_tag "gear", aria: { hidden: "true" } %> Settings app.
  • Tap Notifications.
  • Tap App notifications.
  • -
  • Scroll to Fizzy.
  • +
  • Scroll to Boxcar.
  • Tap <%= icon_tag "switch", alt: "the switch" %> to Allow Notifications.
  • <% else %> diff --git a/app/views/notifications/unsubscribes/show.html.erb b/app/views/notifications/unsubscribes/show.html.erb index 3e100b14d..824ee8e8d 100644 --- a/app/views/notifications/unsubscribes/show.html.erb +++ b/app/views/notifications/unsubscribes/show.html.erb @@ -1,9 +1,9 @@

    You’re unsubscribed

    -

    Thanks, <%= @user.first_name %>! Fizzy won’t send you any more email notifications. If you change your mind you can turn them back on in <%= link_to "Notifications Settings", notifications_settings_path %>.

    +

    Thanks, <%= @user.first_name %>! Boxcar won’t send you any more email notifications. If you change your mind you can turn them back on in <%= link_to "Notifications Settings", notifications_settings_path %>.

    <%= link_to root_path, class: "btn btn--link margin-block-start" do %> <%= icon_tag "arrow-left" %> - Back to Fizzy + Back to Boxcar <% end %>
    diff --git a/app/views/pwa/manifest.json.erb b/app/views/pwa/manifest.json.erb index ff66cb7b3..dbddb51da 100644 --- a/app/views/pwa/manifest.json.erb +++ b/app/views/pwa/manifest.json.erb @@ -1,5 +1,5 @@ { - "name": "<%= [ Account.sole.name, "Fizzy", Rails.env.production? ? nil : Rails.env ].compact.join(" - ") %>", + "name": "<%= [ Account.sole.name, "Boxcar", Rails.env.production? ? nil : Rails.env ].compact.join(" - ") %>", "icons": [ { "src": "/app-icon-192.png", diff --git a/app/views/searches/_form.html.erb b/app/views/searches/_form.html.erb index bc2c9cb4f..d4fd74722 100644 --- a/app/views/searches/_form.html.erb +++ b/app/views/searches/_form.html.erb @@ -1,5 +1,5 @@ <%= form_with url: search_path, method: :get, class: "search__form flex align-center justify-center gap-half", data: { turbo_frame: "bar-content" } do |form| %> - <%= form.label :q, "Search Fizzy", class: "font-weight-black txt-nowrap" %> + <%= form.label :q, "Search Boxcar", class: "font-weight-black txt-nowrap" %> <%= text_field_tag :q, query_terms, class: "search__input input", type: "search", diff --git a/app/views/sessions/login_menu.html.erb b/app/views/sessions/login_menu.html.erb index 4f9b7c826..3e2d093d2 100644 --- a/app/views/sessions/login_menu.html.erb +++ b/app/views/sessions/login_menu.html.erb @@ -1,12 +1,12 @@ <% @page_title = "Choose Account" %>
    -

    Fizzy

    +

    Boxcar

    <% identity = Identity.find_signed(Current.identity_token.id) %> <% memberships = identity&.memberships %> <% if memberships.present? %> -

    Your Fizzy Accounts

    +

    Your Boxcar Accounts

      <% memberships.each do |membership| %>
    • @@ -15,6 +15,6 @@ <% end %>
    <% else %> -

    You don't have any existing Fizzy accounts.

    +

    You don't have any existing Boxcar accounts.

    <% end %>
    diff --git a/app/views/sessions/new.html.erb b/app/views/sessions/new.html.erb index 8d714d9de..dc24f8c3a 100644 --- a/app/views/sessions/new.html.erb +++ b/app/views/sessions/new.html.erb @@ -1,7 +1,7 @@ <% @page_title = "Sign in" %>
    " style="--panel-size: 55ch;"> -

    Fizzy

    +

    Boxcar

    <%= form_with url: session_path, class: "flex flex-column gap txt-large" do |form| %>
    diff --git a/app/views/users/new.html.erb b/app/views/users/new.html.erb index 01ef594c3..5f37908e2 100644 --- a/app/views/users/new.html.erb +++ b/app/views/users/new.html.erb @@ -10,7 +10,7 @@ <% end %>
    -

    Fizzy

    +

    Boxcar

    <%= form_with model: @user, url: join_path(params[:join_code]), class: "flex flex-column gap" do |form| %>
    diff --git a/app/views/webhooks/index.html.erb b/app/views/webhooks/index.html.erb index 4a0097d84..f4d93588e 100644 --- a/app/views/webhooks/index.html.erb +++ b/app/views/webhooks/index.html.erb @@ -27,8 +27,8 @@ <%= render partial: "webhooks/webhook", collection: @page.records %> <% else %> -

    Webhooks can notify another application when something happens in this Fizzy collection. You'll choose which events to subscribe to and provide a URL to receive the data.

    -

    For example, you could create a webhook that posts to a Campfire chat in Basecamp when new cards are added to Fizzy.

    +

    Webhooks can notify another application when something happens in this Boxcar board. You’ll choose which events to subscribe to and provide a URL to receive the data.

    +

    For example, you could create a webhook that posts to a Campfire chat in Basecamp when new cards are added to Boxcar.

    <%= link_to new_collection_webhook_path, class: "btn btn--link" do %> <%= icon_tag "add" %> Set up a webhook diff --git a/app/views/webhooks/new.html.erb b/app/views/webhooks/new.html.erb index 3bbdaeb43..347531f45 100644 --- a/app/views/webhooks/new.html.erb +++ b/app/views/webhooks/new.html.erb @@ -23,7 +23,7 @@
    <%= form.label :url do %> Payload URL
    -

    This is the URL for the app that will receive payloads from Fizzy.

    +

    This is the URL for the app that will receive payloads from Boxcar.

    <% end %> <%= form.url_field :url, required: true, From 81618d758e026dff13dc9aba46b125affc02a26c Mon Sep 17 00:00:00 2001 From: Jason Zimdars Date: Wed, 22 Oct 2025 13:49:23 -0700 Subject: [PATCH 10/11] Avoid capitalizing "board" --- app/controllers/conversations/messages_controller.rb | 2 +- app/views/account/settings/_entropy_configuration.html.erb | 2 +- app/views/collections/edit.html.erb | 4 ++-- app/views/collections/edit/_delete.html.erb | 4 ++-- app/views/collections/edit/_users.html.erb | 2 +- app/views/collections/new.html.erb | 2 +- app/views/filters/menu/_hotkeys.html.erb | 2 +- 7 files changed, 9 insertions(+), 9 deletions(-) diff --git a/app/controllers/conversations/messages_controller.rb b/app/controllers/conversations/messages_controller.rb index d37ac040b..06778f306 100644 --- a/app/controllers/conversations/messages_controller.rb +++ b/app/controllers/conversations/messages_controller.rb @@ -11,7 +11,7 @@ class Conversations::MessagesController < ApplicationController rescue Ai::Quota::UsageExceedsQuotaError render json: { error: "You've depleted your quota" }, status: :too_many_requests rescue Conversation::InvalidStateError - render json: { error: "Fizzy is still working on an answer to your last question" }, status: :conflict + render json: { error: "Boxcar is still working on an answer to your last question" }, status: :conflict end private diff --git a/app/views/account/settings/_entropy_configuration.html.erb b/app/views/account/settings/_entropy_configuration.html.erb index 0a0ae04dd..279a32bba 100644 --- a/app/views/account/settings/_entropy_configuration.html.erb +++ b/app/views/account/settings/_entropy_configuration.html.erb @@ -1,5 +1,5 @@

    Auto close

    -

    Boxcar doesn’t let stale cards stick around forever. Cards automatically close as “Not Now” without activity for specific period of time. This is the default, global setting — you can override it on each Board.

    +

    Boxcar doesn’t let stale cards stick around forever. Cards automatically close as “Not Now” without activity for specific period of time. This is the default, global setting — you can override it on each board.

    <%= render "entropy/auto_close", model: account.default_entropy_configuration, url: account_entropy_configuration_path %>
    diff --git a/app/views/collections/edit.html.erb b/app/views/collections/edit.html.erb index 17fb658ff..8fa1a5f0e 100644 --- a/app/views/collections/edit.html.erb +++ b/app/views/collections/edit.html.erb @@ -17,8 +17,8 @@
    -

    Name and Access

    -
    Choose who can access this Board
    +

    Name and access

    +
    Choose who can access this board
    <%= form_with model: @collection, class: "display-contents", data: { diff --git a/app/views/collections/edit/_delete.html.erb b/app/views/collections/edit/_delete.html.erb index e9df88ae5..7f13e84b1 100644 --- a/app/views/collections/edit/_delete.html.erb +++ b/app/views/collections/edit/_delete.html.erb @@ -1,8 +1,8 @@ <% if Current.user.collections.many? %> <%= form_with model: collection, class: "txt-align-center margin-block-start-auto", method: :delete do |form| %> - <%= form.button class: "btn txt-negative borderless txt-small", data: { turbo_confirm: "Are you sure you want to permanently delete this Board?" } do %> + <%= form.button class: "btn txt-negative borderless txt-small", data: { turbo_confirm: "Are you sure you want to permanently delete this board?" } do %> <%= icon_tag "trash" %> - Delete this Board + Delete this board <% end %> <% end %> <% end %> diff --git a/app/views/collections/edit/_users.html.erb b/app/views/collections/edit/_users.html.erb index 2c9dabcbc..5d2ae7409 100644 --- a/app/views/collections/edit/_users.html.erb +++ b/app/views/collections/edit/_users.html.erb @@ -14,7 +14,7 @@ diff --git a/app/views/collections/new.html.erb b/app/views/collections/new.html.erb index 5c8339f01..d476654e6 100644 --- a/app/views/collections/new.html.erb +++ b/app/views/collections/new.html.erb @@ -1,4 +1,4 @@ -<% @page_title = "Create a new Board" %> +<% @page_title = "Create a new board" %> <% content_for :header do %> <%= render "filters/menu" %> diff --git a/app/views/filters/menu/_hotkeys.html.erb b/app/views/filters/menu/_hotkeys.html.erb index 76cc8b096..07b005b9b 100644 --- a/app/views/filters/menu/_hotkeys.html.erb +++ b/app/views/filters/menu/_hotkeys.html.erb @@ -2,7 +2,7 @@ <%= filter_hotkey_link "Home", root_path, 1, "home" %> <%= filter_hotkey_link "Assigned to me", cards_path(assignee_ids: [Current.user.id]), 2, "clipboard" %> <%= filter_hotkey_link "Added by me", cards_path(creator_ids: [Current.user.id]), 3, "person-add" %> - <%= filter_hotkey_link "New Board", new_collection_path, 4, "collection-add" %> + <%= filter_hotkey_link "New board", new_collection_path, 4, "collection-add" %> <%= filter_hotkey_link "Notifications", notifications_path, 5, "bell" %> <%= filter_hotkey_link "Account #{tag.span("Settings", class: "visually-hidden")}", account_settings_path, 6, "settings" %>
    From 47042602dea66f20b12efba6983dbaac07eec8ba Mon Sep 17 00:00:00 2001 From: Jason Zimdars Date: Wed, 22 Oct 2025 14:12:58 -0700 Subject: [PATCH 11/11] Update tests --- test/controllers/controller_authentication_test.rb | 2 +- test/jobs/conversation/message/response_generator_job_test.rb | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/controllers/controller_authentication_test.rb b/test/controllers/controller_authentication_test.rb index 212f7819f..b03af5f1d 100644 --- a/test/controllers/controller_authentication_test.rb +++ b/test/controllers/controller_authentication_test.rb @@ -7,7 +7,7 @@ class ControllerAuthenticationTest < ActionDispatch::IntegrationTest get cards_path assert_response :success - assert_dom "p", text: "You don't have any existing Fizzy accounts." + assert_dom "p", text: "You don't have any existing Boxcar accounts." end test "access with an account slug but no session redirects to new session" do diff --git a/test/jobs/conversation/message/response_generator_job_test.rb b/test/jobs/conversation/message/response_generator_job_test.rb index 8f98db673..ca903c3b8 100644 --- a/test/jobs/conversation/message/response_generator_job_test.rb +++ b/test/jobs/conversation/message/response_generator_job_test.rb @@ -39,6 +39,6 @@ class Conversation::Message::ResponseGeneratorJobTest < ActiveJob::TestCase last_message = conversation.messages.ordered.last assert last_message.assistant? - assert_match(/Fizzy is very busy/i, last_message.content.to_plain_text) + assert_match(/Boxcar is very busy/i, last_message.content.to_plain_text) end end