max / makenotwork
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>×</button></span> | |
| 5 | + | <span class="tag">Drone <button disabled>×</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 |