Boxcar -> BOXCAR

This commit is contained in:
Jason Zimdars
2025-10-23 15:05:36 -07:00
parent 2409f6bbbc
commit f5384baf63
27 changed files with 39 additions and 39 deletions
@@ -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: "Boxcar 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
+1 -1
View File
@@ -1,6 +1,6 @@
module ApplicationHelper
def page_title_tag
tag.title @page_title || "Boxcar"
tag.title @page_title || "BOXCAR"
end
def icon_tag(name, **options)
@@ -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("Boxcar 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)
+1 -1
View File
@@ -1,5 +1,5 @@
class ApplicationMailer < ActionMailer::Base
default from: "The Boxcar team <support@37signals.com>"
default from: "The BOXCAR team <support@37signals.com>"
layout "mailer"
append_view_path Rails.root.join("app/views/mailers")
+1 -1
View File
@@ -11,6 +11,6 @@ class Notification::BundleMailer < ApplicationMailer
mail \
to: bundle.user.email_address,
subject: "Latest Activity in Boxcar"
subject: "Latest Activity in BOXCAR"
end
end
@@ -1,5 +1,5 @@
<div class="settings__panel settings__panel--entropy panel shadow center">
<h2 class="divider txt-large">Auto close</h2>
<p class="margin-none-block-start">Boxcar doesnt let stale cards stick around forever. Cards automatically close as “Not Now” without activity for specific period of time. <em>This is the default, global setting — you can override it on each board.</em></p>
<p class="margin-none-block-start">BOXCAR doesnt let stale cards stick around forever. Cards automatically close as “Not Now” without activity for specific period of time. <em>This is the default, global setting — you can override it on each board.</em></p>
<%= render "entropy/auto_close", model: account.default_entropy_configuration, url: account_entropy_configuration_path %>
</div>
@@ -1,7 +1,7 @@
<%= turbo_frame_tag @collection, :entropy_configuration do %>
<div class="margin-block-end">
<h2 class="divider txt-large">Auto close</h2>
<p class="margin-none-block-start">Boxcar doesnt let stale cards stick around forever. Cards automatically close as “Not now” if no one updates, comments, or moves a card for…</p>
<p class="margin-none-block-start">BOXCAR doesnt let stale cards stick around forever. Cards automatically close as “Not now” if no one updates, comments, or moves a card for…</p>
<%= render "entropy/auto_close", model: collection, url: collection_entropy_configuration_path(collection) %>
</div>
<% end %>
@@ -1,7 +1,7 @@
<%= turbo_frame_tag @collection, :publication do %>
<header>
<h2 class="divider txt-large">Public link</h2>
<div>Turn on the Public link to share this board with anyone in the world. They wont need to log in and they wont be able to see anything else in Boxcar.</div>
<div>Turn on the Public link to share this board with anyone in the world. They wont need to log in and they wont be able to see anything else in BOXCAR.</div>
</header>
<% if collection.published? %>
+1 -1
View File
@@ -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 Boxcar", 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",
+1 -1
View File
@@ -29,7 +29,7 @@
<iframe
frameborder="0"
src="https://www.youtube.com/embed/kAgUQbD9Wc0?si=IIjKjUIk5PchL0-a"
title="Boxcar Beta orientation"
title="BOXCAR Beta orientation"
allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share"
referrerpolicy="strict-origin-when-cross-origin"
allowfullscreen></iframe>
+1 -1
View File
@@ -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 %>
<span><%= image_tag "logo.png" %></span>
<strong class="txt-medium overflow-ellipsis margin-none">Boxcar</strong>
<strong class="txt-medium overflow-ellipsis margin-none">BOXCAR</strong>
<% end %>
+1 -1
View File
@@ -1,5 +1,5 @@
<%= collapsible_nav_section "Jump to…" do %>
<%= filter_place_menu_item "https://www.youtube.com/watch?v=rNKRdk7DLHM", "Boxcar 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" %>
@@ -3,7 +3,7 @@
<h1 class="title">Everything since <%= @bundle.starts_at.strftime("%-l%P on %A, %B %-d") %></h1>
<p class="subtitle">You have <%= link_to pluralize(@notifications.count, "new notification"), notifications_url %>.</p>
<%= render partial: "notification/bundle_mailer/notification", collection: @notifications, as: :notification %>
<p class="footer">Boxcar emails you about new notifications every few hours. <br>
<p class="footer">BOXCAR emails you about new notifications every few hours. <br>
<%= link_to "Change how often you get these", notifications_settings_url %>
or <%= link_to "unsubscribe from all email notifications", new_notifications_unsubscribe_url(access_token: @unsubscribe_token) %>.
</p>
@@ -4,7 +4,7 @@ You have <%= pluralize @notifications.count, "new notification" %>.
<%= render partial: "notification/bundle_mailer/notification", collection: @notifications, as: :notification %>
--------------------------------------------------------------------------------
Boxcar 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 %>
+1 -1
View File
@@ -24,7 +24,7 @@
<%= render "filters/menu/hotkeys" %>
<div class="margin-block-start-half txt-x-small flex-inline align-center gap-half justify-center txt-subtle">
<span>Boxcar is designed, built, and backed by</span>
<span>BOXCAR is designed, built, and backed by</span>
<strong><%= icon_tag "37signals" %> <a href="https://37signals.com" target="_blank" class="txt-subtle">37signals</a>.</strong>
</div>
@@ -1,10 +1,10 @@
<% unless (platform.chrome? && !platform.ios?) || (platform.firefox? && !platform.android?) %>
<div class="notifications-help pwa__instructions hide-in-pwa">
<h2><%= platform.safari? && platform.desktop? ? "…or install" : "Install " -%> Boxcar as a web app.</h2>
<h2><%= platform.safari? && platform.desktop? ? "…or install" : "Install " -%> BOXCAR as a web app.</h2>
<% case
when platform.edge? %>
<ol>
<li>Click <em><%= icon_tag "install-edge", alt: "the app available - install Boxcar button" %></em>in the address bar.</li>
<li>Click <em><%= icon_tag "install-edge", alt: "the app available - install BOXCAR button" %></em>in the address bar.</li>
<li>Click <em>Install</em>.</li>
</ol>
<% when platform.chrome? && platform.android? %>
@@ -23,13 +23,13 @@
<li>Click <em>Add to Dock…</em>.</li>
</ol>
<% when (platform.safari? || platform.chrome?) && platform.ios? %>
<p>To receive push notifications in <%= platform.browser.capitalize %> for <%= platform.operating_system %>, you must first install Boxcar as a web app.</p>
<p>To receive push notifications in <%= platform.browser.capitalize %> for <%= platform.operating_system %>, you must first install BOXCAR as a web app.</p>
<ol>
<li>Tap <em><%= icon_tag "share", alt: "the share button" %></em></li>
<li>Tap <em>Add to Home Screen</em>.</li>
</ol>
<% else %>
<p>Some platforms require you to install Boxcar as a web app to receive push notifications.</p>
<p>Some platforms require you to install BOXCAR as a web app to receive push notifications.</p>
<% end %>
</div>
<% end %>
@@ -12,19 +12,19 @@
<ol>
<li>Click <em>Start</em>, then <em>Settings</em>.</li>
<li>Go to <em>System &gt; Notification</em>.</li>
<li>Click <em><%= icon_tag "switch", alt: "the toggle button" %></em> <em>ON</em> for Boxcar.</li>
<li>Click <em><%= icon_tag "switch", alt: "the toggle button" %></em> <em>ON</em> for BOXCAR.</li>
</ol>
<% when (platform.firefox? || platform.chrome?) && platform.desktop? %>
<ol>
<% if platform.windows? %>
<li>Click <em>Start</em>, then <em>Settings</em>.</li>
<li>Go to <em>System &gt; Notification</em>.</li>
<li>Click <em><%= icon_tag "switch", alt: "the toggle button" %></em> <em>ON</em> for Boxcar.</li>
<li>Click <em><%= icon_tag "switch", alt: "the toggle button" %></em> <em>ON</em> for BOXCAR.</li>
<% else %>
<li>Click <em aria-label="the Apple menu"></em> in the top left.</li>
<li>Click <em>System Settings…</em>.</li>
<li>Click <em>Notifications</em>.</li>
<li>Click <em>Boxcar</em>.</li>
<li>Click <em>BOXCAR</em>.</li>
<li>Click <em><%= icon_tag "switch", alt: "the allow notifications switch" %></em> to <em>Allow notifications</em>.</li>
<% end %>
</ol>
@@ -33,13 +33,13 @@
<li>Click <em aria-label="the Apple menu"></em> in the top left.</li>
<li>Click <em>System Settings…</em>.</li>
<li>Click <em>Notifications</em>.</li>
<li>Click <em>Boxcar</em>.</li>
<li>Click <em>BOXCAR</em>.</li>
<li>Click <em><%= icon_tag "switch", alt: "the allow notifications switch" %></em> to <em>Allow notifications</em>.</li>
</ol>
<% when (platform.safari? || platform.chrome?) && platform.ios? %>
<ol>
<li>Open the <em><%= icon_tag "gear", aria: { hidden: "true" } %></em> Settings app.</li>
<li>Scroll to and tap <em>Boxcar</em>.</li>
<li>Scroll to and tap <em>BOXCAR</em>.</li>
<li>Tap <em>Notifications</em>.</li>
<li>Tap <em><%= icon_tag "switch", alt: "the allow notifications switch button" %></em> to <em>Allow Notifications</em>.</li>
</ol>
@@ -48,7 +48,7 @@
<li>Open the <em><%= icon_tag "gear", aria: { hidden: "true" } %></em> Settings app.</li>
<li>Tap <em>Notifications</em>.</li>
<li>Tap <em>App notifications</em>.</li>
<li>Scroll to <em>Boxcar</em>.</li>
<li>Scroll to <em>BOXCAR</em>.</li>
<li>Tap <em><%= icon_tag "switch", alt: "the switch" %></em> to <em>Allow Notifications</em>.</li>
</ol>
<% else %>
@@ -1,9 +1,9 @@
<div class="panel margin-block-double center shadow">
<h1 class="font-black txt-x-large margin-none-block-end">Youre unsubscribed</h1>
<p class="margin-block-start-half">Thanks, <%= @user.first_name %>! Boxcar wont 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 %>.</p>
<p class="margin-block-start-half">Thanks, <%= @user.first_name %>! BOXCAR wont 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 %>.</p>
<%= link_to root_path, class: "btn btn--link margin-block-start" do %>
<%= icon_tag "arrow-left" %>
<span>Back to Boxcar</span>
<span>Back to BOXCAR</span>
<% end %>
</div>
+1 -1
View File
@@ -1,5 +1,5 @@
{
"name": "<%= [ Account.sole.name, "Boxcar", 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",
+1 -1
View File
@@ -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 Boxcar", 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",
+3 -3
View File
@@ -1,12 +1,12 @@
<% @page_title = "Choose Account" %>
<div class="panel shadow center margin-block-double" style="--panel-size: 55ch;">
<h1 class="txt-xx-large margin-block-end-double">Boxcar</h1>
<h1 class="txt-xx-large margin-block-end-double">BOXCAR</h1>
<% identity = Identity.find_signed(Current.identity_token.id) %>
<% memberships = identity&.memberships %>
<% if memberships.present? %>
<h2 class="txt-large margin-block-end">Your Boxcar Accounts</h2>
<h2 class="txt-large margin-block-end">Your BOXCAR Accounts</h2>
<ul class="flex flex-column gap txt-large" style="list-style-type: none; padding: 0;">
<% memberships.each do |membership| %>
<li>
@@ -15,6 +15,6 @@
<% end %>
</ul>
<% else %>
<p class="txt-large txt-align-center txt-subtle">You don't have any existing Boxcar accounts.</p>
<p class="txt-large txt-align-center txt-subtle">You don't have any existing BOXCAR accounts.</p>
<% end %>
</div>
+1 -1
View File
@@ -1,7 +1,7 @@
<% @page_title = "Sign in" %>
<div class="panel shadow center margin-block-double <%= "shake" if flash[:alert] %>" style="--panel-size: 55ch;">
<h1 class="txt-xx-large margin-block-end-double">Boxcar</h1>
<h1 class="txt-xx-large margin-block-end-double">BOXCAR</h1>
<%= form_with url: session_path, class: "flex flex-column gap txt-large" do |form| %>
<div class="flex align-center gap">
+1 -1
View File
@@ -10,7 +10,7 @@
<% end %>
<div class="panel shadow center">
<h1 class="margin-none-block-start margin-block-end-double">Boxcar</h1>
<h1 class="margin-none-block-start margin-block-end-double">BOXCAR</h1>
<%= form_with model: @user, url: join_path(params[:join_code]), class: "flex flex-column gap" do |form| %>
<div class="flex align-center gap">
+2 -2
View File
@@ -27,8 +27,8 @@
<%= render partial: "webhooks/webhook", collection: @page.records %>
</ul>
<% else %>
<p>Webhooks can notify another application when something happens in this Boxcar board. Youll choose which events to subscribe to and provide a URL to receive the data.</p>
<p>For example, you could create a webhook that posts to a Campfire chat in Basecamp when new cards are added to Boxcar.</p>
<p>Webhooks can notify another application when something happens in this BOXCAR board. Youll choose which events to subscribe to and provide a URL to receive the data.</p>
<p>For example, you could create a webhook that posts to a Campfire chat in Basecamp when new cards are added to BOXCAR.</p>
<%= link_to new_collection_webhook_path, class: "btn btn--link" do %>
<%= icon_tag "add" %>
<span>Set up a webhook</span>
+1 -1
View File
@@ -23,7 +23,7 @@
<div class="flex flex-column gap-half">
<%= form.label :url do %>
<strong>Payload URL</strong><br>
<p class="margin-none txt-x-small txt-subtle">This is the URL for the app that will receive payloads from Boxcar.</p>
<p class="margin-none txt-x-small txt-subtle">This is the URL for the app that will receive payloads from BOXCAR.</p>
<% end %>
<%= form.url_field :url,
required: true,
@@ -7,7 +7,7 @@ class ControllerAuthenticationTest < ActionDispatch::IntegrationTest
get cards_path
assert_response :success
assert_dom "p", text: "You don't have any existing Boxcar 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
@@ -39,6 +39,6 @@ class Conversation::Message::ResponseGeneratorJobTest < ActiveJob::TestCase
last_message = conversation.messages.ordered.last
assert last_message.assistant?
assert_match(/Boxcar 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