Skip to main content

max / makenotwork

Doc fuzz: fix contradictions, standardize terminology, tighten prose Audit and fix all 71 public-facing docs plus 6 new UI examples. Contradictions: fan-guide purchase persistence (forever vs 90-day), SSE event payload (synckit vs sse docs), OAuth token expiry (30d vs 7d), ToS grammar, fan notification self-contradiction, compare.md pricing range ($10-30 to $10-60). Terminology: subscription to membership across 28 files. Reserve "subscription" for item-level only. Remove SLA terminology. Corrections: token expiry docs, audio format lists (add AAC/AIFF), tech/security.md passkeys, Ghost migration transfer claim removed, refund actor clarified, export paths reconciled, htpy.app removed from monitoring, TBD claims centralized to roadmap references. Style: remove all em-dashes (LLM climate), conciseness pass on all 71 docs (net -390 lines), vagueness fixes (blog interval, CoC response time, AI update window, team size). New UI examples: dashboard-stat-cards, ai-tier-badges, tag-typeahead, embed-item-card, dynamic-clip-placement, import-column-mapper. Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Author: Max J. <87768334+MaxJMath@users.noreply.github.com> · 2026-05-08 20:36 UTC
Commit: 3714f0d765bc4e0a064db11d6cc7fcb169988989
Parent: af2aed3
78 files changed, +1205 insertions, -1489 deletions
@@ -3445,7 +3445,7 @@ dependencies = [
3445 3445
3446 3446 [[package]]
3447 3447 name = "makenotwork"
3448 - version = "0.5.6"
3448 + version = "0.5.7"
3449 3449 dependencies = [
3450 3450 "anyhow",
3451 3451 "argon2",
@@ -0,0 +1,14 @@
1 + <div style="display: flex; gap: 1.5rem; align-items: flex-start; flex-wrap: wrap;">
2 + <div style="text-align: center;">
3 + <span class="badge active" style="font-size: 0.85rem; padding: 0.3rem 0.75rem;">Handmade</span>
4 + <div style="font-size: 0.75rem; opacity: 0.6; margin-top: 0.4rem;">No AI tools used</div>
5 + </div>
6 + <div style="text-align: center;">
7 + <span class="badge pending" style="font-size: 0.85rem; padding: 0.3rem 0.75rem;">Assisted</span>
8 + <div style="font-size: 0.75rem; opacity: 0.6; margin-top: 0.4rem; max-width: 140px;">"GPT-4 for chapter outlines. All writing is mine."</div>
9 + </div>
10 + <div style="text-align: center;">
11 + <span class="badge" style="font-size: 0.85rem; padding: 0.3rem 0.75rem; opacity: 0.7;">Generated</span>
12 + <div style="font-size: 0.75rem; opacity: 0.6; margin-top: 0.4rem;">Primarily AI-created</div>
13 + </div>
14 + </div>
@@ -0,0 +1,17 @@
1 + <div class="stats-grid" style="display: grid; grid-template-columns: repeat(3, 1fr); gap: 1rem; max-width: 600px;">
2 + <div class="stat-card">
3 + <div class="stat-label">Revenue</div>
4 + <div class="stat-value">$1,240</div>
5 + <div class="stat-change positive">+12% vs prior period</div>
6 + </div>
7 + <div class="stat-card">
8 + <div class="stat-label">Sales</div>
9 + <div class="stat-value">47</div>
10 + <div class="stat-change positive">+8%</div>
11 + </div>
12 + <div class="stat-card">
13 + <div class="stat-label">Followers</div>
14 + <div class="stat-value">312</div>
15 + <div class="stat-change positive">+5</div>
16 + </div>
17 + </div>
@@ -0,0 +1,17 @@
1 + <div style="max-width: 480px; font-size: 0.85rem;">
2 + <div style="display: flex; align-items: center; gap: 0.5rem; margin-bottom: 0.75rem;">
3 + <span style="font-size: 0.75rem; opacity: 0.6; min-width: 50px;">0:00</span>
4 + <div style="flex: 1; position: relative; height: 32px;">
5 + <div style="position: absolute; left: 0; top: 8px; width: 100%; height: 16px; background: var(--border); opacity: 0.3;"></div>
6 + <div style="position: absolute; left: 0; top: 4px; width: 48px; height: 24px; background: var(--primary-dark); color: var(--primary-light); font-size: 0.7rem; display: flex; align-items: center; justify-content: center;">Pre-roll</div>
7 + <div style="position: absolute; left: 45%; top: 4px; width: 48px; height: 24px; background: var(--primary-dark); color: var(--primary-light); font-size: 0.7rem; display: flex; align-items: center; justify-content: center;">Mid-roll</div>
8 + <div style="position: absolute; right: 0; top: 4px; width: 52px; height: 24px; background: var(--primary-dark); color: var(--primary-light); font-size: 0.7rem; display: flex; align-items: center; justify-content: center;">Post-roll</div>
9 + </div>
10 + <span style="font-size: 0.75rem; opacity: 0.6; min-width: 50px; text-align: right;">4:32</span>
11 + </div>
12 + <div style="display: flex; gap: 0.5rem; margin-left: 58px; font-size: 0.75rem; opacity: 0.6;">
13 + <span>Intro jingle</span>
14 + <span style="margin-left: auto;">at 1:58</span>
15 + <span style="margin-left: 2rem;">Outro CTA</span>
16 + </div>
17 + </div>
@@ -0,0 +1,12 @@
1 + <div style="max-width: 350px; background: var(--surface-muted); overflow: hidden; font-family: inherit;">
2 + <div style="width: 100%; height: 200px; background: var(--border); display: flex; align-items: center; justify-content: center; color: var(--text-muted); font-size: 0.85rem;">Cover Image</div>
3 + <div style="padding: 1rem;">
4 + <div style="font-size: 1.1rem; font-weight: 600; margin-bottom: 0.25rem;">Midnight Frequencies</div>
5 + <div style="font-size: 0.85rem; color: var(--text-muted); margin-bottom: 0.5rem;">by Neon Cascade</div>
6 + <div style="font-size: 0.85rem; margin-bottom: 0.75rem; opacity: 0.8;">A six-track ambient journey through late-night radio static and distant signals.</div>
7 + <div style="display: flex; align-items: center; justify-content: space-between;">
8 + <span style="font-weight: 600;">$8.00</span>
9 + <button class="primary" disabled style="font-size: 0.85rem; padding: 0.4rem 1rem;">Buy</button>
10 + </div>
11 + </div>
12 + </div>
@@ -0,0 +1,33 @@
1 + <div style="max-width: 400px;">
2 + <div style="font-size: 0.85rem; font-weight: 600; margin-bottom: 0.75rem;">Map your columns</div>
3 + <div style="display: flex; align-items: center; gap: 1rem; margin-bottom: 0.5rem;">
4 + <span style="min-width: 100px; font-family: var(--font-mono); font-size: 0.85rem;">Title</span>
5 + <select disabled style="flex: 1; padding: 0.3rem; font-size: 0.85rem;">
6 + <option selected>item_title</option>
7 + </select>
8 + </div>
9 + <div style="display: flex; align-items: center; gap: 1rem; margin-bottom: 0.5rem;">
10 + <span style="min-width: 100px; font-family: var(--font-mono); font-size: 0.85rem;">Email</span>
11 + <select disabled style="flex: 1; padding: 0.3rem; font-size: 0.85rem;">
12 + <option selected>email</option>
13 + </select>
14 + </div>
15 + <div style="display: flex; align-items: center; gap: 1rem; margin-bottom: 0.5rem;">
16 + <span style="min-width: 100px; font-family: var(--font-mono); font-size: 0.85rem;">Amount</span>
17 + <select disabled style="flex: 1; padding: 0.3rem; font-size: 0.85rem;">
18 + <option selected>amount</option>
19 + </select>
20 + </div>
21 + <div style="display: flex; align-items: center; gap: 1rem; margin-bottom: 0.5rem;">
22 + <span style="min-width: 100px; font-family: var(--font-mono); font-size: 0.85rem;">Date</span>
23 + <select disabled style="flex: 1; padding: 0.3rem; font-size: 0.85rem;">
24 + <option selected>date</option>
25 + </select>
26 + </div>
27 + <div style="display: flex; align-items: center; gap: 1rem; margin-bottom: 0.5rem;">
28 + <span style="min-width: 100px; font-family: var(--font-mono); font-size: 0.85rem;">Tier</span>
29 + <select disabled style="flex: 1; padding: 0.3rem; font-size: 0.85rem;">
30 + <option selected>(skip)</option>
31 + </select>
32 + </div>
33 + </div>
@@ -0,0 +1,13 @@
1 + <div style="max-width: 360px;">
2 + <label style="font-size: 0.85rem; font-weight: 600; margin-bottom: 0.25rem; display: block;">Tags</label>
3 + <div class="tag-input">
4 + <span class="tag">Ambient <button disabled>&times;</button></span>
5 + <span class="tag">Drone <button disabled>&times;</button></span>
6 + <input type="text" value="dark" disabled placeholder="Search tags..." style="border: none; background: transparent; flex: 1; min-width: 80px; font-size: 0.85rem; outline: none;">
7 + </div>
8 + <div style="background: var(--surface-muted); border: 1px solid var(--border); padding: 0.25rem 0; font-size: 0.85rem; max-width: 100%;">
9 + <div style="padding: 0.4rem 0.75rem; background: var(--primary-dark); color: var(--primary-light);">Dark Ambient <span style="opacity: 0.6; font-size: 0.75rem;">(Electronic)</span></div>
10 + <div style="padding: 0.4rem 0.75rem;">Dark Wave <span style="opacity: 0.6; font-size: 0.75rem;">(Electronic)</span></div>
11 + <div style="padding: 0.4rem 0.75rem;">Dark Folk <span style="opacity: 0.6; font-size: 0.75rem;">(Folk)</span></div>
12 + </div>
13 + </div>
@@ -12,7 +12,7 @@ All numbers assume US Stripe rates (2.9% + $0.30). Actual rates vary by country
12 12
13 13 | Platform | Platform fee | Processing | You keep |
14 14 |----------|---:|---:|---:|
15 - | **Makenot.work** | $0 (flat $10-30 sub) | ~$29.50 | **$460-470** |
15 + | **Makenot.work** | $0 (flat $10-60 sub) | ~$29.50 | **$410-470** |
16 16 | Bandcamp | 15% = $75 | ~$29.50 | $395 |
17 17 | Gumroad | 10% = $50 | included | $450 |
18 18 | itch.io (default) | 10% = $50 | ~$29.50 | $420 |
@@ -22,7 +22,7 @@ All numbers assume US Stripe rates (2.9% + $0.30). Actual rates vary by country
22 22
23 23 | Platform | Platform fee | Processing | You keep |
24 24 |----------|---:|---:|---:|
25 - | **Makenot.work** | $0 (flat $10-30 sub) | ~$118 | **$1,852-1,872** |
25 + | **Makenot.work** | $0 (flat $10-60 sub) | ~$118 | **$1,822-1,872** |
26 26 | Bandcamp | 15% = $300 | ~$118 | $1,582 |
27 27 | Gumroad | 10% = $200 | included | $1,800 |
28 28 | itch.io (default) | 10% = $200 | ~$118 | $1,682 |
@@ -50,7 +50,7 @@ The flat-fee model becomes more favorable as revenue grows. At $10,000/month, yo
50 50 | Video hosting + player | Yes | No | No | No | Yes |
51 51 | Software versioning + license keys | Yes | No | Yes | Yes | No |
52 52 | Git hosting | Yes | No | No | No | No |
53 - | Subscriptions | Yes | Yes | Yes | No | Yes |
53 + | Memberships | Yes | Yes | Yes | No | Yes |
54 54 | Pay-what-you-want | Yes | Yes | Yes | Yes | No |
55 55 | Data export (full) | Yes | Partial | Yes | No | Partial |
56 56 | RSS feeds | Yes | Yes | No | No | Yes |
@@ -73,7 +73,7 @@ The flat-fee model becomes more favorable as revenue grows. At $10,000/month, yo
73 73 | Editorial/staff picks | No | Yes | No | No | No |
74 74 | Algorithmic recommendations | No | No | No | No | Yes |
75 75
76 - We provide comprehensive discovery tools (search, filters, tags, feeds, sorting) driven entirely by fan intent. We do not use algorithmic recommendations, behavioral tracking, or editorial curation to decide what fans see.
76 + Discovery is driven entirely by fan intent: search, filters, tags, feeds, sorting. No algorithmic recommendations, behavioral tracking, or editorial curation.
77 77
78 78 ---
79 79
@@ -86,7 +86,7 @@ We provide comprehensive discovery tools (search, filters, tags, feeds, sorting)
86 86 | **Processing** | ~3% (Stripe) | ~3% (Stripe) | included in 10% | ~3% | ~3% |
87 87 | **Break-even vs 15%** | ~$67-400/mo revenue | N/A | N/A | N/A | N/A |
88 88
89 - At low revenue (under ~$67/month), percentage-cut platforms cost less because 15% of $50 is $7.50. Above that, flat pricing wins — and the gap widens with every dollar earned.
89 + At low revenue (under ~$67/month), percentage-cut platforms cost less because 15% of $50 is $7.50. Above that, flat pricing wins, and the gap widens with every dollar earned.
90 90
91 91 ---
92 92
@@ -94,23 +94,23 @@ At low revenue (under ~$67/month), percentage-cut platforms cost less because 15
94 94
95 95 Things other platforms offer that we deliberately exclude:
96 96
97 - - **Algorithmic feed** — We show content based on fan choices, not engagement metrics
98 - - **Promoted listings** — No paid placement in search results or discover
99 - - **DRM** — Purchased files are yours, unencrypted, forever
100 - - **Advertising** — No ads on your pages or your fans' experience
101 - - **Behavioral tracking** — No profiles, no fingerprinting, no cross-site tracking
97 + - **Algorithmic feed**: Content shown by fan choices, not engagement metrics
98 + - **Promoted listings**: No paid placement in search or discover
99 + - **DRM**: Purchased files are yours, unencrypted, forever
100 + - **Advertising**: No ads on your pages or your fans' experience
101 + - **Behavioral tracking**: No profiles, no fingerprinting, no cross-site tracking
102 102
103 - These aren't missing features — they're design decisions. See [What We Guarantee](./guarantees.md) for the binding commitments.
103 + These are design decisions, not missing features. See [What We Guarantee](./guarantees.md) for binding commitments.
104 104
105 105 ---
106 106
107 107 ## When We're Not the Right Fit
108 108
109 - Be honest with yourself about what you need:
109 + Be honest about what you need:
110 110
111 - - **You need algorithmic amplification.** If you have no existing audience and need a platform to surface your work to strangers via recommendations, Bandcamp's editorial picks or YouTube's algorithm will serve you better today.
112 - - **You earn under $67/month.** At very low revenue, a 10-15% cut costs less than our $10 minimum subscription. itch.io's optional revenue share (including 0%) is hard to beat at small scale.
113 - - **You need community features.** If comments, polls, and DMs with fans are core to your model, Patreon's built-in community tools are more developed than ours currently.
111 + - **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.
112 + - **You earn under $67/month.** A 10-15% cut costs less than our $10 minimum. itch.io's optional revenue share (including 0%) is hard to beat at small scale.
113 + - **You need community features.** If comments, polls, and DMs with fans are core to your model, Patreon has those. We have forums.
114 114 - **You sell physical products.** We don't handle shipping, inventory, or physical fulfillment.
115 115
116 116 We'd rather you pick the right platform than sign up and be disappointed.
@@ -119,6 +119,6 @@ We'd rather you pick the right platform than sign up and be disappointed.
119 119
120 120 ## See Also
121 121
122 - - [Platform Economics](./economics.md) — What it costs to run, where the money goes
123 - - [Pricing Tiers](../guide/tiers.md) — What each tier includes
124 - - [Our Story](./story.md) — Why we built this
122 + - [Platform Economics](./economics.md): What it costs to run, where the money goes
123 + - [Pricing Tiers](../guide/tiers.md): What each tier includes
124 + - [Our Story](./story.md): Why we built this
@@ -6,13 +6,13 @@ What it costs to run Makenot.work, how creator tier fees cover it, and where the
6 6
7 7 ## Why Publish This
8 8
9 - Most platforms treat their economics as proprietary. We think that's backwards. If you're paying us $10-60/month, you should know what that money does. This page is a plain-language accounting of our cost structure, what it takes to keep the lights on, and what happens with the difference between costs and revenue.
9 + Most platforms treat their economics as proprietary. We think that's backwards. If you're paying us $10-60/month, you should know what that money does.
10 10
11 11 ---
12 12
13 13 ## What It Costs to Run
14 14
15 - Our costs fall into two categories: fixed costs that exist regardless of how many people use the platform, and per-creator costs that scale with each new creator.
15 + Costs fall into two categories: fixed (regardless of user count) and per-creator (scales with each new creator).
16 16
17 17 ### Fixed Costs
18 18
@@ -28,7 +28,7 @@ The range reflects what minimal vs. fully-provisioned operation looks like. At c
28 28
29 29 ### Per-Creator Costs
30 30
31 - Each creator on the platform costs us money to serve — storage, bandwidth, payment processing, and a share of infrastructure load. The amount depends on the tier, because delivering video costs more than delivering audio, which costs more than delivering text.
31 + Each creator costs money to serve. The amount depends on the tier, because delivering video costs more than audio, which costs more than text.
32 32
33 33 | Tier | Your Price | Our Cost | Our Margin |
34 34 |------|-----------|----------|-----------|
@@ -37,37 +37,37 @@ Each creator on the platform costs us money to serve — storage, bandwidth, pay
37 37 | Big Files | $30/mo | $4-9/mo | $21-26/mo |
38 38 | Everything | $60/mo | $5-10/mo | $50-55/mo |
39 39
40 - Costs include storage, CDN, transcoding, and a share of infrastructure load. The ranges reflect that a creator uploading weekly to a large audience costs more than one uploading monthly to a small one.
40 + Costs include storage, CDN, transcoding, and shared infrastructure. The ranges reflect that a creator uploading weekly to a large audience costs more than one uploading monthly to a small one.
41 41
42 - Flat pricing means high-activity creators are subsidized by the average. We think this is fair — your tier fee shouldn't punish you for success. See the [pricing calculator](/pricing) to compare what you'd keep here versus other platforms at any revenue level.
42 + Flat pricing means high-activity creators are subsidized by the average. Your tier fee shouldn't punish you for success. See the [pricing calculator](/pricing) to compare what you'd keep here versus other platforms at any revenue level.
43 43
44 44 ---
45 45
46 46 ## Break-Even
47 47
48 - At current fixed costs (~$600/month), the platform breaks even at roughly **32 creators** with a realistic mix of tiers. Fewer if the mix skews toward higher tiers, more if it skews toward Basic.
48 + At current fixed costs (~$600/month), the platform breaks even at roughly **32 creators** with a realistic tier mix. Fewer if the mix skews toward higher tiers, more if it skews toward Basic.
49 49
50 - Our operating costs are low right now because we're a small team focused on building the platform. As we grow, the primary cost increase will be headcount — hiring people who make the platform meaningfully better for creators. Each new team member should deliver a clear improvement: faster support response, better features, more reliable infrastructure. We're confident in that tradeoff, and we've built the margins to support it without raising prices.
50 + As we grow, the primary cost increase will be headcount: hiring people who make the platform meaningfully better for creators. Each new team member should deliver a clear improvement: faster support, better features, more reliable infrastructure. The margins support this without raising prices.
51 51
52 52 ---
53 53
54 54 ## Where the Surplus Goes
55 55
56 - At any point beyond break-even, the platform generates more in tier fees than it spends on infrastructure. Here is what that surplus funds, in priority order:
56 + Beyond break-even, tier fees exceed infrastructure costs. Here is what the surplus funds, in priority order:
57 57
58 - 1. **A livable wage.** This is a full-time job. The person building and running the platform needs to pay rent and buy groceries. This is the first claim on any surplus, because a platform whose maintainer can't afford to eat is not sustainable.
58 + 1. **A livable wage.** The person building and running the platform needs to pay rent and buy groceries. A platform whose maintainer can't afford to eat is not sustainable.
59 59
60 - 2. **Hiring.** Right now this is a one-person operation. That's a known risk — it's addressed honestly in our [FAQ](../support/faq.md#what-if-the-founder-is-unable-to-run-the-platform). Adding a second person is the top financial priority once the platform has stable membership covering operating costs. After that, the goal is a small team — enough to provide reliable support, faster development, and independent moderation review.
60 + 2. **Hiring.** Right now this is a one-person operation. That's a known risk, addressed honestly in our [FAQ](../support/faq.md#what-if-the-founder-is-unable-to-run-the-platform). Adding a second person is the top priority once membership covers operating costs. After that, the goal is 3-5 people: reliable support, faster development, and independent moderation review.
61 61
62 - 3. **Reserves.** A bad month, a viral spike in CDN costs, or a legal issue shouldn't kill the platform. We maintain reserves to absorb the unexpected without passing it on to you as a price increase.
62 + 3. **Reserves.** A bad month, a viral CDN spike, or a legal issue shouldn't kill the platform. We maintain reserves to absorb the unexpected without passing it on as a price increase.
63 63
64 64 4. **Development.** New features, better infrastructure, improved tools. Everything on the [roadmap](./roadmap.md) costs time and sometimes money.
65 65
66 66 ### Hiring
67 67
68 - The first hires will come through a residency program: we train people who lack programming experience — often from academia — into full-stack engineers by working across the entire codebase. Residents graduate as strong independent engineers; the platform gets maintained by people who understand it deeply.
68 + The first hires will come through a residency program: training people who lack programming experience (often from academia) into full-stack engineers by working across the entire codebase. Residents graduate as strong independent engineers; the platform gets maintained by people who understand it deeply.
69 69
70 - There are no shareholders, no dividends, no investor returns. Surplus goes to labor, training, resilience, and reinvestment.
70 + No shareholders, no dividends, no investor returns. Surplus goes to labor, training, resilience, and reinvestment.
71 71
72 72 ### What Surplus Does Not Fund
73 73
@@ -83,11 +83,9 @@ There are no shareholders, no dividends, no investor returns. Surplus goes to la
83 83
84 84 You might look at the per-creator margin table and think: "You're making $14-16 on my $20 tier fee. That's a 70-80% margin. Isn't that a lot?"
85 85
86 - It is, relative to cost of goods. But those margins fund everything listed above — not just the infrastructure to serve your content, but the salary of the person maintaining the platform, the legal costs of operating a payment-adjacent business, the reserves against a bad quarter, and the development of new features you'll use next year.
86 + It is, relative to cost of goods. But those margins fund everything listed above: the salary of the person maintaining the platform, legal costs of operating a payment-adjacent business, reserves against a bad quarter, and development of features you'll use next year.
87 87
88 - A percentage-cut platform hides this math. When Bandcamp takes 15% of a $10 album sale, you don't see their cost structure — you just see $1.50 disappear. Our model puts the cost on the table: here's what you pay, here's what it costs us, here's where the rest goes.
89 -
90 - We think this is more honest, even when the margins look wide. The alternative is a percentage cut that scales with your success and funds the same things less transparently.
88 + A percentage-cut platform hides this math. When Bandcamp takes 15% of a $10 album sale, you don't see their cost structure. You just see $1.50 disappear. Our model puts the cost on the table: here's what you pay, here's what it costs us, here's where the rest goes. The alternative is a percentage cut that scales with your success and funds the same things less transparently.
91 89
92 90 ---
93 91
@@ -95,7 +93,7 @@ We think this is more honest, even when the margins look wide. The alternative i
95 93
96 94 Makenot.work will never be sold to private equity, a competitor, or any outside buyer. The only future owners of this company are the people who use it.
97 95
98 - We don't have the details yet — the legal structure, the governance model, the transition timeline. These are big decisions that require legal advice and real thought, and we'd rather get them right than announce something premature. What we can commit to now is the boundary: no outside sale, ever. When we're ready to figure out the rest, we'll do it with the community, not behind closed doors.
96 + We don't have the details yet: the legal structure, the governance model, the transition timeline. We'd rather get them right than announce something premature. What we can commit to now: no outside sale, ever. When we're ready to figure out the rest, we'll do it with the community, not behind closed doors.
99 97
100 98 ---
101 99
@@ -103,32 +101,32 @@ We don't have the details yet — the legal structure, the governance model, the
103 101
104 102 The most common way a platform raises prices is that it was never sustainable at its original prices. Ride-sharing companies burned billions in investor money to keep fares artificially low, then raised them once competition was gone. Streaming services launched at a loss to build subscriber counts, then hiked prices once everyone was locked in.
105 103
106 - We are not doing that. Here's why:
104 + We are not doing that.
107 105
108 - **There's no hidden subsidy.** The platform is self-funded from personal savings, not investor money being burned down. Both the founder and the company are completely debt-free — no loans, no lines of credit, no financial obligations beyond operating costs. Current prices cover current costs with room to spare. There is no cliff where the real economics kick in.
106 + **There's no hidden subsidy.** The platform is self-funded from personal savings, not investor money being burned down. Both the founder and the company are completely debt-free: no loans, no lines of credit, no financial obligations beyond operating costs. Current prices cover current costs with room to spare.
109 107
110 - **Margins widen with growth, they don't shrink.** Fixed costs barely move as the creator count grows — the same servers, the same monitoring, the same legal and compliance overhead. Each new creator adds mostly margin. A platform with 500 members costs roughly the same to operate as one with 100, but earns five times as much.
108 + **Margins widen with growth, they don't shrink.** Fixed costs barely move as creator count grows. Each new creator adds mostly margin. A platform with 500 members costs roughly the same to operate as one with 100, but earns five times as much.
111 109
112 - **We don't have the costs that force other platforms to raise prices.** No sales team. No office. No investor returns. No algorithmic infrastructure. No paid user acquisition funnels. These are the line items that eat margins at other companies and eventually get passed to users. We spend money on things like sponsoring events, hackathons, and community programs — but that's a rounding error compared to the growth marketing budgets that force other platforms to raise prices.
110 + **We don't have the costs that force other platforms to raise prices.** No sales team. No office. No investor returns. No algorithmic infrastructure. No paid user acquisition funnels. We spend on sponsoring events, hackathons, and community programs, but that's a rounding error compared to the growth marketing budgets that force other platforms to raise prices.
113 111
114 - **Hiring is funded by the surplus, not by price increases.** The margin between what you pay and what your tier costs to serve is wide enough to fund salaries, reserves, and development at current prices. We don't need more revenue per creator to grow the team — we need more creators at the same price.
112 + **Hiring is funded by the surplus, not by price increases.** The margin between what you pay and what your tier costs to serve is wide enough to fund salaries, reserves, and development at current prices. We need more creators at the same price, not more revenue per creator.
115 113
116 - **Hosting costs trend down, not up.** Storage, bandwidth, and compute have gotten cheaper every year for two decades. CDN pricing is a commodity. Cloud providers compete on price. The long-term trend works in our favor, not against it.
114 + **Hosting costs trend down, not up.** Storage, bandwidth, and compute have gotten cheaper every year for two decades. CDN pricing is a commodity. The long-term trend works in our favor.
117 115
118 - None of this is a guarantee against the unexpected — a payment processor doubling its fees or a regulatory change could force adjustments. But the ordinary pressures that cause platforms to raise prices (growth costs, investor returns, executive compensation, marketing budgets) don't apply here. The model works at current prices with room to grow.
116 + None of this is a guarantee against the unexpected. A payment processor doubling its fees or a regulatory change could force adjustments. But the ordinary pressures that cause platforms to raise prices (growth costs, investor returns, executive compensation, marketing budgets) don't apply here.
119 117
120 118 ---
121 119
122 120 ## Price Stability
123 121
124 - We will not raise prices beyond inflation unless there are substantial changes in the hosting and delivery infrastructure market. The things that would justify a price increase:
122 + We will not raise prices beyond inflation unless there are substantial changes in the hosting and delivery infrastructure market. What would justify a price increase:
125 123
126 124 - Major cloud providers significantly increase storage or bandwidth pricing
127 125 - CDN costs rise due to market consolidation or regulatory changes
128 126 - Payment processors increase their fees in ways we can't absorb
129 127 - New compliance requirements add unavoidable costs
130 128
131 - The things that will never justify a price increase:
129 + What will never justify a price increase:
132 130
133 131 - We want to grow faster
134 132 - We want to hire more people
@@ -140,6 +138,6 @@ If we ever raise prices, we'll give 90 days notice, explain exactly what changed
140 138
141 139 ## See Also
142 140
143 - - [How We Work](./how-we-work.md) — Business model and pricing
144 - - [What We Guarantee](./guarantees.md) — Binding commitments, in writing
145 - - [Roadmap](./roadmap.md) — What we're building next
141 + - [How We Work](./how-we-work.md): Business model and pricing
142 + - [What We Guarantee](./guarantees.md): Binding commitments, in writing
143 + - [Roadmap](./roadmap.md): What we're building next
@@ -6,9 +6,9 @@ How Makenot.work defines generative AI, why it matters, and how it affects what
6 6
7 7 ## Why This Policy Exists
8 8
9 - Most generative AI tools are built on training sets that contain copyrighted work used without permission or payment. Artists, musicians, writers, and developers whose work was scraped to build these models were never asked and never compensated. This policy exists because we think that matters.
9 + Most generative AI tools are built on training sets containing copyrighted work used without permission or payment. Artists, musicians, writers, and developers whose work was scraped to build these models were never asked and never compensated.
10 10
11 - We are not against new tools. We are against tools built on mass uncompensated use of other people's work. If that changes — if models start being trained on properly licensed, compensated datasets — this policy will evolve. Until then, the default is skepticism.
11 + We are not against new tools. We are against tools built on mass uncompensated use of other people's work. If that changes, this policy will evolve. Until then, the default is skepticism.
12 12
13 13 ---
14 14
@@ -19,7 +19,7 @@ On this platform, **generative AI** refers to any tool whose existence depends o
19 19 1. **Not publicly disclosed**, or
20 20 2. **Known to contain copyrighted material used without compensation** to the rights holders
21 21
22 - This includes derivative products — any application, plugin, or service that relies on the API or model weights of a covered tool. If the underlying model is covered, the wrapper is covered. "I didn't use ChatGPT, I used an app that calls the ChatGPT API" is the same thing.
22 + This includes derivative products: any application, plugin, or service that relies on the API or model weights of a covered tool. If the underlying model is covered, the wrapper is covered.
23 23
24 24 ### What this covers
25 25
@@ -42,22 +42,22 @@ The distinction is not about what the tool does. It is about how the tool was bu
42 42
43 43 ## The Three Tiers
44 44
45 - Every item published on Makenot.work must declare one of three tiers. This is required at publish time — there is no unlabeled option.
45 + Every item published on Makenot.work must declare one of three tiers at publish time. There is no unlabeled option.
46 46
47 47 ### Handmade
48 48
49 - No generative AI tools were used at any stage of creating this product — from brainstorming to final output. Traditional digital tools (DAWs, image editors, IDEs, effects processors) are fine. The line is generative AI as defined above.
49 + No generative AI tools were used at any stage, from brainstorming to final output. Traditional digital tools (DAWs, image editors, IDEs, effects processors) are fine.
50 50
51 51 ### Assisted
52 52
53 - This product was created by a human with generative AI tools as part of the process. Choosing this tier requires a **disclosure statement**: a brief, honest explanation of what tools were used, for what purpose, and at what stage. This disclosure is visible to fans on the item page before purchase.
53 + This product was created by a human with generative AI tools as part of the process. Requires a **disclosure statement**: what tools were used, for what purpose, and at what stage. Visible to fans on the item page before purchase.
54 54
55 55 Examples of good disclosure:
56 56 - "I used GPT-4 to help outline the chapter structure. All writing is mine."
57 57 - "Background textures were generated with Stable Diffusion and painted over. Character art and environments are hand-drawn."
58 58 - "Code completion (Copilot) was used during development. Game design, art, and music are original."
59 59
60 - The disclosure must accurately represent the scope of AI use. If you say you used AI for brainstorming but the final product contains AI-generated art, that is misrepresentation and will be treated as fraud under our [Acceptable Use Policy](../legal/acceptable-use.md).
60 + The disclosure must accurately represent the scope of AI use. If the product contradicts the disclosure, that is fraud under our [Acceptable Use Policy](../legal/acceptable-use.md).
61 61
62 62 ### Generated
63 63
@@ -69,11 +69,13 @@ This product was primarily generated by AI tools. The human contribution is dire
69 69
70 70 Fans can filter what they see on the platform:
71 71
72 - - **Handmade only** — only items with no generative AI involvement
73 - - **Human-led** — Handmade and Assisted items (excludes Generated)
74 - - **Everything** — no filter
72 + - **Handmade only**: only items with no generative AI involvement
73 + - **Human-led**: Handmade and Assisted items (excludes Generated)
74 + - **Everything**: no filter
75 75
76 - These filters apply to the Discover page, search results, and tag browsing. The tier is also displayed on every item and project page.
76 + Filters apply to the Discover page, search results, and tag browsing. The tier is also displayed on every item and project page.
77 +
78 + > [!UI] ai-tier-badges
77 79
78 80 ---
79 81
@@ -81,54 +83,54 @@ These filters apply to the Discover page, search results, and tag browsing. The
81 83
82 84 The tier system is self-reported by creators. We enforce it through:
83 85
84 - 1. **The disclosure statement.** Assisted-tier creators put their AI use in writing. If the actual product contradicts the disclosure, that is documented misrepresentation.
86 + 1. **The disclosure statement.** Assisted-tier creators put their AI use in writing. If the product contradicts the disclosure, that is documented misrepresentation.
85 87 2. **Community reports.** Fans and fellow creators can flag items they believe are misclassified.
86 - 3. **Moderation review.** Misrepresenting your tier — particularly claiming Handmade when generative AI was used — is treated as fraud. Consequences follow the [Acceptable Use Policy](../legal/acceptable-use.md), up to and including account termination.
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.
87 89
88 - We would rather have honest disclosure than a platform full of false Handmade claims. If you used AI, say so, explain how, and let your audience decide. That is the point of the Assisted tier.
90 + If you used AI, say so, explain how, and let your audience decide. That is the point of the Assisted tier.
89 91
90 92 ---
91 93
92 94 ## AI in the Platform Itself
93 95
94 - We will never build generative AI tools or features into the product you use. No AI writing assistants, no AI-generated thumbnails, no AI recommendations. The platform you interact with will always be free of generative AI.
96 + We will never build generative AI tools or features into the product. No AI writing assistants, no AI-generated thumbnails, no AI recommendations.
95 97
96 - **Discovery** on Makenot.work follows a principle we call [Discovery Through Exploration](../guide/discovery.md#discovery-through-exploration): everything you see traces back to a choice you made — a search, a follow, a tag, a filter. We do not track your behavior to build a profile, and we do not use machine learning to guess what you might want. The answer to "why am I seeing this?" is always one sentence. The discovery and feed logic is public and readable:
98 + **Discovery** follows [Discovery Through Exploration](../guide/discovery.md#discovery-through-exploration): everything you see traces back to a choice you made. No behavioral tracking, no machine learning. The discovery and feed logic is public and readable:
97 99
98 - - [discover.rs](https://makenot.work/git/max/makenotwork/tree/main/server/src/db/discover.rs) — Search, browse, and all filtering/sorting logic for the Discover page. Uses PostgreSQL trigram matching for fuzzy text search. Sorting is newest, popular (by sales count), or price — no behavioral signals.
99 - - [follows.rs](https://makenot.work/git/max/makenotwork/tree/main/server/src/db/follows.rs) — Feed generation. Your feed shows items from users, projects, and tags you follow, ordered newest first. No algorithmic reordering.
100 - - [tags.rs](https://makenot.work/git/max/makenotwork/tree/main/server/src/db/tags.rs) — Tag facets and hierarchical browsing. Tag counts reflect actual item counts, not weighted relevance.
100 + - [discover.rs](https://makenot.work/git/max/makenotwork/tree/main/server/src/db/discover.rs): Search, browse, and all filtering/sorting logic for the Discover page. Uses PostgreSQL trigram matching for fuzzy text search. Sorting is newest, popular (by sales count), or price; no behavioral signals.
101 + - [follows.rs](https://makenot.work/git/max/makenotwork/tree/main/server/src/db/follows.rs): Feed generation. Your feed shows items from users, projects, and tags you follow, ordered newest first. No algorithmic reordering.
102 + - [tags.rs](https://makenot.work/git/max/makenotwork/tree/main/server/src/db/tags.rs): Tag facets and hierarchical browsing. Tag counts reflect actual item counts, not weighted relevance.
101 103
102 - **Security and spam filtering** are the exception to a blanket no-ML stance. We will always use the best available tools to protect the platform and its users. At the time of writing, our security and spam toolchains do not use LLMs or generative AI, but we reserve the right to adopt whatever keeps the platform safe. We will never use these tools to influence what you see or recommend content.
104 + **Security and spam filtering** are the exception. We reserve the right to adopt whatever keeps the platform safe, though at the time of writing our security toolchain does not use LLMs or generative AI. We will never use these tools to influence what you see or recommend content.
103 105
104 - **Platform development** uses LLM-assisted tooling openly. The founder has been programming since childhood and has always loved writing code. LLMs are used as an acceleration tool — they reduce costs and let a solo developer ship features at a pace that would otherwise require a team. We are transparent about this in our commit history.
106 + **Platform development** uses LLM-assisted tooling openly. LLMs reduce costs and let a solo developer ship features at a pace that would otherwise require a team. This is transparent in our commit history.
105 107
106 - The quality bar is non-negotiable: 1,800+ tests, property-based testing, mutation testing with a 99%+ kill rate, and regular code audits. LLM-generated code is held to the same standard as hand-written code. The goal is a codebase that can stand toe-to-toe with high-quality utility providers in reliability, security, and correctness. If AI-assisted code doesn't meet that bar, it gets rewritten until it does.
108 + The quality bar is non-negotiable: 1,800+ tests, property-based testing, mutation testing with a 99%+ kill rate, and regular code audits. LLM-generated code is held to the same standard as hand-written code. If it doesn't meet that bar, it gets rewritten until it does.
107 109
108 - We think there is a meaningful difference between using these tools to build infrastructure and selling their output as creative work, and our tier system reflects that distinction.
110 + There is a meaningful difference between using these tools to build infrastructure and selling their output as creative work. Our tier system reflects that distinction.
109 111
110 112 A note from the founder:
111 113
112 - > The honest truth is that I would prefer not to use these tools. In my non-legal opinion, they are unethically built. They are also, frankly, mind-numbingly boring. At the same time, they allow a one-person team to build and maintain five products, a server with 80,000 lines of Rust, and comprehensive documentation — all without outside funding. As the codebase grows, their usefulness diminishes in favor of a more hands-on approach as the focus moves from scaffolding to testing and refinement. We will always be honest about what we use on our end. I will always try to be honest about how I feel about those tools. And as always, we would love to someday replace them with tools that we make or that our community makes — tools that are well-built, ethical, and that I can feel good about using.
114 + > The honest truth is that I would prefer not to use these tools. In my non-legal opinion, they are unethically built. They are also, frankly, mind-numbingly boring. At the same time, they allow a one-person team to build and maintain five products, a server with 80,000 lines of Rust, and comprehensive documentation, all without outside funding. As the codebase grows, their usefulness diminishes in favor of a more hands-on approach as the focus moves from scaffolding to testing and refinement. We will always be honest about what we use on our end. I will always try to be honest about how I feel about those tools. And as always, we would love to someday replace them with tools that we make or that our community makes: tools that are well-built, ethical, and that I can feel good about using.
113 115 >
114 - > — Max
116 + > \- Max
115 117
116 118 ---
117 119
118 120 ## This Definition Will Change
119 121
120 - The generative AI landscape moves fast. New models launch, training data disclosures shift, lawsuits settle, licensing norms emerge. This policy is a living document. When we update it, we will:
122 + The generative AI landscape moves fast. This policy is a living document. When we update it, we will:
121 123
122 124 - Publish the change with a version date
123 125 - Explain what changed and why
124 - - Give creators reasonable time to update their tier classifications if the definitions shift
126 + - Give creators at least 30 days to update their tier classifications if the definitions shift
125 127
126 - If a model that is currently covered demonstrates verifiable, fully compensated training data in the future, it may be reclassified. The principle stays the same: we follow the ethics of the training data, not the capabilities of the tool.
128 + If a currently-covered model demonstrates verifiable, fully compensated training data, it may be reclassified. The principle stays the same: we follow the ethics of the training data, not the capabilities of the tool.
127 129
128 130 ---
129 131
130 132 ## See Also
131 133
132 - - [Acceptable Use Policy](../legal/acceptable-use.md) — What happens when rules are broken
133 - - [Our Story](./story.md) — Why this platform exists
134 - - [What We Guarantee](./guarantees.md) — Binding commitments, in writing
134 + - [Acceptable Use Policy](../legal/acceptable-use.md): What happens when rules are broken
135 + - [Our Story](./story.md): Why this platform exists
136 + - [What We Guarantee](./guarantees.md): Binding commitments, in writing
@@ -1,6 +1,6 @@
1 1 # What We Guarantee
2 2
3 - Things we promise, in writing, that you can verify in the code. If we break any of these, you can see it and leave.
3 + Promises you can verify in the code. If we break any, you can see it and leave.
4 4
5 5 ---
6 6
@@ -10,9 +10,9 @@ Things we promise, in writing, that you can verify in the code. If we break any
10 10
11 11 - No platform percentage cut, ever.
12 12 - No transaction fees, payout fees, or skimming.
13 - - This is how it works, not a promotional rate.
13 + - This is the model, not a promotional rate.
14 14
15 - Your $10-60/month covers platform access. Revenue from fans is untouched.
15 + Your $10-60/month covers platform access. Fan revenue is untouched.
16 16
17 17 ---
18 18
@@ -21,7 +21,7 @@ Your $10-60/month covers platform access. Revenue from fans is untouched.
21 21 **Guarantee:** Full export available at any time, completing within minutes.
22 22
23 23 Exports include:
24 - - All uploaded content in the same quality served on the platform (if the platform stores your file as-is, you get the original; if any processing occurs, you get the served version — always keep your own lossless backups of source files)
24 + - All uploaded content in the same quality served on the platform (if the platform stores your file as-is, you get the original; if any processing occurs, you get the served version; always keep your own lossless backups of source files)
25 25 - Complete metadata and organization structure
26 26 - Fan/subscriber list (emails, contact info when fans consent to share)
27 27 - Complete transaction and payment history
@@ -45,9 +45,9 @@ Exports include:
45 45
46 46 **Guarantee:** Creators own their fan relationships.
47 47
48 - At every checkout, fans choose whether to share their email with you. This is opt-in per transaction — fans decide each time. If a fan shares, their email appears in your contact list and is included in exports. If they don't, you see the transaction but not their identity. Fans who don't share contact info can still reach you through the platform (support requests route through Makenot.work). See [Contact Sharing](../guide/contact-sharing.md) for the full details.
48 + At every checkout, fans choose whether to share their email with you (opt-in per transaction). If a fan shares, their email appears in your contact list and exports. If they don't, you see the transaction but not their identity. Fans who don't share can still reach you through the platform. See [Contact Sharing](../guide/contact-sharing.md) for full details.
49 49
50 - If you leave, your fan contact list is yours (export it anytime). See Buyer Access below for what happens to purchased content.
50 + If you leave, your fan contact list is yours (export it anytime). See Buyer Access below for purchased content.
51 51
52 52 ---
53 53
@@ -56,12 +56,12 @@ If you leave, your fan contact list is yours (export it anytime). See Buyer Acce
56 56 **Guarantee:** If a creator deletes their account, fans retain access to content for 90 days.
57 57
58 58 - **One-time purchases:** Items remain downloadable for 90 days after the creator leaves.
59 - - **Subscription content:** Fans with active subscriptions retain access during the same 90-day grace period. Subscriptions are not billed during this period.
59 + - **Membership content:** Fans with active memberships retain access during the same 90-day grace period. Memberships are not billed during this period.
60 60 - After 90 days, content is removed from our servers.
61 61 - Buyers are notified by email when the grace period begins so they can download their files.
62 62 - Transaction records are preserved indefinitely (receipts remain valid).
63 63
64 - This gives fans a reasonable window to retrieve content they paid for, while still allowing creators to fully remove their data from the platform.
64 + This gives fans a reasonable window to retrieve content they paid for while allowing creators to fully remove their data.
65 65
66 66 ---
67 67
@@ -69,7 +69,7 @@ This gives fans a reasonable window to retrieve content they paid for, while sti
69 69
70 70 **Guarantee:** Source code is publicly available for review.
71 71
72 - - Every claim in this document is verifiable by reading the code.
72 + - Every claim in this document is verifiable in the code.
73 73 - Security and privacy practices are auditable.
74 74
75 75 ---
@@ -80,11 +80,11 @@ This gives fans a reasonable window to retrieve content they paid for, while sti
80 80
81 81 1. 90-day advance notice minimum before any service interruption.
82 82 2. Full export access maintained for the entire 90-day notice period.
83 - 3. Data preservation — all content remains accessible for download.
84 - 4. Fan notification — we help communicate the transition to your audience.
83 + 3. Data preservation: all content remains accessible for download.
84 + 4. Fan notification: we help communicate the transition to your audience.
85 85 5. Source code remains available for reference.
86 86
87 - **What it costs to keep the lights on during shutdown:** Platform infrastructure runs on roughly $600/month in fixed costs — a single application server, database, object storage, and DNS. A full 90-day wind-down costs under $2,000 in hosting. Fan payments go directly to creator-controlled Stripe accounts, so there are no pending payouts to settle on our side — Stripe handles that independently. The founder and the company carry zero debt, and the platform is backed by personal savings sufficient to cover years of operation at current costs, with no investors or creditors who could force an early shutdown. A worst-case wind-down is a small, manageable expense — not a financial crisis.
87 + **What it costs to keep the lights on during shutdown:** Fixed costs are ~$600/month; a full 90-day wind-down costs under $2,000 in hosting. Fan payments go directly to creator-controlled Stripe accounts, so there are no pending payouts to settle on our side. The founder and the company carry zero debt, backed by personal savings sufficient to cover years of operation, with no investors or creditors who could force an early shutdown.
88 88
89 89 ---
90 90
@@ -92,17 +92,15 @@ This gives fans a reasonable window to retrieve content they paid for, while sti
92 92
93 93 **What happens if the founder is incapacitated?**
94 94
95 - Makenot.work is currently a one-person operation. We are transparent about this because it is the most common concern creators raise.
96 -
97 - Here is what protects you if something happens to the founder:
95 + Makenot.work is currently a one-person operation. Here is what protects you if something happens to the founder:
98 96
99 97 1. **Your money is safe.** Fan payments go directly to your Stripe account. There is no platform balance to recover.
100 - 2. **Your data is exportable now.** Don't wait for an emergency — export regularly. Your content, metadata, transactions, and contact list are always available for download.
98 + 2. **Your data is exportable now.** Don't wait for an emergency. Export regularly. Your content, metadata, transactions, and contact list are always available for download.
101 99 3. **The source code is public.** The complete codebase is available under the PolyForm Noncommercial license. Anyone can inspect, fork, or reference it.
102 100 4. **Infrastructure is simple.** One server, one database, one object storage bucket. A technically competent person could keep it running or wind it down.
103 101 5. **Daily backups exist offsite.** Database backups are replicated to a separate machine daily.
104 102
105 - The honest answer: if the founder disappeared without warning, the server would continue running on its own (automatic restarts, health monitoring), but no one would be there to respond to issues. The platform would eventually go offline when hosting bills went unpaid. Before that happened, creators would have time to export — and the data would still be in their Stripe accounts regardless.
103 + The honest answer: if the founder disappeared, the server would continue running (automatic restarts, health monitoring), but no one would respond to issues. The platform would eventually go offline when hosting bills went unpaid. Before that, creators would have time to export, and fan payments would still be in their Stripe accounts regardless.
106 104
107 105 Reducing this risk is the top hiring priority once revenue covers operating costs.
108 106
@@ -116,7 +114,7 @@ Reducing this risk is the top hiring priority once revenue covers operating cost
116 114 - Published explanation of the change.
117 115 - Grandfathering of existing creators at their current rate for at least 12 months.
118 116
119 - We have no investor pressure demanding revenue growth. Price changes would only happen if infrastructure costs change dramatically.
117 + No investor pressure demanding revenue growth. Price changes would only happen if infrastructure costs change dramatically.
120 118
121 119 ---
122 120
@@ -124,7 +122,7 @@ We have no investor pressure demanding revenue growth. Price changes would only
124 122
125 123 **Guarantee:** We will never place ads on the platform. Your pages show your content. Fans see what they came for.
126 124
127 - Creators are free to include sponsored segments, affiliate links, or similar arrangements in their own content. That's your business. What we guarantee is that Makenot.work itself will never insert, overlay, or inject advertising into your pages or your fans' experience.
125 + Creators are free to include sponsored segments, affiliate links, or similar arrangements in their own content. What we guarantee is that Makenot.work will never insert, overlay, or inject advertising into your pages or your fans' experience.
128 126
129 127 ---
130 128
@@ -144,12 +142,12 @@ No browsing profiles. No behavioral tracking. No selling data. Verifiable in the
144 142
145 143 **Guarantee:** We target 99.5% uptime (roughly 44 hours of downtime per year or less).
146 144
147 - - Current uptime is published live at [makenot.work/health](https://makenot.work/health), including 24-hour and 7-day percentages.
148 - - The platform is monitored by two independent systems: an internal background monitor with email alerts, and an external monitor (PoM) running on separate infrastructure.
149 - - The server automatically restarts within seconds if a crash occurs.
150 - - Daily database backups are replicated to a separate machine.
145 + - Current uptime published live at [makenot.work/health](https://makenot.work/health), including 24-hour and 7-day percentages.
146 + - Monitored by two independent systems: an internal background monitor with email alerts, and an external monitor (PoM) on separate infrastructure.
147 + - Automatic restart within seconds on crash.
148 + - Daily database backups replicated to a separate machine.
151 149
152 - We are a single-server, single-operator platform. That means we cannot yet guarantee the sub-9-hours-per-year downtime that 99.9% availability requires — that needs redundancy or 24/7 on-call coverage. We are honest about this rather than promising something we can't reliably deliver. See Planned Guarantees below for our path to 99.9%.
150 + As a single-server, single-operator platform, we cannot yet guarantee the sub-9-hours-per-year downtime that 99.9% requires; that needs redundancy or 24/7 on-call coverage. See Planned Guarantees below for our path to 99.9%.
153 151
154 152 ---
155 153
@@ -159,30 +157,30 @@ If you think we've broken any of these:
159 157
160 158 1. **Check the code.** Technical claims are verifiable in the public codebase.
161 159 2. **Check the docs.** This document is versioned and timestamped.
162 - 3. **Leave.** Export your data, take your audience, and cancel. We've made that as easy as possible because we'd rather you be able to leave than feel trapped.
160 + 3. **Leave.** Export your data, take your audience, and cancel. We'd rather you be able to leave than feel trapped.
163 161
164 162 ---
165 163
166 164 ## Planned Guarantees
167 165
168 - The following guarantees are commitments we are building toward. They are not yet active but will become enforceable SLA items once the alpha period ends.
166 + Commitments we are building toward. Not yet active; will become enforceable once the alpha period ends.
169 167
170 168 ### Content Archive
171 169
172 - *Planned — not yet implemented. We intend to build this before leaving beta.*
170 + *Planned, not yet implemented. We intend to build this before leaving beta.*
173 171
174 172 Any content that has existed on the platform for 12 months or more would remain hosted and accessible to fans even if the creator stops paying for their account.
175 173
176 174 - Archived content stays live at its original URLs.
177 175 - Fans who purchased the content retain access.
178 - - The creator cannot upload new content without reactivating their subscription.
176 + - The creator cannot upload new content without reactivating their membership.
179 177 - The creator can still export their data and delete their account at any time.
180 178
181 179 ### 99.9% Availability
182 180
183 181 *One of our targets for officially leaving beta.*
184 182
185 - Reaching 99.9% average uptime (under 9 hours of downtime per year) requires infrastructure changes we are actively working toward: database replication, zero-downtime deployments, and either a second operator or automated failover. We will not claim 99.9% until we can sustain it consistently.
183 + Reaching 99.9% requires database replication, zero-downtime deployments, and either a second operator or automated failover. We will not claim 99.9% until we can sustain it consistently.
186 184
187 185 ### Moderation Appeals
188 186
@@ -198,5 +196,5 @@ If we moderate content or take action on an account:
198 196
199 197 ## See Also
200 198
201 - - [How We Work](./how-we-work.md) — Business model and pricing
202 - - [FAQ](../support/faq.md) — Common questions
199 + - [How We Work](./how-we-work.md): Business model and pricing
200 + - [FAQ](../support/faq.md): Common questions
@@ -7,15 +7,15 @@ Flat fee. All your revenue passes through to you.
7 7 ## For Creators
8 8
9 9 1. **Sign up** and choose a pricing tier ($10-$60/month based on content type)
10 - 2. **Upload content** — text, audio, software, or digital files
10 + 2. **Upload content**: text, audio, software, or digital files
11 11 3. **Organize** using hierarchical tags and projects
12 - 4. **Set pricing** — free, pay-what-you-want, fixed price, or subscription
13 - 5. **Get paid** — 0% platform fee, only payment processing fees
12 + 4. **Set pricing**: free, pay-what-you-want, fixed price, or membership
13 + 5. **Get paid**: 0% platform fee, only payment processing fees
14 14
15 15 ## For Fans
16 16
17 17 1. **Browse** creator pages at `/u/username`
18 - 2. **Purchase or subscribe** to access content
18 + 2. **Purchase or join a membership** to access content
19 19 3. **Download** files directly or stream in-browser
20 20 4. **Build a library** of purchased content
21 21
@@ -40,9 +40,7 @@ We never touch creator revenue. Payments go directly to creator-controlled payme
40 40
41 41 ## The Model
42 42
43 - You pay a monthly tier fee based on content type ($10-60). We take 0% of your fan revenue — the only deduction is the payment processing fee (~3%).
44 -
45 - We're funded by creator tier fees, not by your success. No ads, no percentage cuts, no hidden fees.
43 + You pay a monthly tier fee based on content type ($10-60). We take 0% of your fan revenue. The only deduction is the payment processing fee (~3%). No ads, no percentage cuts, no hidden fees.
46 44
47 45 ### The Math
48 46
@@ -60,8 +58,6 @@ At $50,000/month:
60 58
61 59 The gap widens as you grow. A percentage-cut platform is most expensive exactly when you're doing the best.
62 60
63 - Your tier fee funds the platform. We have no reason to take a cut of your revenue or introduce artificial limits.
64 -
65 61 ---
66 62
67 63 ## Pricing
@@ -75,7 +71,7 @@ Your tier fee funds the platform. We have no reason to take a cut of your revenu
75 71
76 72 All files (content, covers, downloads, supplementary materials) count toward total storage. Big Files and Everything creators can request a per-file size increase beyond 20GB from their dashboard.
77 73
78 - The prices reflect what it actually costs to store and deliver each content type. Use the [pricing calculator](/pricing) to see exactly what you'd keep at any revenue level, with a side-by-side comparison against other platforms.
74 + Prices reflect what it costs to store and deliver each content type. Use the [pricing calculator](/pricing) to see what you'd keep at any revenue level, with a side-by-side comparison against other platforms.
79 75
80 76 ### Choosing Your Tier
81 77
@@ -88,7 +84,7 @@ The prices reflect what it actually costs to store and deliver each content type
88 84 | Video content, courses | Big Files ($30) | 500GB storage, 20GB/file |
89 85 | All of the above + live streaming | Everything ($60) | 500GB storage, 20GB/file |
90 86
91 - *Live streaming is on the roadmap but not yet available. The Everything tier always includes the full feature set — current and future.*
87 + *Live streaming is on the roadmap but not yet available. The Everything tier always includes the full feature set, current and future.*
92 88
93 89 ### What Every Tier Includes
94 90
@@ -102,21 +98,21 @@ The prices reflect what it actually costs to store and deliver each content type
102 98 - RSS feed generation (project + blog feeds)
103 99 - License keys, discount codes, download codes
104 100 - Pay-what-you-want pricing option
105 - - Subscription tiers with automated billing
101 + - Membership tiers with automated billing
106 102 - Follows, broadcast emails, email notifications (sales, followers, releases, logins)
107 103 - 2FA/TOTP, passkeys/WebAuthn, session management, account lockout
108 104
109 105 ### Earn-Back Credit Program
110 106
111 - An earn-back credit program is on the [roadmap](./roadmap.md#earn-back-credit-program). If your revenue doesn't cover your tier fees over 12 months, the difference is credited as free months the following year.
107 + On the [roadmap](./roadmap.md#earn-back-credit-program). If your revenue doesn't cover your tier fees over 12 months, the difference is credited as free months the following year.
112 108
113 109 ### Add-Ons
114 110
115 - Base tiers include all platform software features. Cloud sync, automated email, and DSP distribution have direct infrastructure costs and are available as monthly add-ons at cost. Specific pricing TBD.
111 + Base tiers include all platform software features. Cloud sync, automated email, and DSP distribution have direct infrastructure costs and will be available as monthly add-ons at cost. See the [roadmap](./roadmap.md) for status.
116 112
117 113 ### Billing
118 114
119 - - Monthly billing only — no annual contracts
115 + - Monthly billing only, no annual contracts
120 116 - Cancel anytime, effective immediately
121 117 - No setup fees, no hidden charges
122 118 - Upgrade or downgrade at any time
@@ -133,8 +129,6 @@ Export everything, anytime:
133 129 - Full fan/subscriber list (when fans consent to share contact info)
134 130 - Transaction and payment history
135 131
136 - Your audience is your business. We facilitate the connection; you own it.
137 -
138 132 ### What Leaving Looks Like
139 133
140 134 1. Export your data (instant, complete)
@@ -144,7 +138,7 @@ Your audience is your business. We facilitate the connection; you own it.
144 138
145 139 ### Content Archive Policy
146 140
147 - *Planned — not yet implemented. We intend to build this before leaving beta.*
141 + *Planned, not yet implemented. We intend to build this before leaving beta.*
148 142
149 143 Content that has been on the platform for 12 months or more would stay hosted even if you cancel. Your fans keep access. You just can't upload new content without reactivating. See our [written guarantees](./guarantees.md) for the full commitment.
150 144
@@ -152,25 +146,23 @@ Content that has been on the platform for 12 months or more would stay hosted ev
152 146
153 147 ## Discovery: Intentional
154 148
155 - We built real discovery tools — a [Discover page](/discover) with search, tag browsing, content type filters, and sorting — but none of them track behavior or optimize for engagement. Fans find your work through choices they made: a search they typed, a tag they browsed, a creator they followed. We call this [Discovery Through Exploration](../guide/discovery.md#discovery-through-exploration). The answer to "why am I seeing this?" is always one sentence.
149 + The [Discover page](/discover) has search, tag browsing, content type filters, and sorting, but none of it tracks behavior or optimizes for engagement. Fans find your work through their own choices: a search, a tag, a follow. We call this [Discovery Through Exploration](../guide/discovery.md#discovery-through-exploration).
156 150
157 - There is no recommendation engine, no behavioral profiling, and no paid placement. Visibility comes from good metadata, accurate tags, and consistent publishing — all things within your control. We expect most early creators will bring an existing audience, but search and tag browsing mean new fans can find you too. See [Discovery](../guide/discovery.md) for the full picture.
151 + No recommendation engine, no behavioral profiling, no paid placement. Visibility comes from good metadata, accurate tags, and consistent publishing. See [Discovery](../guide/discovery.md) for the full picture.
158 152
159 153 ---
160 154
161 155 ## Community
162 156
163 - Every project can have a discussion forum powered by [Multithreaded](https://forums.makenot.work) — threaded conversations with no algorithmic sorting, built-in moderation tools, and a public mod log. It's a place for your audience to talk to each other and to you, without a third-party platform owning the conversation.
164 -
165 - The platform-wide forum is where feedback, feature requests, and creator-to-creator discussion happen. See [Forums](../support/forums.md).
157 + Every project can have a discussion forum powered by [Multithreaded](https://forums.makenot.work): threaded conversations with no algorithmic sorting, built-in moderation tools, and a public mod log. The platform-wide forum handles feedback, feature requests, and creator-to-creator discussion. See [Forums](../support/forums.md).
166 158
167 159 ---
168 160
169 161 ## Source Available
170 162
171 - The source code is public. Read it if you want to verify anything we say on this site.
163 + The source code is public. Read it to verify anything we say on this site.
172 164
173 - We use the PolyForm Noncommercial license rather than a permissive license like MIT or GPL. The reason is simple: permissive licenses let corporations take community-built software and use it to compete against the people who made it, without giving anything back. PolyForm Noncommercial means anyone can read, audit, and learn from the code — but no company can clone this platform and run it for profit.
165 + We use the PolyForm Noncommercial license rather than MIT or GPL because permissive licenses let corporations take community-built software and compete against its makers without giving anything back. PolyForm Noncommercial means anyone can read, audit, and learn from the code, but no company can clone this platform for profit.
174 166
175 167 Your content is never used to train AI models. See our [Generative AI Policy](./generative-ai.md) for how we define generative AI and how it affects what's allowed on the platform.
176 168
@@ -178,13 +170,13 @@ Your content is never used to train AI models. See our [Generative AI Policy](./
178 170
179 171 ## Self-Funded
180 172
181 - No outside investors. No debt — the founder and the company both carry a zero balance. Nobody can make us raise prices, add ads, or sell the company. There are no creditors, no loan payments, and no financial obligations beyond operating costs. If we can't sustain this on creator tier fees, we'll wind down honestly — not pivot into something exploitative.
173 + No outside investors. No debt. The founder and the company both carry a zero balance. Nobody can make us raise prices, add ads, or sell the company. If we can't sustain this on creator tier fees, we'll wind down honestly, not pivot into something exploitative.
182 174
183 175 Prices won't go up unless infrastructure costs force it. If they ever do, we'll say exactly what changed, give 90 days notice, and grandfather everyone at their current rate.
184 176
185 177 ### Where Your Money Goes
186 178
187 - Surplus from subscriptions funds, in order: a livable wage for the maintainer, hiring, reserves, and development. The first hires will come through a residency program — training people without traditional credentials into full-stack engineers by working across the real codebase. The goal is graduation, not retention. Your subscription funds real jobs and real training, not a pipeline optimized for people who already have access. See [Platform Economics](./economics.md) for the full breakdown.
179 + Surplus from membership fees funds, in order: a livable wage for the maintainer, hiring, reserves, and development. The first hires will come through a residency program training people without traditional credentials into full-stack engineers. The goal is graduation, not retention. See [Platform Economics](./economics.md) for the full breakdown.
188 180
189 181 ---
190 182
@@ -193,16 +185,16 @@ Surplus from subscriptions funds, in order: a livable wage for the maintainer, h
193 185 Artists, musicians, writers, developers, and makers who:
194 186 - Are tired of platforms that profit more from their work than they do
195 187 - Have an audience (even small) or are building one through other channels
196 - - Want direct relationships with the people who support their work
197 - - Want to own their data, their audience, and their revenue
198 - - Prefer predictable costs over giving up a percentage of every sale
188 + - Want direct relationships with their supporters
189 + - Want to own their data, audience, and revenue
190 + - Prefer predictable costs over percentage cuts
199 191 - Care about privacy and transparency
200 192
201 193 ---
202 194
203 195 ## See Also
204 196
205 - - [Platform Economics](./economics.md) — What it costs to run, where the money goes
206 - - [Generative AI Policy](./generative-ai.md) — Content tiers and disclosure requirements
207 - - [What We Guarantee](./guarantees.md) — Binding commitments, in writing
208 - - [FAQ](../support/faq.md) — Quick answers
197 + - [Platform Economics](./economics.md): What it costs to run, where the money goes
198 + - [Generative AI Policy](./generative-ai.md): Content tiers and disclosure requirements
199 + - [What We Guarantee](./guarantees.md): Binding commitments, in writing
200 + - [FAQ](../support/faq.md): Quick answers
@@ -10,7 +10,7 @@ Everything listed here is live and working.
10 10
11 11 ### Content & Uploads
12 12
13 - - **Audio**: Upload audio files (MP3, WAV, FLAC, OGG), stream in-browser with a custom player, chapter markers with timestamps, cover images
13 + - **Audio**: Upload audio files (MP3, WAV, FLAC, OGG, AAC, AIFF), stream in-browser with a custom player, chapter markers with timestamps, cover images
14 14 - **Text**: Markdown editor with live preview, word count, reading time estimates
15 15 - **Digital downloads**: Versioned file uploads with changelogs, any file type (ZIP, DMG, EXE, etc.)
16 16 - **Projects**: Group items under a project with its own page, slug, description, and category
@@ -27,9 +27,9 @@ Everything listed here is live and working.
27 27
28 28 - **Fixed-price purchases**: One-time payment at a set price
29 29 - **Pay-what-you-want**: Buyer chooses the amount, optional minimum price
30 - - **Subscriptions**: Monthly recurring tiers per project with automated billing (multiple tiers, active/inactive toggle)
30 + - **Memberships**: Monthly recurring tiers per project with automated billing (multiple tiers, active/inactive toggle)
31 31 - **License keys**: Auto-generated on purchase, configurable activation limits, machine tracking, public validation endpoint for software phone-home
32 - - **Promo codes**: Unified code system supporting percentage/fixed discounts, free access grants, and free trial periods for subscriptions. Item-scoped or project-wide, usage limits, expiration dates, auto-apply via URL parameter
32 + - **Promo codes**: Unified code system supporting percentage/fixed discounts, free access grants, and free trial periods for memberships. Item-scoped or project-wide, usage limits, expiration dates, auto-apply via URL parameter
33 33
34 34 ### Discovery & Organization
35 35
@@ -52,7 +52,7 @@ Everything listed here is live and working.
52 52
53 53 ### Creator Dashboard
54 54
55 - - **Project management**: Overview with revenue and sales stats, content tab, blog tab, settings, subscriptions
55 + - **Project management**: Overview with revenue and sales stats, content tab, blog tab, settings, memberships
56 56 - **Item management**: Settings, content editor, versions, tags, license keys, promo codes, chapters
57 57 - **Transactions**: Full purchase and sales history, filterable
58 58 - **Contacts**: View fans who shared their email at purchase, with purchase count and total spent
@@ -66,8 +66,8 @@ Everything listed here is live and working.
66 66
67 67 - **0% platform fee**: Payments go directly to creator-controlled payment accounts
68 68 - **Payment onboarding**: Guided setup, connected account status tracking
69 - - **Creator tier subscriptions**: Monthly billing for Basic ($10), Small Files ($20), Big Files ($30), and Everything ($60) tiers
70 - - **Automated payment handling**: Checkout completion, refunds, subscription updates (active, past due, canceled), renewal billing
69 + - **Creator tier memberships**: Monthly billing for Basic ($10), Small Files ($20), Big Files ($30), and Everything ($60) tiers
70 + - **Automated payment handling**: Checkout completion, refunds, membership updates (active, past due, canceled), renewal billing
71 71 - **Reliable checkout**: Purchases are processed safely with no risk of double-charges
72 72
73 73 ### Security
@@ -84,12 +84,12 @@ Everything listed here is live and working.
84 84 ### Platform
85 85
86 86 - **Source-available codebase**: PolyForm Noncommercial 1.0.0
87 - - **Creator applications**: Apply to create -- most applications approved within a few days
87 + - **Creator applications**: Apply to create; most applications approved within a few days
88 88 - **Admin tools**: Waitlist management, creator approval, suspension/appeal processing, revenue reports, data export
89 89 - **Rich link previews**: Your content shows up properly when shared on social media, search engines, and podcast apps
90 90 - **Documentation**: Creator guide covering the full platform
91 - - **Transactional email**: Password reset, email verification, purchase receipts, subscription updates, sale and follower notifications
92 - - **Community forums**: Per-project discussion forums powered by [Multithreaded](https://forums.makenot.work) — threaded conversations, moderation tools, mod logs, no algorithmic sorting
91 + - **Transactional email**: Password reset, email verification, purchase receipts, membership updates, sale and follower notifications
92 + - **Community forums**: Per-project discussion forums powered by [Multithreaded](https://forums.makenot.work): threaded conversations, moderation tools, mod logs, no algorithmic sorting
93 93 - **Git source browser**: Browse server-hosted repositories with syntax highlighting
94 94 - **SSH git access**: Clone and push to hosted repositories with SSH key authentication
95 95 - **Email-first issue tracker**: File issues and reply via email, close via commit message
@@ -161,9 +161,9 @@ Sponsor tiers, license display, release hosting, build status badges. Git-backed
161 161
162 162 Three levels of storefront customization, all available on every tier:
163 163
164 - 1. **Theme basics** — Modify colors, fonts, and layout options within the default theme
165 - 2. **Custom CSS** — Full CSS override or import on top of the default theme
166 - 3. **Full template access** — Near-complete control over the HTML and CSS of your storefront
164 + 1. **Theme basics**: Modify colors, fonts, and layout options within the default theme
165 + 2. **Custom CSS**: Full CSS override or import on top of the default theme
166 + 3. **Full template access**: Near-complete control over the HTML and CSS of your storefront
167 167
168 168 ### Mobile apps
169 169
@@ -182,8 +182,8 @@ Expand payment options over time. ACH/SEPA payouts, lower-cost processors, micro
182 182 - DRM that punishes paying customers
183 183 - Features that create platform lock-in
184 184 - Attention-harvesting engagement tricks
185 - - Generative AI tools or features for users — no AI writing assistants, no AI-generated recommendations, no AI anything in the product you interact with
186 - - Opaque recommendations — we use [Discovery Through Exploration](../guide/discovery.md#discovery-through-exploration): what you see is always traceable to a choice you made (a search, a follow, a tag), never to a model's guess about what you might engage with
185 + - Generative AI tools or features for users: no AI writing assistants, no AI-generated recommendations, no AI anything in the product you interact with
186 + - Opaque recommendations: we use [Discovery Through Exploration](../guide/discovery.md#discovery-through-exploration): what you see is always traceable to a choice you made (a search, a follow, a tag), never to a model's guess about what you might engage with
187 187
188 188 ---
189 189
@@ -197,5 +197,5 @@ We'd rather build what creators actually need than guess. If something on this p
197 197
198 198 ## See Also
199 199
200 - - [How We Work](./how-we-work.md) — Business model and pricing
201 - - [What We Guarantee](./guarantees.md) — Binding commitments, in writing
200 + - [How We Work](./how-we-work.md): Business model and pricing
201 + - [What We Guarantee](./guarantees.md): Binding commitments, in writing
@@ -6,48 +6,46 @@ Why Makenot.work exists, and what we're doing differently.
6 6
7 7 ## The Problem
8 8
9 - Most creator platforms take a percentage of everything you earn. 10%, 20%, sometimes more. The math is simple and brutal: the better you do, the more they take. A creator earning $10,000/month hands over $1,000 or more to a platform that costs roughly the same to operate whether you earn $100 or $100,000.
9 + Most creator platforms take a percentage of everything you earn. 10%, 20%, sometimes more. The better you do, the more they take. A creator earning $10,000/month hands over $1,000 or more to a platform that costs roughly the same to operate whether you earn $100 or $100,000.
10 10
11 - This model exists because it's profitable, not because it's fair. Platforms are incentivized to maximize your revenue so they can maximize their cut. That's a misalignment baked into the business model.
11 + This model exists because it's profitable, not because it's fair. Platforms are incentivized to maximize your revenue so they can maximize their cut.
12 12
13 - And when a platform takes venture capital, the pressure compounds. Investors need returns. Returns come from raising fees, adding advertising, or selling user data. Every VC-funded platform faces the same eventual question: how do we extract more value? The answer is always at the expense of creators or fans.
13 + When a platform takes venture capital, the pressure compounds. Investors need returns. Returns come from raising fees, adding advertising, or selling user data. The answer is always at the expense of creators or fans.
14 14
15 15 ## The Alternative
16 16
17 - We charge a flat monthly fee based on what you need to host: $10 for text, $20 for audio and software, $30 for video and large files, $60 for live streaming and all current and future features. That's it. 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: $10 for text, $20 for audio and software, $30 for video and large files, $60 for live streaming and all current and future features. 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 - Your tier fee funds the platform. We have no financial incentive to take a cut of your sales, show ads to your fans, or lock you into our ecosystem.
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
21 21 ## Self-Funded
22 22
23 23 Makenot.work is self-funded. No venture capital, no angel investors, no outside money. One person built it, one person runs it.
24 24
25 - Growth is slower. Features take longer. There's no marketing budget, no sales team, no growth hacks.
25 + Growth is slower. Features take longer. No marketing budget, no sales team, no growth hacks.
26 26
27 - But there are also no board meetings about monetization strategy. No pressure to raise prices. No investors pushing for an exit. No acqui-hire that shuts everything down. Prices stay stable, features ship when they're ready, and nobody can force us to make profitable-but-harmful choices.
27 + But there are also no board meetings about monetization strategy. No pressure to raise prices. No investors pushing for an exit. Prices stay stable, features ship when they're ready, and nobody can force us to make profitable-but-harmful choices.
28 28
29 29 If the platform can't sustain itself on creator tier fees, it will wind down honestly, not pivot into something exploitative.
30 30
31 31 ## Source Available
32 32
33 - The source code is publicly available under the PolyForm Noncommercial license. You can read every line. Audit our privacy claims. Verify that we handle data the way we say we do. See exactly what happens when you upload a file, make a purchase, or delete your account.
33 + The source code is publicly available under the PolyForm Noncommercial license. You can read every line, audit our privacy claims, and verify that we handle data the way we say we do.
34 34
35 - When we say "we don't track you" or "your data is exportable," you can check. That's the point.
35 + When we say "we don't track you" or "your data is exportable," you can check.
36 36
37 37 ## What This Means in Practice
38 38
39 - A good platform does three things: hosts your content reliably, processes payments honestly, and stays out of the way. Everything else is the platform serving its own interests, not yours.
39 + A good platform does three things: hosts your content reliably, processes payments honestly, and stays out of the way. Everything else is the platform serving its own interests.
40 40
41 - Your fans are your fans. Your revenue is your revenue. Your data is your data. A platform that respects this doesn't need to take a percentage, because it doesn't pretend to own the relationship between you and the people who support your work.
42 -
43 - Platforms should be infrastructure, not landlords.
41 + Your fans are your fans. Your revenue is your revenue. Your data is your data. Platforms should be infrastructure, not landlords.
44 42
45 43 ---
46 44
47 45 ## See Also
48 46
49 - - [How We Work](./how-we-work.md) — Pricing, payment flow, and data portability
50 - - [Platform Economics](./economics.md) — What it costs to run, where the money goes
51 - - [Generative AI Policy](./generative-ai.md) — What we mean by generative AI and how content is classified
52 - - [What We Guarantee](./guarantees.md) — Binding commitments, in writing
53 - - [Roadmap](./roadmap.md) — What we're building next
47 + - [How We Work](./how-we-work.md): Pricing, payment flow, and data portability
48 + - [Platform Economics](./economics.md): What it costs to run, where the money goes
49 + - [Generative AI Policy](./generative-ai.md): What we mean by generative AI and how content is classified
50 + - [What We Guarantee](./guarantees.md): Binding commitments, in writing
51 + - [Roadmap](./roadmap.md): What we're building next
@@ -12,14 +12,14 @@ Session-authenticated endpoints are designed for the HTMX frontend. When called
12 12
13 13 ### SyncKit JWT
14 14
15 - Used by [SyncKit](./synckit.md) cloud sync and [OTA updates](./ota.md). Obtain a token via `POST /api/sync/auth` (email + password + API key) or the [OAuth2 PKCE flow](./oauth.md). Pass it as `Authorization: Bearer <token>`. Tokens expire after 7 days of inactivity.
15 + Used by [SyncKit](./synckit.md) cloud sync and [OTA updates](./ota.md). Obtain a token via `POST /api/sync/auth` (email + password + API key) or the [OAuth2 PKCE flow](./oauth.md). Pass it as `Authorization: Bearer <token>`. Tokens expire after 7 days.
16 16
17 17 ### No Authentication
18 18
19 19 Public endpoints that require no auth:
20 - - [License Key API](./license-keys.md) — key validation, activation, deactivation
21 - - [OTA update check](./ota.md) — Tauri-compatible update endpoint
22 - - [OAuth authorize](./oauth.md) — authorization page and code exchange
20 + - [License Key API](./license-keys.md): key validation, activation, deactivation
21 + - [OTA update check](./ota.md): Tauri-compatible update endpoint
22 + - [OAuth authorize](./oauth.md): authorization page and code exchange
23 23
24 24 ## Error Format
25 25
@@ -42,11 +42,11 @@ All API errors return JSON:
42 42 | 429 | Rate limit exceeded |
43 43 | 500 | Internal error |
44 44
45 - Internal errors return a generic message — no stack traces or database details are leaked.
45 + Internal errors return a generic message; no stack traces or database details are exposed.
46 46
47 47 ## Rate Limits
48 48
49 - All rate limits are per IP. Check response headers (`X-RateLimit-Limit`, `X-RateLimit-Remaining`) for current values. Exact numbers may change, but the approximate limits are:
49 + All rate limits are per IP. Check response headers (`X-RateLimit-Limit`, `X-RateLimit-Remaining`) for current values. Current limits (subject to change):
50 50
51 51 | Category | Burst | Sustained | Endpoints |
52 52 |----------|-------|-----------|-----------|
@@ -67,8 +67,8 @@ Exceeding a limit returns HTTP 429. Implement exponential backoff in your client
67 67
68 68 ## API Reference
69 69
70 - - [SyncKit Cloud Sync](./synckit.md) — push/pull encrypted data, device management, blob storage
71 - - [OTA Updates](./ota.md) — app auto-update server (Tauri-compatible protocol)
72 - - [OAuth2 PKCE](./oauth.md) — "Log in with Makenot.work"
73 - - [License Key API](./license-keys.md) — validate, activate, and deactivate license keys
74 - - [Rustdoc API Reference](/rustdoc/synckit_client/) — SyncKit client SDK documentation
70 + - [SyncKit Cloud Sync](./synckit.md): push/pull encrypted data, device management, blob storage
71 + - [OTA Updates](./ota.md): app auto-update server (Tauri-compatible protocol)
72 + - [OAuth2 PKCE](./oauth.md): "Log in with Makenot.work"
73 + - [License Key API](./license-keys.md): validate, activate, and deactivate license keys
74 + - [Rustdoc API Reference](/rustdoc/synckit_client/): SyncKit client SDK documentation
@@ -191,11 +191,11 @@ Returns the license text configured by the creator (MIT, Apache 2.0, custom, etc
191 191
192 192 ## Revocation
193 193
194 - Creators can revoke license keys from their dashboard at any time. A revoked key returns `key_revoked` on all validation, status, and verify calls. Revoked keys cannot be reactivated.
194 + Creators can revoke keys from their dashboard. A revoked key returns `key_revoked` on all endpoints and cannot be reactivated.
195 195
196 196 ## PWYW Compatibility
197 197
198 - License keys work with Pay What You Want (PWYW) items. Any customer who completes a purchase — regardless of the amount paid — receives a license key if the creator has keys enabled for that item.
198 + License keys work with Pay What You Want (PWYW) items. Any customer who completes a purchase receives a key if the creator has keys enabled.
199 199
200 200 ## Machine ID Guidelines
201 201
@@ -211,9 +211,7 @@ Good approaches:
211 211
212 212 ## Rate Limits
213 213
214 - License key endpoints are rate-limited per IP. See [API Overview](./api-overview.md) for details.
215 -
216 - Exceeding the limit returns HTTP 429. Implement exponential backoff in your client.
214 + License key endpoints are rate-limited per IP. See [API Overview](./api-overview.md) for current limits.
217 215
218 216 ## Integration Pattern
219 217
@@ -240,5 +238,5 @@ Recommended flow for desktop applications:
240 238
241 239 ## See Also
242 240
243 - - [Pricing & Monetization](../guide/03-selling.md) — License key setup for creators
244 - - [API Overview](./api-overview.md) — Authentication and rate limits
241 + - [Pricing & Monetization](../guide/03-selling.md): License key setup for creators
242 + - [API Overview](./api-overview.md): Authentication and rate limits
@@ -39,7 +39,7 @@ GET /oauth/authorize
39 39 | `response_type` | Yes | Must be `code` |
40 40 | `client_id` | Yes | Your SyncKit app API key |
41 41 | `redirect_uri` | Yes | Where to send the authorization code |
42 - | `state` | Yes | Random string to prevent CSRF — verify it in the callback |
42 + | `state` | Yes | Random string to prevent CSRF; verify it in the callback |
43 43 | `code_challenge` | Yes | Base64url-encoded SHA-256 hash of the code verifier |
44 44 | `code_challenge_method` | Yes | Must be `S256` |
45 45
@@ -72,13 +72,13 @@ Response:
72 72 {
73 73 "access_token": "eyJ...",
74 74 "token_type": "Bearer",
75 - "expires_in": 2592000,
75 + "expires_in": 604800,
76 76 "user_id": "550e8400-...",
77 77 "app_id": "660f9500-..."
78 78 }
79 79 ```
80 80
81 - The authorization code is single-use and consumed atomically. The server verifies `SHA256(code_verifier) == code_challenge` before issuing a token.
81 + The authorization code is single-use. The server verifies `SHA256(code_verifier) == code_challenge` before issuing a token.
82 82
83 83 ## User Info
84 84
@@ -102,7 +102,7 @@ Response:
102 102
103 103 ## PKCE Implementation
104 104
105 - PKCE (Proof Key for Code Exchange) prevents authorization code interception. Here is the flow:
105 + PKCE prevents authorization code interception:
106 106
107 107 1. Generate a random code verifier (43-128 characters, URL-safe)
108 108 2. Compute `code_challenge = BASE64URL(SHA256(code_verifier))`
@@ -129,11 +129,11 @@ let challenge = URL_SAFE_NO_PAD.encode(Sha256::digest(verifier.as_bytes()));
129 129
130 130 The access token works with all SyncKit endpoints:
131 131
132 - - [Cloud Sync](./synckit.md) — push/pull data, manage devices
133 - - [OTA Updates](./ota.md) — manage releases and artifacts
132 + - [Cloud Sync](./synckit.md): push/pull data, manage devices
133 + - [OTA Updates](./ota.md): manage releases and artifacts
134 134 - User info (above)
135 135
136 - Tokens expire after a period of inactivity. After expiration, redirect the user through the authorization flow again.
136 + Tokens expire after 7 days. After expiration, redirect the user through the authorization flow again.
137 137
138 138 ## Error Handling
139 139
@@ -160,5 +160,5 @@ Token exchange errors return JSON:
160 160
161 161 ## See Also
162 162
163 - - [API Overview](./api-overview.md) — authentication methods and rate limits
164 - - [SyncKit Cloud Sync](./synckit.md) — using the token for data sync
163 + - [API Overview](./api-overview.md): authentication methods and rate limits
164 + - [SyncKit Cloud Sync](./synckit.md): using the token for data sync
@@ -106,9 +106,9 @@ GET /api/sync/ota/my-app/darwin/aarch64/1.1.0
106 106
107 107 ### No Update (204)
108 108
109 - Empty response — the current version is already the latest.
109 + Empty response. The current version is already the latest.
110 110
111 - The endpoint compares versions using semver. It only returns an update if the latest release version is strictly greater than `current_version`.
111 + The endpoint returns an update only if the latest release version is strictly greater than `current_version` (semver comparison).
112 112
113 113 ## Download Endpoint
114 114
@@ -156,15 +156,13 @@ Tauri handles the update check, download, signature verification, and restart au
156 156
157 157 ## Signature Verification
158 158
159 - The `signature` field in the release is passed through to the update check response. For Tauri apps, this is the Ed25519 signature produced by `tauri signer sign`. Your app verifies it against the public key embedded at build time.
160 -
161 - For non-Tauri apps, you can use any signature scheme — the server stores and returns the signature without interpretation.
159 + The `signature` field is passed through to the update check response. For Tauri apps, this is the Ed25519 signature from `tauri signer sign`, verified against the public key embedded at build time. For non-Tauri apps, use any signature scheme; the server stores and returns the signature without interpretation.
162 160
163 161 ## Publish Script
164 162
165 - The `deploy/ota-publish.sh` script automates the full publish flow: authenticate, create release, request presigned upload URLs, upload artifacts, and verify. See the script for usage details.
163 + The `deploy/ota-publish.sh` script automates the full publish flow. See the script for usage details.
166 164
167 165 ## See Also
168 166
169 - - [SyncKit Cloud Sync](./synckit.md) — data sync for your app
170 - - [API Overview](./api-overview.md) — authentication and rate limits
167 + - [SyncKit Cloud Sync](./synckit.md): data sync for your app
168 + - [API Overview](./api-overview.md): authentication and rate limits
@@ -20,7 +20,7 @@ event: changed
20 20 data:
21 21 ```
22 22
23 - The event carries no payload. Data content is always encrypted end-to-end and never transmitted over the SSE channel. On receiving a `changed` event, the client should initiate a standard pull to fetch the actual changes.
23 + The event carries no payload (data is always E2E encrypted and never sent over SSE). On receiving `changed`, initiate a pull to fetch actual changes.
24 24
25 25 ## Keepalive
26 26
@@ -78,10 +78,10 @@ This reduces bandwidth and processing when your app only needs a subset of chang
78 78 ## Design Notes
79 79
80 80 - One SSE connection per (app, user) pair
81 - - The broadcast channel buffers up to 16 messages. If a client falls behind, missed events are skipped — the next pull will catch up regardless.
82 - - SSE works through standard HTTP proxies and load balancers. The 30-second keepalive interval is chosen to stay within common proxy timeout defaults.
81 + - The broadcast channel buffers up to 16 messages. If a client falls behind, missed events are skipped. The next pull will catch up regardless.
82 + - SSE works through standard HTTP proxies and load balancers. The 30-second keepalive stays within common proxy timeout defaults.
83 83
84 84 ## See Also
85 85
86 - - [SyncKit Cloud Sync](./synckit.md) — Full sync API reference
87 - - [OAuth2 PKCE](./oauth.md) — Authentication for SyncKit apps
86 + - [SyncKit Cloud Sync](./synckit.md): Full sync API reference
87 + - [OAuth2 PKCE](./oauth.md): Authentication for SyncKit apps
@@ -1,22 +1,20 @@
1 1 # SyncKit Cloud Sync
2 2
3 - SyncKit provides cloud sync and encrypted data storage for desktop applications. It handles device registration, changelog-based sync, end-to-end encryption, and content-addressed blob storage — all through a REST API backed by your Makenot.work account.
3 + SyncKit provides cloud sync and encrypted data storage for desktop applications: device registration, changelog-based sync, E2E encryption, and content-addressed blob storage, all through a REST API backed by your Makenot.work account.
4 4
5 5 For the Rust client SDK, see the [API reference](/rustdoc/synckit_client/).
6 6
7 7 ## Concepts
8 8
9 - - **Sync App** — A registered application on Makenot.work. Each app has its own API key, data namespace, and device list.
10 - - **Device** — A named installation of your app (e.g., "Alice's MacBook"). Each device syncs independently.
11 - - **Changelog** — An append-only log of changes. Each entry records a table name, operation, row ID, timestamp, and encrypted data blob.
12 - - **Cursor** — An opaque position in the changelog. Pull from cursor to get only new changes.
13 - - **Blob** — A content-addressed encrypted file stored in S3. Referenced by SHA-256 hash.
9 + - **Sync App**: A registered application on Makenot.work. Each app has its own API key, data namespace, and device list.
10 + - **Device**: A named installation of your app (e.g., "Alice's MacBook"). Each device syncs independently.
11 + - **Changelog**: An append-only log of changes. Each entry records a table name, operation, row ID, timestamp, and encrypted data blob.
12 + - **Cursor**: An opaque position in the changelog. Pull from cursor to get only new changes.
13 + - **Blob**: A content-addressed encrypted file stored in S3. Referenced by SHA-256 hash.
14 14
15 15 ## Creating a Sync App
16 16
17 - From the Makenot.work dashboard, go to Settings and create a new SyncKit app. You receive an API key — save it securely, it is shown only once. You can regenerate it later, but all existing clients will need to re-authenticate.
18 -
19 - Optionally link the app to a project or item to associate sync data with a specific product.
17 + From the dashboard, go to Settings and create a new SyncKit app. You receive an API key (shown only once; regenerating it invalidates existing clients). Optionally link the app to a project or item.
20 18
21 19 ## Authentication
22 20
@@ -45,11 +43,7 @@ Response:
45 43 }
46 44 ```
47 45
48 - Direct auth does not work for accounts with 2FA enabled — those users must use [OAuth2 PKCE](./oauth.md). OAuth2 PKCE is recommended for all apps as it provides a better UX (browser-based login, no credential handling in the app).
49 -
50 - ### OAuth2 PKCE
51 -
52 - For apps that want browser-based login (recommended for better UX), use the [OAuth2 PKCE flow](./oauth.md). The resulting access token works with all SyncKit endpoints.
46 + Direct auth does not work for accounts with 2FA enabled. [OAuth2 PKCE](./oauth.md) is recommended for all apps (browser-based login, no credential handling). The resulting access token works with all SyncKit endpoints.
53 47
54 48 ## Device Registration
55 49
@@ -126,7 +120,7 @@ Response:
126 120 }
127 121 ```
128 122
129 - The `batch_id` is a UUID for idempotent pushes. If the same `batch_id` is submitted twice, the server returns the existing cursor without re-inserting changes. Always generate a unique `batch_id` per push and retry with the same ID on network failure.
123 + The `batch_id` ensures idempotent pushes. If the same ID is submitted twice, the server returns the existing cursor without re-inserting. Generate a unique `batch_id` per push and retry with the same ID on network failure.
130 124
131 125 Changes per push are capped at 500 (the server returns an error if exceeded). Table names are limited to 100 characters (alphanumeric and underscores only). Row IDs are limited to 255 characters. The server validates device ownership.
132 126
@@ -183,9 +177,7 @@ Response:
183 177
184 178 ## End-to-End Encryption
185 179
186 - SyncKit is designed for E2E encryption. The server stores only encrypted blobs in the `data` field — it never sees plaintext user data.
187 -
188 - The SyncKit client SDK uses ChaCha20-Poly1305 for data encryption and Argon2 for key derivation. The encrypted master key envelope is stored server-side so users can set up new devices without re-entering a passphrase.
180 + The server stores only encrypted blobs in the `data` field; it never sees plaintext user data. The client SDK uses ChaCha20-Poly1305 for encryption and Argon2 for key derivation. The encrypted master key envelope is stored server-side so users can set up new devices without re-entering a passphrase.
189 181
190 182 ### Key Storage
191 183
@@ -219,7 +211,7 @@ Maximum key size: 4KB. Returns 404 if no key has been stored yet.
219 211
220 212 ## Blob Storage
221 213
222 - Content-addressed blob storage for files, images, and other binary data. Blobs are stored in S3 and deduplicated by hash.
214 + Content-addressed blob storage in S3, deduplicated by hash.
223 215
224 216 ### Upload Flow
225 217
@@ -245,7 +237,7 @@ Response:
245 237 }
246 238 ```
247 239
248 - If `already_exists` is `true`, the blob is already stored — skip the upload.
240 + If `already_exists` is `true`, the blob is already stored. Skip the upload.
249 241
250 242 2. Upload the file directly to the presigned URL (PUT request to S3).
251 243
@@ -288,7 +280,7 @@ The download URL is a presigned S3 URL valid for a limited time.
288 280
289 281 ## Real-Time Notifications (SSE)
290 282
291 - Instead of polling for changes, your app can subscribe to Server-Sent Events. The server pushes a notification whenever another device in the same app+user namespace pushes changes.
283 + Subscribe to Server-Sent Events instead of polling. The server pushes a notification when another device pushes changes.
292 284
293 285 ```
294 286 GET /api/sync/subscribe
@@ -299,7 +291,7 @@ This is a long-lived SSE connection. Events:
299 291
300 292 | Event | Data | Meaning |
301 293 |-------|------|---------|
302 - | `changed` | `{"cursor": "..."}` | Another device pushed changes. Pull from cursor to catch up. |
294 + | `changed` | `{}` | Another device pushed changes. Call pull to catch up. |
303 295
304 296 Recommended pattern:
305 297
@@ -310,9 +302,9 @@ Recommended pattern:
310 302
311 303 ## Key Rotation
312 304
313 - If you need to rotate your app's encryption key (e.g., after a suspected compromise), SyncKit provides a multi-step rotation flow:
305 + Multi-step key rotation (e.g., after a suspected compromise):
314 306
315 - 1. **Begin rotation** — Store the new encrypted key alongside the old one:
307 + 1. **Begin rotation**: Store the new encrypted key alongside the old one:
316 308
317 309 ```
318 310 POST /api/sync/keys/rotate/begin
@@ -322,7 +314,7 @@ Content-Type: application/json
322 314 { "new_encrypted_key": "<base64>" }
323 315 ```
324 316
325 - 2. **Fetch entries to re-encrypt** — Pull changelog entries encrypted with the old key:
317 + 2. **Fetch entries to re-encrypt**: Pull changelog entries encrypted with the old key:
326 318
327 319 ```
328 320 POST /api/sync/keys/rotate/entries
@@ -332,7 +324,7 @@ Content-Type: application/json
332 324 { "cursor": "...", "limit": 100 }
333 325 ```
334 326
335 - 3. **Submit re-encrypted batch** — Upload entries re-encrypted with the new key:
327 + 3. **Submit re-encrypted batch**: Upload entries re-encrypted with the new key:
336 328
337 329 ```
338 330 POST /api/sync/keys/rotate/batch
@@ -342,26 +334,21 @@ Content-Type: application/json
342 334 { "entries": [...] }
343 335 ```
344 336
345 - 4. **Complete rotation** — Finalize once all entries are re-encrypted:
337 + 4. **Complete rotation**: Finalize once all entries are re-encrypted:
346 338
347 339 ```
348 340 POST /api/sync/keys/rotate/complete
349 341 Authorization: Bearer <token>
350 342 ```
351 343
352 - During rotation, other devices pulling changes may receive a mix of old-key and new-key entries. Clients should be prepared to decrypt with both keys until rotation completes.
353 -
354 - ## Subscription Gating
355 -
356 - Some apps require an active subscription to use SyncKit sync features. This is configured per app:
344 + During rotation, clients may receive a mix of old-key and new-key entries. Be prepared to decrypt with both keys until rotation completes.
357 345
358 - - Apps linked to a free item (or no item) have unrestricted sync access
359 - - Apps linked to a paid item or subscription tier require an active purchase or subscription
346 + ## Membership Gating
360 347
361 - If the user's subscription lapses, push and pull requests return `403` with an error indicating the subscription requirement. Device registration and key storage remain accessible.
348 + Configured per app. Apps linked to a free item (or no item) have unrestricted sync access. Apps linked to a paid item or membership tier require an active purchase or membership. If the membership lapses, push/pull return `403`. Device registration and key storage remain accessible.
362 349
363 350 ## See Also
364 351
365 - - [OTA Updates](./ota.md) — auto-update your app through SyncKit
366 - - [OAuth2 PKCE](./oauth.md) — browser-based login for SyncKit apps
367 - - [SyncKit Client SDK](/rustdoc/synckit_client/) — Rust client library documentation
352 + - [OTA Updates](./ota.md): auto-update your app through SyncKit
353 + - [OAuth2 PKCE](./oauth.md): browser-based login for SyncKit apps
354 + - [SyncKit Client SDK](/rustdoc/synckit_client/): Rust client library documentation