Skip to main content

max / makenotwork

Strip em dashes and connective dashes from pom logs, server copy, and CSS House-style copy hygiene: replace em/-- dashes with colons/periods in pom task log lines, mailing-list default names, landing carousel captions, the openapi License Keys tag, and carousel CSS comments. Test assertions in mailing_lists updated to match. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Author: Max Johnson <me@maxj.phd> · 2026-07-24 19:43 UTC
Commit: 93e6e41533d24431da80511da98a319f258ad737
Parent: f6fcf93
7 files changed, +18 insertions, -18 deletions
@@ -43,7 +43,7 @@ pub(crate) fn spawn_backup_tasks(
43 43 backup_config.max_age_hours,
44 44 );
45 45 info!(
46 - "{}: backup {} — {} (age: {}h)",
46 + "{}: backup {}, {} (age: {}h)",
47 47 name,
48 48 database,
49 49 result.status,
@@ -39,7 +39,7 @@ pub(crate) fn spawn_tls_tasks(
39 39 let previous = db::get_latest_tls_check(&pool, &name).await.ok().flatten();
40 40 let status = tls::check_tls(&name, &tls_config).await;
41 41 info!(
42 - "{}: TLS {} — {}d remaining",
42 + "{}: TLS {}, {}d remaining",
43 43 name,
44 44 if status.valid { "valid" } else { "invalid" },
45 45 status.days_remaining
@@ -40,7 +40,7 @@ pub(crate) fn spawn_whois_tasks(
40 40 while ticks.next().await {
41 41 let result = whois::check_whois(&name, &whois_config).await;
42 42 info!(
43 - "{}: WHOIS {} — {:?} days remaining",
43 + "{}: WHOIS {}, {:?} days remaining",
44 44 name, whois_config.domain, result.days_remaining
45 45 );
46 46
@@ -184,7 +184,7 @@ pub async fn create_default_lists(
184 184 pool,
185 185 project_id,
186 186 MailingListType::Content,
187 - &format!("{project_title} — Content"),
187 + &format!("{project_title}: Content"),
188 188 Some("New releases and content updates"),
189 189 )
190 190 .await?;
@@ -193,7 +193,7 @@ pub async fn create_default_lists(
193 193 pool,
194 194 project_id,
195 195 MailingListType::Devlog,
196 - &format!("{project_title} — Devlog"),
196 + &format!("{project_title}: Devlog"),
197 197 Some("Development updates and behind-the-scenes"),
198 198 )
199 199 .await?;
@@ -299,21 +299,21 @@ mod tests {
299 299
300 300 #[test]
301 301 fn default_list_name_format_content() {
302 - let name = format!("{} — Content", "My Project");
303 - assert_eq!(name, "My Project — Content");
302 + let name = format!("{}: Content", "My Project");
303 + assert_eq!(name, "My Project: Content");
304 304 }
305 305
306 306 #[test]
307 307 fn default_list_name_format_devlog() {
308 - let name = format!("{} — Devlog", "My Project");
309 - assert_eq!(name, "My Project — Devlog");
308 + let name = format!("{}: Devlog", "My Project");
309 + assert_eq!(name, "My Project: Devlog");
310 310 }
311 311
312 312 #[test]
313 313 fn default_list_names_with_special_chars() {
314 314 let title = "Héllo & World <3>";
315 - assert_eq!(format!("{title} — Content"), "Héllo & World <3> — Content");
316 - assert_eq!(format!("{title} — Devlog"), "Héllo & World <3> — Devlog");
315 + assert_eq!(format!("{title}: Content"), "Héllo & World <3>: Content");
316 + assert_eq!(format!("{title}: Devlog"), "Héllo & World <3>: Devlog");
317 317 }
318 318
319 319 #[test]
@@ -124,7 +124,7 @@ use utoipa::OpenApi;
124 124 crate::routes::synckit::CompleteRotationRequest,
125 125 )),
126 126 tags(
127 - (name = "License Keys", description = "Public license key validation, activation, and deactivation. Stable API — response shapes are frozen."),
127 + (name = "License Keys", description = "Public license key validation, activation, and deactivation. Stable API: response shapes are frozen."),
128 128 (name = "SyncKit", description = "E2E encrypted cloud sync for indie apps. JWT auth via /api/v1/sync/auth, then Bearer token on all other endpoints."),
129 129 ),
130 130 security(
@@ -104,17 +104,17 @@ pub(super) async fn index(
104 104 "/static/images/shots/placeholder-storefront.svg",
105 105 "A creator's storefront on Makenotwork showing their listed items with prices and cover art",
106 106 )
107 - .with_caption("Your storefront — sell anything digital"),
107 + .with_caption("Your storefront: sell anything digital"),
108 108 CarouselFrame::new(
109 109 "/static/images/shots/placeholder-item.svg",
110 110 "An item page with its price, buy button, and download details",
111 111 )
112 - .with_caption("Every sale is yours — 0% platform fee"),
112 + .with_caption("Every sale is yours. 0% platform fee"),
113 113 CarouselFrame::new(
114 114 "/static/images/shots/placeholder-library.svg",
115 115 "A buyer's library listing the files they have purchased, ready to download",
116 116 )
117 - .with_caption("Buyers keep what they bought — one-click export"),
117 + .with_caption("Buyers keep what they bought. One-click export"),
118 118 ];
119 119
120 120 Ok(IndexTemplate {
@@ -11247,9 +11247,9 @@ button.saved { border-color: var(--action); color: var(--action); }
11247 11247 .synckit-gauge-fill--danger { background: var(--danger); }
11248 11248
11249 11249 /* ============================================================================
11250 - Carousel -- composable click-through widget (partials/carousel.html).
11250 + Carousel: composable click-through widget (partials/carousel.html).
11251 11251 One frame visible at a time; viewer-driven (prev/next, dots, arrow keys).
11252 - No autoplay, no slide animation -- frames swap instantly.
11252 + No autoplay, no slide animation; frames swap instantly.
11253 11253 ========================================================================= */
11254 11254
11255 11255 /* Public gallery carousel sections (item + project pages). */
@@ -11364,7 +11364,7 @@ mnw-carousel {
11364 11364 text-align: center;
11365 11365 }
11366 11366
11367 - /* Prev / next -- brutalist offset buttons, vertically centered over the frame. */
11367 + /* Prev / next: brutalist offset buttons, vertically centered over the frame. */
11368 11368 .carousel-nav {
11369 11369 position: absolute;
11370 11370 top: 50%;