Skip to main content

max / makenotwork

docs: update site-docs, server docs, and shared READMEs Documentation refresh accompanying the 2026-06-05 launch-plan wave: site-docs guide/about/legal pages, server architecture/cli docs, multithreaded oauth flow, and docengine/synckit-client docs. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Author: Max Johnson <me@maxj.phd> · 2026-06-07 15:06 UTC
Commit: 3789ab2a5abe8a7160919239eed8157e773fbe18
Parent: a5b918d
20 files changed, +35 insertions, -35 deletions
@@ -178,5 +178,4 @@ All OAuth errors redirect to `/?error={code}`. The error code is a query paramet
178 178 - `src/csrf.rs` -- CSRF token generation, middleware, constant-time comparison
179 179 - `src/internal_auth.rs` -- HMAC-SHA256 auth for MNW-to-MT internal API (separate from OAuth)
180 180 - `src/main.rs` -- session store setup, session layer config, middleware stack
181 - - `deploy/env.hetzner` -- production env vars (hetzner)
182 - - `deploy/env.production` -- production env vars (astra)
181 + - `deploy/deploy-hetzner.sh`, `deploy/deploy.sh` -- deploy scripts (production env vars are provisioned on-server, not committed to the repo)
@@ -344,7 +344,7 @@ Two spawned Tokio tasks, coordinated via `watch::channel` for graceful shutdown:
344 344 | Error types | `src/error.rs` |
345 345 | Authentication | `src/auth.rs` |
346 346 | CSRF middleware | `src/csrf.rs` |
347 - | Database modules | `src/db/` (49 submodules) |
347 + | Database modules | `src/db/` (65 files) |
348 348 | Route modules | `src/routes/` (17 submodules) |
349 349 | Template structs | `src/templates/` |
350 350 | Email service | `src/email/` |
@@ -608,7 +608,7 @@ Per-user staging dirs at `/var/lib/mnw-cli/staging/{user_id}/`. Cleaned up:
608 608
609 609 ## Key Paths
610 610
611 - - Design doc: `docs/mnw/server/cli.md` (this file)
611 + - Design doc: `server/docs/cli.md` (this file)
612 612 - Project code: `mnw-cli/`
613 613 - MNW API routes: `MNW/server/src/routes/api/`
614 614 - MNW SSH key storage: `MNW/server/src/db/` (user_ssh_keys queries)
@@ -8,7 +8,7 @@ What you keep on Makenot.work versus other platforms at $500, $2,000, and $10,00
8 8
9 9 All numbers assume US Stripe rates (2.9% + $0.30) and an **average fan transaction of $10**. Per-transaction cost depends on sale count, not just gross revenue; see [How We Work § The Math](./how-we-work.md#the-math) for the full breakdown. Patreon's row uses their "Pro" tier (8%); their Lite (5%) and Premium (12%) tiers shift the column up and down respectively.
10 10
11 - The Makenot.work range reflects the lowest tier ($16, Basic) at the high end and the highest tier ($60, Everything) at the low end.
11 + The Makenot.work range reflects the lowest tier (${{ tiers.standard.basic }}, Basic) at the high end and the highest tier (${{ tiers.standard.everything }}, Everything) at the low end.
12 12
13 13 ### At $500/month revenue (50 sales × $10)
14 14
@@ -90,7 +90,7 @@ Discovery is driven entirely by fan intent: search, filters, tags, feeds, sortin
90 90 | **Break-even vs 10%** | ~$160-600/mo revenue | N/A | N/A | N/A | N/A |
91 91 | **Break-even vs 8%** | ~$200-750/mo revenue | N/A | N/A | N/A | N/A |
92 92
93 - Break-even is `subscription / platform-percentage`. Below that revenue, the percentage-cut platform costs you less; above it, the flat fee wins and the gap widens with every dollar earned. The ranges above span the Basic tier ($16) at the low end to Everything ($60) at the high end.
93 + Break-even is `subscription / platform-percentage`. Below that revenue, the percentage-cut platform costs you less; above it, the flat fee wins and the gap widens with every dollar earned. The ranges above span the Basic tier (${{ tiers.standard.basic }}) at the low end to Everything (${{ tiers.standard.everything }}) at the high end.
94 94
95 95 ---
96 96
@@ -121,7 +121,7 @@ If you already have your own website, mailing list, file hosting, and audience p
121 121 Be honest about what you need:
122 122
123 123 - **You need algorithmic amplification.** If you have no existing audience and need a platform to surface your work via recommendations, Bandcamp's editorial picks or YouTube's algorithm will serve you better today.
124 - - **You earn under $107/month.** A 10-15% cut costs less than our $16 minimum. itch.io's optional revenue share (including 0%) is hard to beat at small scale.
124 + - **You earn under $107/month.** A 10-15% cut costs less than our ${{ tiers.standard.basic }} minimum. itch.io's optional revenue share (including 0%) is hard to beat at small scale.
125 125 - **You need community features.** If comments, polls, and DMs with fans are core to your model, Patreon has those. We have forums.
126 126 - **You sell physical products.** We don't handle shipping, inventory, or physical fulfillment.
127 127
@@ -131,6 +131,6 @@ We'd rather you pick the right platform than sign up and be disappointed.
131 131
132 132 ## See Also
133 133
134 - - [Platform Economics](./economics.md): What it costs to run, where the money goes
134 + - [Platform Economics](/economics): What it costs to run, where the money goes
135 135 - [Pricing Tiers](../guide/tiers.md): What each tier includes
136 136 - [Our Story](./story.md): Why we built this
@@ -1,6 +1,6 @@
1 1 # Credits
2 2
3 - This page lists the third-party software, services, fonts, and standards Makenotwork is built on, along with their licenses and homepages. Only direct dependencies are enumerated; transitive dependencies (the dependencies of our dependencies) run into the hundreds and aren't listed here. Makenotwork itself ships under PolyForm Noncommercial 1.0.0.
3 + This page lists the third-party software, services, fonts, and standards Makenot.work is built on, along with their licenses and homepages. Only direct dependencies are enumerated; transitive dependencies (the dependencies of our dependencies) run into the hundreds and aren't listed here. Makenot.work itself ships under PolyForm Noncommercial 1.0.0.
4 4
5 5 ---
6 6
@@ -84,7 +84,7 @@ Filters apply to the Discover page, search results, and tag browsing. The tier i
84 84 The tier system is self-reported by creators. We enforce it through:
85 85
86 86 1. **The disclosure statement.** Assisted-tier creators put their AI use in writing. If the product contradicts the disclosure, that is documented misrepresentation.
87 - 2. **Community reports.** Fans and fellow creators can flag items they believe are misclassified by emailing [reports@makenot.work](mailto:reports@makenot.work) with the item URL and what they think the correct tier should be. An in-app report flow is on the roadmap.
87 + 2. **Community reports.** Fans and fellow creators can flag an item they believe is misclassified with the Report link on its page (choose "Mislabeled"). You can also email [reports@makenot.work](mailto:reports@makenot.work) with the item URL and the tier you think it should be.
88 88 3. **Moderation review.** Misrepresenting your tier is treated as fraud. Consequences follow the [Acceptable Use Policy](../legal/acceptable-use.md), up to and including account termination.
89 89
90 90 If you used AI, say so, explain how, and let your audience decide. That is the point of the Assisted tier.
@@ -134,7 +134,7 @@ Prices won't go up unless infrastructure costs force it. If they ever do, we'll
134 134
135 135 ### Where Your Money Goes
136 136
137 - Surplus from creator tier fees funds, in order: operations and infrastructure (~$580/month today), the founder's wage on a flat pay scale that will apply equally to every resident, residency hires after 1.0 ships, reserves, and platform development. No investors taking dividends, no board taking compensation. The residency trains engineers without traditional credentials into full-stack engineers; the goal is graduation, not retention. See [Team](/team) for who's currently on this and [Platform Economics](./economics.md) for the full financial breakdown.
137 + Surplus from creator tier fees funds, in order: operations and infrastructure (~$580/month today), the founder's wage on a flat pay scale that will apply equally to every resident, residency hires after 1.0 ships, reserves, and platform development. No investors taking dividends, no board taking compensation. The residency trains engineers without traditional credentials into full-stack engineers; the goal is graduation, not retention. See [Team](/team) for who's currently on this and [Platform Economics](/economics) for the full financial breakdown.
138 138
139 139 ---
140 140
@@ -152,7 +152,7 @@ Artists, musicians, writers, developers, and makers who:
152 152
153 153 ## See Also
154 154
155 - - [Platform Economics](./economics.md): What it costs to run, where the money goes
155 + - [Platform Economics](/economics): What it costs to run, where the money goes
156 156 - [You're the Merchant of Record](./merchant-of-record.md): What it means, pros and cons, tax tools
157 157 - [Generative AI Policy](./generative-ai.md): Content tiers and disclosure requirements
158 158 - [What We Guarantee](./guarantees.md): Binding commitments, in writing
@@ -132,4 +132,4 @@ That means you make the decisions about pricing, refunds, and how you handle you
132 132 - [Receiving Payouts](../guide/payouts.md): Payout schedules, international payments, tax information
133 133 - [Pricing Tiers](../guide/tiers.md): What each tier costs and includes
134 134 - [What We Guarantee](./guarantees.md): Binding commitments on revenue, data, and pricing
135 - - [Platform Economics](./economics.md): What it costs to run, where the money goes
135 + - [Platform Economics](/economics): What it costs to run, where the money goes
@@ -14,7 +14,7 @@ When a platform takes venture capital, the pressure compounds. Investors need re
14 14
15 15 ## The Alternative
16 16
17 - We charge a flat monthly fee based on what you need to host: $16 for text, $24 for audio and software, $36 for video and large files, $60 for all features, current and future. We take 0% of your revenue. The only deduction from fan payments is the payment processor's fee (~3%), which goes to the processor, not us.
17 + We charge a flat monthly fee based on what you need to host: ${{ tiers.standard.basic }} for text, ${{ tiers.standard.small_files }} for audio and software, ${{ tiers.standard.big_files }} for video and large files, ${{ tiers.standard.everything }} for all features, current and future. We take 0% of your revenue. The only deduction from fan payments is the payment processor's fee (~3%), which goes to the processor, not us.
18 18
19 19 Your tier fee funds the platform. No incentive to take a cut of your sales, show ads to your fans, or lock you in.
20 20
@@ -42,7 +42,7 @@ Your fans are your fans. Your revenue is your revenue. Your data is your data. P
42 42
43 43 - [Team](/team): Who's behind Makenot.work
44 44 - [How We Work](./how-we-work.md): Pricing, payment flow, and data portability
45 - - [Platform Economics](./economics.md): What it costs to run, where the money goes
45 + - [Platform Economics](/economics): What it costs to run, where the money goes
46 46 - [Generative AI Policy](./generative-ai.md): What we mean by generative AI and how content is classified
47 47 - [What We Guarantee](./guarantees.md): Binding commitments, in writing
48 48 - [Roadmap](./roadmap.md): What we're building next
@@ -18,7 +18,7 @@ Your OAuth client ID is the API key of your SyncKit app. Create a SyncKit app fr
18 18
19 19 **Localhost**: `http://127.0.0.1:{port}/...` and `http://localhost:{port}/...` are always allowed without registration. Use these for desktop apps.
20 20
21 - **Remote**: Non-localhost redirect URIs must be registered on your SyncKit app. Contact support to add them.
21 + **Remote**: Non-localhost redirect URIs must be registered on your SyncKit app. Email info@makenot.work to add them.
22 22
23 23 ## Authorization Request
24 24
@@ -107,7 +107,7 @@ Direct relationships mean direct responsibility. When fans reach out, respond. T
107 107 ## See Also
108 108
109 109 - [Pricing Models](../about/pricing.md): Fixed price, PWYW, and memberships
110 - - [Uploading & Downloads](./files.md): File formats and quality
110 + - [Audio Hosting](./audio.md): File formats and quality
111 111 - [Tagging](./tags.md): Organizing your catalog
112 112 - [Analytics & Dashboard](./analytics.md): Understanding your stats
113 113 - [Contact Sharing](./contact-sharing.md): Building direct fan relationships
@@ -168,7 +168,7 @@ You can start shared and transition later: create individual accounts, add them
168 168 After your first publish:
169 169
170 170 1. **Fill out your profile.** Bio, avatar, header image, links. See [Profile](./profile.md).
171 - 2. **Set up security.** Enable two-factor authentication and save your backup codes. See [Security](../tech/security.md).
171 + 2. **Set up security.** Enable two-factor authentication and save your backup codes. See [Security](./security.md).
172 172 3. **Share your link.** Post your profile URL, project URL, or direct purchase link (`/buy/{item_id}`) wherever your audience is. Purchase links are minimal pages optimized for social media and link-in-bio; fans buy in one step without an account. You can also [point your own domain](./custom-domains.md) at your profile.
173 173 4. **Set up RSS cross-posting.** Connect your RSS feed to social media or newsletter tools. See [RSS](./rss.md).
174 174 5. **Fill in metadata.** Good titles, descriptions, tags, and cover art make your content discoverable. See [Metadata](./metadata.md). Per-file size limits depend on your [tier](./tiers.md).
@@ -154,6 +154,6 @@ Deleting an item removes it permanently. Fans who purchased it lose access. Acti
154 154
155 155 - [Projects](./projects.md): Organizing items into projects
156 156 - [Content Overview](./02-content.md): Content types, versions, and chapters in detail
157 - - [Uploading & Downloads](./files.md): File formats and download process
157 + - [Audio Hosting](./audio.md): File formats and download process
158 158 - [Tagging System](./tags.md): Hierarchical tags for organization
159 159 - [Metadata & SEO](./metadata.md): Descriptions and discoverability
@@ -88,6 +88,6 @@ The two things that matter most for discoverability are your **title** and **des
88 88
89 89 ## See Also
90 90
91 - - [Uploading & Downloads](./files.md): File formats and auto-extraction
91 + - [Audio Hosting](./audio.md): File formats and metadata auto-extraction
92 92 - [Tagging System](./tags.md): Hierarchical tag structure and best practices
93 93 - [Items](./items.md): Items, projects, and organization
@@ -65,4 +65,4 @@ Your RSS feed can trigger actions on other platforms:
65 65
66 66 - [Items](./items.md): Creating and managing content
67 67 - [Metadata & SEO](./metadata.md): Feed metadata and discoverability
68 - - [Uploading & Downloads](./files.md): Audio formats and upload process
68 + - [Audio Hosting](./audio.md): Audio formats and upload process
@@ -54,7 +54,7 @@ For platform builds (macOS / Windows / Linux), upload each as a separate version
54 54
55 55 ## License Keys
56 56
57 - For paid software, generate [license keys](./license-keys.md) per purchase. Keys are issued on purchase and visible in the fan's library next to the download link.
57 + For paid software, generate [license keys](../developer/license-keys.md) per purchase. Keys are issued on purchase and visible in the fan's library next to the download link.
58 58
59 59 ---
60 60
@@ -75,5 +75,5 @@ Fans who purchase the item or subscribe to a tier can download the file directly
75 75 - [Audio Hosting](./audio.md)
76 76 - [Video Hosting](./video.md)
77 77 - [Items](./items.md): organizing items and projects
78 - - [License Keys](./license-keys.md): per-purchase keys for paid software
78 + - [License Keys](../developer/license-keys.md): per-purchase keys for paid software
79 79 - [OTA Updates](../developer/ota.md): in-app update polling
@@ -16,14 +16,14 @@ Stripe handles all payments. You're the merchant of record. We don't take a cut
16 16
17 17 When fans buy your content or join a membership:
18 18
19 - 1. Fan pays via Stripe (~2.9% + $0.30 per transaction)
19 + 1. Fan pays via Stripe (~{{ stripe.percent | percent }} + {{ stripe.fixed | money }} per transaction)
20 20 2. Funds go directly to your connected Stripe account
21 21 3. Deposits to your bank on your chosen schedule
22 22 4. We never touch or hold your money
23 23
24 24 ### Platform Membership
25 25
26 - Your monthly Makenot.work membership ($10-60) is separate:
26 + Your monthly Makenot.work membership (${{ tiers.standard.basic }}-${{ tiers.standard.everything }}) is separate:
27 27
28 28 - Billed to your payment method
29 29 - Goes to us for platform access
@@ -19,10 +19,10 @@ Yes. Fan accounts are completely free. You only pay for content you choose to bu
19 19
20 20 Creator tier fees (what you pay to host content):
21 21
22 - - **Basic** ($16/month): Text, blog posts, promo codes, mailing lists
23 - - **Small Files** ($24/month): Everything in Basic, plus audio uploads (MP3, WAV, FLAC, OGG, AAC, AIFF)
24 - - **Big Files** ($36/month): Everything in Small Files, plus video uploads (MP4, WebM, MOV) and larger file limits
25 - - **Everything** ($60/month): All current and future features, first access to new capabilities as they ship
22 + - **Basic** (${{ tiers.standard.basic }}/month): Text, blog posts, promo codes, mailing lists
23 + - **Small Files** (${{ tiers.standard.small_files }}/month): Everything in Basic, plus audio uploads (MP3, WAV, FLAC, OGG, AAC, AIFF)
24 + - **Big Files** (${{ tiers.standard.big_files }}/month): Everything in Small Files, plus video uploads (MP4, WebM, MOV) and larger file limits
25 + - **Everything** (${{ tiers.standard.everything }}/month): All current and future features, first access to new capabilities as they ship
26 26
27 27 See [Pricing Tiers](../guide/tiers.md) for storage limits, per-file size limits, and detailed feature comparisons.
28 28
@@ -30,7 +30,7 @@ See [Pricing Tiers](../guide/tiers.md) for storage limits, per-file size limits,
30 30 Through Stripe. Payments go directly to your connected Stripe account. You control payout timing from your Stripe dashboard.
31 31
32 32 ### What if I earn nothing? Do I still pay?
33 - Yes. The tier fee covers platform access, not a share of revenue. We know $16/month is real money if you're just starting out or making work that doesn't sell in volume. That's a real tension with this model, and we don't pretend otherwise. The tradeoff is that when you do sell, you keep everything. There's no percentage cut that grows as you grow. An [earn-back credit program](../about/roadmap.md#earn-back-credit-program) is on the roadmap to address this. We may also accept applications for fee remission for supported causes and open source work.
33 + Yes. The tier fee covers platform access, not a share of revenue. We know ${{ tiers.standard.basic }}/month is real money if you're just starting out or making work that doesn't sell in volume. That's a real tension with this model, and we don't pretend otherwise. The tradeoff is that when you do sell, you keep everything. There's no percentage cut that grows as you grow. An [earn-back credit program](../about/roadmap.md#earn-back-credit-program) is on the roadmap to address this. We may also accept applications for fee remission for supported causes and open source work.
34 34
35 35 ### What if I don't earn back my membership cost?
36 36 An earn-back credit program is on the [roadmap](../about/roadmap.md#earn-back-credit-program) (expected no later than January 2027): if you earn less on the platform than you paid in tier fees over 12 months, the difference is credited as free months for the following year (capped at 12 months). The 12-month clock starts when the alpha period ends.
@@ -137,7 +137,7 @@ Account info you provide, content you upload, transactions you conduct. No brows
137 137 No. Outside investment means someone eventually needs a return. Returns come from raising fees, adding ads, or selling data. We'd rather stay small and stay honest.
138 138
139 139 ### Will you ever run ads?
140 - No. Ads mean tracking. Tracking means your fans become the product. We'd rather charge you $16/month and leave your audience alone.
140 + No. Ads mean tracking. Tracking means your fans become the product. We'd rather charge you ${{ tiers.standard.basic }}/month and leave your audience alone.
141 141
142 142 ### Will you ever take a cut of revenue?
143 143 No. If we did, we'd be profiting from your success instead of hosting it.
@@ -152,7 +152,7 @@ The payment processor holds funds in your account, not ours. No commingling of c
152 152 <!-- SOP: internal/business/sops/shutdown-notice.md -->
153 153
154 154 ### How long can you sustain this?
155 - Self-funded, no debt, breaks even at ~{{ derived.break_even_standard | ceil }} creators at standard rates, operating costs ~${{ expenses.F_monthly }}/month fixed. If growth is slower than expected, options include voluntary support, reducing scope, or raising revenue through existing tiers. If the platform doesn't prove viable, the [shutdown protocol](../about/guarantees.md#shutdown-protocol) guarantees 90 days notice with full export access. See [Platform Economics](../about/economics.md) for the full cost structure.
155 + Self-funded, no debt, breaks even at ~{{ derived.break_even_standard | ceil }} creators at standard rates, operating costs ~${{ expenses.F_monthly }}/month fixed. If growth is slower than expected, options include voluntary support, reducing scope, or raising revenue through existing tiers. If the platform doesn't prove viable, the [shutdown protocol](../about/guarantees.md#shutdown-protocol) guarantees 90 days notice with full export access. See [Platform Economics](/economics) for the full cost structure.
156 156 <!-- SOP: internal/business/sops/shutdown-notice.md -->
157 157
158 158 ### Is this a full-time operation?
@@ -105,7 +105,7 @@ docengine = { path = "../../MNW/shared/docengine" } # From Apps/
105 105
106 106 | Project | Features used | Preset |
107 107 |---------|--------------|--------|
108 - | MNW | `doc-loader`, `directives`, `frontmatter`, `media-urls` | Permissive (docs/blog), Standard (descriptions) |
108 + | MNW | `doc-loader`, `directives`, `frontmatter`, `media-urls`, `assumptions` | Permissive (docs/blog), Standard (descriptions) |
109 109 | Multithreaded | `mentions`, `quotes` | Strict (forum posts) |
110 110 | GoingsOn | core only | Standard (notes, descriptions) |
111 111 | Balanced Breakfast | core only | Sanitize-only (RSS feed content) |
@@ -14,8 +14,9 @@ Version: 0.3.1.
14 14 ```
15 15 src/
16 16 lib.rs Crate root. Re-exports public types, quick-start doc example.
17 - client.rs SyncKitClient struct and all HTTP methods (auth, push/pull,
18 - blobs, devices, encryption setup). Retry logic and token
17 + client/ SyncKitClient struct and all HTTP methods, split across
18 + submodules (auth, sync, blob, encryption, rotation,
19 + subscribe, subscription, helpers). Retry logic and token
19 20 expiry detection live here.
20 21 crypto.rs Encryption engine. Key derivation (Argon2id), key wrapping
21 22 (XChaCha20-Poly1305), per-entry encrypt/decrypt, blob