Skip to main content

max / makenotwork

Spell the product name Makenotwork everywhere it is displayed brand.md:48 gives one correct spelling and bans MakeNotWork and Make Not Work by name. The site used four: Makenotwork, Makenot.work, MakeNotWork, and in one case the spaced form. Page titles alone split 50/26 between the dotted and undotted forms, so a visitor could see both on adjacent pages. Swept titles, OpenGraph and Twitter cards, JSON-LD, email subjects and bodies, the RSS generator tag, receipts, export headers, embed snippets, the OpenAPI title, the health status page, and the guide, developer, support, tech and about docs. Two things are deliberately left alone. The wordmark in site_header.html renders Makenot<span class="dot">.</span>work, where the dot is the diamond glyph brand.md:35 describes as part of the wordmark, so it stays along with its aria-label and the style.css comment naming it. The seven legal documents keep their current spelling: rewriting the entity name in shipped terms of service, privacy policy and DMCA text is a legal question, not a casing one, and those documents may want the LLC name rather than a brand string. Also untouched: the User-Agent identifier in auth.rs, which brand.md:51 exempts as technical, and which an upstream service may match on.
Co-Authored-By
Claude Opus 5 (1M context) <noreply@anthropic.com>
Author: Max Johnson <me@maxj.phd> · 2026-08-01 20:06 UTC
Signed with PGP, not checked
Commit: c8ff4d2b7817646c5bad9c8a5acdc5efe090fa7e
Parent: 00b234c
112 files changed, +194 insertions, -194 deletions
@@ -46,7 +46,7 @@
46 46 || hit(path, "/logout")
47 47 || hit(path, "/auth") // /auth/me, /auth/2fa, /auth/passkey/*
48 48 || hit(path, "/oauth") // MNW-as-OAuth-provider authorize/token/userinfo
49 - || hit(path, "/sso") // delegated "Sign in with Makenot.work" start + callback
49 + || hit(path, "/sso") // delegated "Sign in with Makenotwork" start + callback
50 50 // Static assets + browser chrome (the login page pulls CSS/JS/images).
51 51 || hit(path, "/static")
52 52 || hit(path, "/rustdoc")
@@ -60,7 +60,7 @@
60 60 /// testnot.work staging mirror so it's reachable only by Fan+/creator
61 61 /// accounts. Off in production.
62 62 pub access_gate: AccessGate,
63 - /// Upstream SSO provider for "Sign in with Makenot.work" (optional). When
63 + /// Upstream SSO provider for "Sign in with Makenotwork" (optional). When
64 64 /// set, the login page becomes a single button that authenticates against
65 65 /// `provider_url`'s OAuth endpoints instead of a local password form, used
66 66 /// on the testnot mirror so a password is only ever entered on production.
@@ -1,4 +1,4 @@
1 - //! MakeNotWork library, shared between the binary and integration tests.
1 + //! Makenotwork library, shared between the binary and integration tests.
2 2 //!
3 3 //! # Design
4 4 //!
@@ -1,4 +1,4 @@
1 - //! OAuth 2.0 scopes for "Log in with Makenot.work".
1 + //! OAuth 2.0 scopes for "Log in with Makenotwork".
2 2 //!
3 3 //! Scopes bound what an access token can do. The security-critical use is that
4 4 //! a token minted for an RP's perk-refresh flow carries only `profile:read` /
@@ -13,7 +13,7 @@
13 13 #[derive(OpenApi)]
14 14 #[openapi(
15 15 info(
16 - title = "MakeNotWork API",
16 + title = "Makenotwork API",
17 17 description = "Creator marketplace API. Only public and stable endpoints are documented.",
18 18 version = env!("CARGO_PKG_VERSION"),
19 19 license(name = "PolyForm Noncommercial 1.0.0"),
@@ -170,7 +170,7 @@
170 170
171 171 let mut raws = Vec::with_capacity(self.competitors.len() + 1);
172 172 raws.push(Raw {
173 - name: "Makenot.work".to_string(),
173 + name: "Makenotwork".to_string(),
174 174 url: String::new(),
175 175 fee_label: format!("{}/mo flat + ~3% processing", fmt_money(tier_cost)),
176 176 is_mnw: true,
@@ -353,7 +353,7 @@
353 353 let r = p.compute(1000.0, 16.0);
354 354 // stripe_net(1000) = 1000 - 29 - 40*0.30 = 959; minus $16 = 943.
355 355 assert_eq!(r.mnw_keep, "$943.00");
356 - assert_eq!(net_of(&r, "Makenot.work"), "$943.00");
356 + assert_eq!(net_of(&r, "Makenotwork"), "$943.00");
357 357 assert_eq!(net_of(&r, "Patreon"), "$861.90"); // 900 - 26.1 - 12
358 358 assert_eq!(net_of(&r, "Gumroad"), "$854.48"); // (900-20) - 25.52
359 359 assert_eq!(net_of(&r, "Bandcamp"), "$825.35"); // 850 - 24.65
@@ -67,7 +67,7 @@
67 67 last_build.to_rfc2822()
68 68 )
69 69 .unwrap();
70 - xml.push_str(" <generator>Makenot.work</generator>\n");
70 + xml.push_str(" <generator>Makenotwork</generator>\n");
71 71
72 72 for item in items {
73 73 xml.push_str(" <item>\n");
@@ -184,7 +184,7 @@
184 184 assert!(xml.contains("<rss version=\"2.0\">"));
185 185 assert!(xml.contains("<channel>"));
186 186 assert!(xml.contains("<title>My Project</title>"));
187 - assert!(xml.contains("<generator>Makenot.work</generator>"));
187 + assert!(xml.contains("<generator>Makenotwork</generator>"));
188 188 assert!(xml.contains("</rss>"));
189 189 }
190 190
@@ -20,6 +20,6 @@
20 20 iframe.src = hostUrl + '/embed/i/' + itemId + '/card?layout=' + layout;
21 21 iframe.width = w;
22 22 iframe.height = h;
23 - code.textContent = '<iframe src="' + hostUrl + '/embed/i/' + itemId + '/card?layout=' + layout + '" width="' + w + '" height="' + h + '" frameborder="0" title="' + itemTitle + ' on Makenot.work"></iframe>';
23 + code.textContent = '<iframe src="' + hostUrl + '/embed/i/' + itemId + '/card?layout=' + layout + '" width="' + w + '" height="' + h + '" frameborder="0" title="' + itemTitle + ' on Makenotwork"></iframe>';
24 24 };
25 25 })();