Skip to main content

max / makenotwork

v0.3.4: Landing page copy rewrite, SyncKit validate-app endpoint Tighten index page copy — remove redundant "How creators sell" section, merge payment models into "What you get", trim all feature descriptions. Fix CTA button centering (width: fit-content + margin: auto). Add GET /api/sync/validate-app for in-app API key validation (rate-limited, no auth required). Used by GO, BB, and AF sync setup flows. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Author: Max J. <87768334+MaxJMath@users.noreply.github.com> · 2026-03-19 17:51 UTC
Commit: 4274e3bb2b9ea175e16194fde1be856913e7329d
Parent: 2a3235d
4 files changed, +48 insertions, -43 deletions
@@ -1,6 +1,6 @@
1 1 [package]
2 2 name = "makenotwork"
3 - version = "0.3.3"
3 + version = "0.3.4"
4 4 edition = "2024"
5 5 license-file = "../../LICENSE"
6 6
@@ -13,7 +13,7 @@
13 13 //! on all other sync/device/key/blob endpoints.
14 14
15 15 use axum::{
16 - extract::{Path, State},
16 + extract::{Path, Query, State},
17 17 response::IntoResponse,
18 18 routing::{delete, get, post, put},
19 19 Json, Router,
@@ -49,6 +49,16 @@ struct SyncAuthResponse {
49 49 }
50 50
51 51 #[derive(Deserialize)]
52 + struct ValidateAppQuery {
53 + api_key: String,
54 + }
55 +
56 + #[derive(Serialize)]
57 + struct ValidateAppResponse {
58 + app_name: String,
59 + }
60 +
61 + #[derive(Deserialize)]
52 62 pub struct PushRequest {
53 63 pub device_id: SyncDeviceId,
54 64 pub changes: Vec<ChangeEntry>,
@@ -201,6 +211,22 @@ async fn sync_auth(
201 211 }))
202 212 }
203 213
214 + /// Validate an API key without authentication. Returns the app name on success.
215 + ///
216 + /// `GET /api/sync/validate-app?api_key=xxx` -- no auth required, rate-limited.
217 + #[tracing::instrument(skip_all, name = "synckit::validate_app")]
218 + async fn validate_app(
219 + State(state): State<AppState>,
220 + Query(params): Query<ValidateAppQuery>,
221 + ) -> Result<impl IntoResponse> {
222 + let app = db::synckit::get_sync_app_by_api_key(&state.db, &params.api_key)
223 + .await?
224 + .ok_or(AppError::Unauthorized)?;
225 + Ok(Json(ValidateAppResponse {
226 + app_name: app.name,
227 + }))
228 + }
229 +
204 230 // ── Sync endpoints (JWT auth) ──
205 231
206 232 /// Push encrypted changelog entries from a device.
@@ -871,6 +897,7 @@ pub fn synckit_routes() -> Router<AppState> {
871 897
872 898 let auth_routes = Router::new()
873 899 .route("/api/sync/auth", post(sync_auth))
900 + .route("/api/sync/validate-app", get(validate_app))
874 901 .route_layer(GovernorLayer {
875 902 config: auth_rate_limit,
876 903 });
@@ -2252,8 +2252,8 @@ textarea:focus-visible {
2252 2252 align-items: center;
2253 2253 justify-content: center;
2254 2254 gap: 2rem;
2255 - width: 100%;
2256 - margin: 1.5rem 0 2rem;
2255 + width: fit-content;
2256 + margin: 1.5rem auto 2rem;
2257 2257 }
2258 2258
2259 2259 .landing-values {
@@ -10,7 +10,7 @@
10 10 <h1>Makenot<span class="dot">.</span>work</h1>
11 11 <p class="tagline">Sell creative work for a flat monthly fee<span class="dot">.</span></p>
12 12
13 - <p class="landing-prose">0% platform fee on every sale. Creators pay $10&ndash;40/month based on content type. The only other cost is Stripe's payment processing (~3%).</p>
13 + <p class="landing-prose">0% platform fee. A flat $10&ndash;40/month based on content type, plus Stripe's ~3% processing. Nothing else.</p>
14 14
15 15 <div class="tier-section">
16 16 <h2 class="section-label">Creator tiers</h2>
@@ -18,7 +18,7 @@
18 18 <div class="tier-card">
19 19 <div class="tier-name">Basic</div>
20 20 <div class="tier-price">$10/mo</div>
21 - <div class="tier-desc">Blog posts, written guides, newsletters, forums</div>
21 + <div class="tier-desc">Written posts, guides, newsletters, forums</div>
22 22 </div>
23 23 <div class="tier-card">
24 24 <div class="tier-name">Small Files</div>
@@ -28,7 +28,7 @@
28 28 <div class="tier-card">
29 29 <div class="tier-name">Big Files</div>
30 30 <div class="tier-price">$30/mo</div>
31 - <div class="tier-desc">Video, courses, tutorial series, large archives (coming soon)</div>
31 + <div class="tier-desc">Video, courses, large archives (coming soon)</div>
32 32 </div>
33 33 <div class="tier-card">
34 34 <div class="tier-name">Streaming</div>
@@ -36,69 +36,47 @@
36 36 <div class="tier-desc">Live streaming, VODs, plus everything above (coming soon)</div>
37 37 </div>
38 38 </div>
39 - <a class="section-link" href="/pricing">See the pricing calculator &rarr;</a>
40 - </div>
41 -
42 - <div class="tier-section">
43 - <h2 class="section-label">How creators sell</h2>
44 - <div class="tier-grid">
45 - <div class="tier-card">
46 - <div class="tier-name">Buy Once</div>
47 - <div class="tier-desc">Fixed price or pay-what-you-want. Fans pay once, download forever.</div>
48 - </div>
49 - <div class="tier-card">
50 - <div class="tier-name">Subscription</div>
51 - <div class="tier-desc">Monthly recurring tiers per project. Managed billing via Stripe.</div>
52 - </div>
53 - <div class="tier-card">
54 - <div class="tier-name">Pay-what-you-want</div>
55 - <div class="tier-desc">Set a minimum (or don't). Fans choose what to pay.</div>
56 - </div>
57 - <div class="tier-card">
58 - <div class="tier-name">License Key</div>
59 - <div class="tier-desc">Auto-generated keys with activation limits and machine tracking.</div>
60 - </div>
61 - </div>
39 + <a class="section-link" href="/pricing">Pricing calculator &rarr;</a>
62 40 </div>
63 41
64 42 <div class="tier-section">
65 43 <h2 class="section-label">What you get</h2>
66 44 <div class="feature-grid">
67 45 <div class="feature-card">
68 - <div class="feature-name">Audio, text & downloads</div>
69 - <div class="feature-desc">Upload MP3/WAV/FLAC/OGG, write in Markdown, distribute any file type. Chapters, cover art, versioned downloads.</div>
46 + <div class="feature-name">Sell your way</div>
47 + <div class="feature-desc">One-time purchases, subscriptions, pay-what-you-want, license keys. Promo codes and discounts.</div>
70 48 </div>
71 49 <div class="feature-card">
72 - <div class="feature-name">Subscriptions & license keys</div>
73 - <div class="feature-desc">Monthly tiers per project, auto-generated license keys with activation limits, promo codes and discounts.</div>
50 + <div class="feature-name">Host anything</div>
51 + <div class="feature-desc">Audio, written posts, software, file downloads. Chapters, cover art, versioned releases.</div>
74 52 </div>
75 53 <div class="feature-card">
76 54 <div class="feature-name">Revenue dashboard</div>
77 - <div class="feature-desc">Time-series revenue charts, period comparisons, per-project breakdown, full transaction history.</div>
55 + <div class="feature-desc">Sales charts, period comparisons, per-project breakdowns, transaction history.</div>
78 56 </div>
79 57 <div class="feature-card">
80 58 <div class="feature-name">Audience tools</div>
81 - <div class="feature-desc">Follows, broadcast emails, email notifications (sales, followers, releases, logins). RSS feeds per project.</div>
59 + <div class="feature-desc">Follows, broadcast emails, release notifications. RSS per project.</div>
82 60 </div>
83 61 <div class="feature-card">
84 62 <div class="feature-name">Full data export</div>
85 - <div class="feature-desc">Projects, items, blog posts, sales, and purchases &mdash; downloadable anytime in JSON and CSV.</div>
63 + <div class="feature-desc">Projects, posts, sales, purchases &mdash; JSON and CSV, anytime.</div>
86 64 </div>
87 65 <div class="feature-card">
88 66 <div class="feature-name">Security</div>
89 - <div class="feature-desc">2FA/TOTP, passkeys/WebAuthn, session management, account lockout, password breach checking.</div>
67 + <div class="feature-desc">2FA, passkeys, session management, password breach checking.</div>
90 68 </div>
91 69 </div>
92 - <a class="section-link" href="/docs/01-getting-started">Read the Creator Guide &rarr;</a>
70 + <a class="section-link" href="/docs/01-getting-started">Creator Guide &rarr;</a>
93 71 </div>
94 72
95 73 <div class="tier-section">
96 74 <h2 class="section-label">How it works</h2>
97 75 <ul class="how-list">
98 - <li><strong>0% platform fee</strong> &mdash; Only Stripe's ~3% processing. No percentage cuts, no revenue sharing.</li>
99 - <li><strong>No ads, ever</strong> &mdash; No banners, no tracking pixels, no sponsored placements. Creators keep their pages clean. (You're free to arrange your own sponsorships.)</li>
100 - <li><strong>Month-to-month</strong> &mdash; Cancel anytime, no annual contracts, no setup fees.</li>
101 - <li><strong>Source available</strong> &mdash; Read the codebase. Verify every claim about privacy and data handling.</li>
76 + <li><strong>0% platform fee</strong> &mdash; Stripe's ~3% is the only cost. No cuts.</li>
77 + <li><strong>No ads</strong> &mdash; No banners, no tracking, no sponsored placements.</li>
78 + <li><strong>Month-to-month</strong> &mdash; Cancel anytime. No contracts, no setup fees.</li>
79 + <li><strong>Source available</strong> &mdash; Read the code. Verify every claim.</li>
102 80 </ul>
103 81 <a class="section-link" href="/docs/how-we-work">How the business model works &rarr;</a>
104 82 </div>