max / makenotwork
- Co-Authored-By
- Claude Opus 4.7 (1M context) <noreply@anthropic.com>
64 files changed,
+3493 insertions,
-1097 deletions
| @@ -316,6 +316,21 @@ | |||
| 316 | 316 | - [ ] Search infrastructure (tsvector, unified API, cross-project) | |
| 317 | 317 | - [ ] Notification service (table, triggers, API, digest prefs) | |
| 318 | 318 | - [ ] Image upload pipeline (thumbnails, format validation) | |
| 319 | + | ||
| 320 | + | ### Docs / Tooling | |
| 321 | + | ||
| 322 | + | - [ ] **Docengine — assumption substitution** (3-day sprint, post-launch). Source-of-truth: `docs/internal/business/assumptions.toml` (drafted 2026-05-16). Add a build step that: | |
| 323 | + | 1. Loads `assumptions.toml` (serde). | |
| 324 | + | 2. Substitutes `{{ key }}` placeholders in markdown via pulldown-cmark preprocessor (or regex pre-pass). | |
| 325 | + | 3. Evaluates derived values from a Rust formula registry (`R_cap`, `ARPU_standard`, `stripe_fee(price)`, `break_even(rate_class)`, `surplus(N, rate_class)`, `fill_time_months(N)`). | |
| 326 | + | 4. Validates: bounds checks on F, tier-mix sum = 1.0, surplus-split sum = 1.0, founding ≤ standard, no unresolved `{{ ... }}` post-substitution. | |
| 327 | + | 5. Optional v2: warn on bare values matching a substitution key (e.g., stray "$580" outside an explicit raw marker). | |
| 328 | + | ||
| 329 | + | **Why**: the 2026-05 audit found ~150 stale-value bugs across the corpus (e.g., $573 → $580 propagation missed in 3+ files even after grep verification). One source of truth eliminates the entire class. | |
| 330 | + | ||
| 331 | + | **Migration**: existing markdown gets `{{ ... }}` markers added incrementally; values stay current until then. No breaking change to docengine consumers. | |
| 332 | + | ||
| 333 | + | **Out of scope (v1)**: prose framing changes ("we have lean costs"), public/internal boundary enforcement, automatic regeneration on TOML change. v1 is just substitution + derived expressions + build-time validation. | |
| 319 | 334 | - [ ] Link preview extraction (shared crate, OG metadata) | |
| 320 | 335 | - [ ] SEO & bot access (Cloudflare crawl endpoint, per-creator toggle) | |
| 321 | 336 |
| @@ -521,7 +521,7 @@ | |||
| 521 | 521 | </div> | |
| 522 | 522 | ||
| 523 | 523 | <div class="footer"> | |
| 524 | - | <div class="left">Balanced Breakfast — v0.2.1 alpha</div> | |
| 524 | + | <div class="left">Balanced Breakfast — v0.3.1</div> | |
| 525 | 525 | <div class="right">makenot.work</div> | |
| 526 | 526 | </div> | |
| 527 | 527 | ||
| @@ -676,7 +676,7 @@ | |||
| 676 | 676 | </div> | |
| 677 | 677 | ||
| 678 | 678 | <div class="footer-inline" style="margin-top: 16px;"> | |
| 679 | - | <div class="left">Balanced Breakfast — v0.2.1 alpha</div> | |
| 679 | + | <div class="left">Balanced Breakfast — v0.3.1</div> | |
| 680 | 680 | <div class="right">makenot.work</div> | |
| 681 | 681 | </div> | |
| 682 | 682 |
| @@ -527,7 +527,7 @@ | |||
| 527 | 527 | </div> | |
| 528 | 528 | ||
| 529 | 529 | <div class="footer"> | |
| 530 | - | <div class="left">GoingsOn — v0.2.1 alpha</div> | |
| 530 | + | <div class="left">GoingsOn — v0.3.1</div> | |
| 531 | 531 | <div class="right">makenot.work</div> | |
| 532 | 532 | </div> | |
| 533 | 533 | ||
| @@ -642,7 +642,7 @@ | |||
| 642 | 642 | </div> | |
| 643 | 643 | ||
| 644 | 644 | <div class="footer"> | |
| 645 | - | <div class="left">GoingsOn — v0.2.1 alpha</div> | |
| 645 | + | <div class="left">GoingsOn — v0.3.1</div> | |
| 646 | 646 | <div class="right">makenot.work</div> | |
| 647 | 647 | </div> | |
| 648 | 648 | ||
| @@ -808,7 +808,7 @@ | |||
| 808 | 808 | </div> | |
| 809 | 809 | ||
| 810 | 810 | <div class="footer-inline" style="margin-top: 12px;"> | |
| 811 | - | <div class="left">GoingsOn — v0.2.1 alpha</div> | |
| 811 | + | <div class="left">GoingsOn — v0.3.1</div> | |
| 812 | 812 | <div class="right">makenot.work</div> | |
| 813 | 813 | </div> | |
| 814 | 814 |
| @@ -631,7 +631,7 @@ | |||
| 631 | 631 | </div> | |
| 632 | 632 | ||
| 633 | 633 | <div class="footer"> | |
| 634 | - | <div class="left">MNW SyncKit — v0.2.1</div> | |
| 634 | + | <div class="left">MNW SyncKit — v0.3.1</div> | |
| 635 | 635 | <div class="right">makenot.work</div> | |
| 636 | 636 | </div> | |
| 637 | 637 | ||
| @@ -779,7 +779,7 @@ | |||
| 779 | 779 | </div> | |
| 780 | 780 | ||
| 781 | 781 | <div class="footer"> | |
| 782 | - | <div class="left">MNW SyncKit — v0.2.1</div> | |
| 782 | + | <div class="left">MNW SyncKit — v0.3.1</div> | |
| 783 | 783 | <div class="right">makenot.work</div> | |
| 784 | 784 | </div> | |
| 785 | 785 | ||
| @@ -861,7 +861,7 @@ | |||
| 861 | 861 | <tr> | |
| 862 | 862 | <td>Schema-agnostic</td> | |
| 863 | 863 | <td><span class="check">Yes</span></td> | |
| 864 | - | <td><span class="check">Yes</span></td> | |
| 864 | + | <td>doc-store schema (Firestore enforces document model)</td> | |
| 865 | 865 | <td>Postgres</td> | |
| 866 | 866 | <td>CloudKit</td> | |
| 867 | 867 | <td>You build it</td> | |
| @@ -926,39 +926,45 @@ | |||
| 926 | 926 | ||
| 927 | 927 | <h2>Pricing</h2> | |
| 928 | 928 | ||
| 929 | + | <p style="margin-bottom: 16px;">SyncKit is a B2B service: customers are app developers, not end users. Pricing is usage-based on storage and transfer — no per-user fees, no per-seat licenses. Your end users authenticate with their own MNW accounts at no cost to you.</p> | |
| 930 | + | ||
| 931 | + | <p style="margin-bottom: 20px;"><strong>Monthly cost = (GB stored × $0.15) + (burst multiplier × GB stored × $0.03)</strong></p> | |
| 932 | + | ||
| 933 | + | <p style="margin-bottom: 16px;"><em>Burst</em> is the transfer budget relative to storage. <strong>Simple mode</strong> uses a default burst of 5×; <strong>Builder mode</strong> lets you choose any multiplier. Same billing engine for both.</p> | |
| 934 | + | ||
| 929 | 935 | <div class="pricing"> | |
| 930 | 936 | <div class="tier"> | |
| 931 | - | <span class="tier-name">Basic</span> | |
| 932 | - | <span class="tier-price">$10</span> | |
| 937 | + | <span class="tier-name">Config / state sync</span> | |
| 938 | + | <span class="tier-price">$0.30</span> | |
| 933 | 939 | <span class="tier-period">/ month</span> | |
| 934 | - | <div class="tier-desc">Text content. Changelog sync, device management, key storage.</div> | |
| 940 | + | <div class="tier-desc">Example: 1 GB stored, 5× burst. Settings, read state, light metadata.</div> | |
| 935 | 941 | </div> | |
| 936 | 942 | <div class="tier featured"> | |
| 937 | - | <span class="tier-name">Small Files</span> | |
| 938 | - | <span class="tier-price">$20</span> | |
| 943 | + | <span class="tier-name">Productivity app</span> | |
| 944 | + | <span class="tier-price">$3.00</span> | |
| 939 | 945 | <span class="tier-period">/ month</span> | |
| 940 | - | <div class="tier-desc">+ Blob storage for audio, plugins, config files. Up to 500 MB/blob.</div> | |
| 946 | + | <div class="tier-desc">Example: 10 GB stored, 5× burst. Tasks, contacts, light files.</div> | |
| 941 | 947 | </div> | |
| 942 | 948 | <div class="tier"> | |
| 943 | - | <span class="tier-name">Big Files</span> | |
| 944 | - | <span class="tier-price">$30</span> | |
| 949 | + | <span class="tier-name">Media metadata</span> | |
| 950 | + | <span class="tier-price">$15.00</span> | |
| 945 | 951 | <span class="tier-period">/ month</span> | |
| 946 | - | <div class="tier-desc">+ Video, courses, large downloads. Higher storage quotas.</div> | |
| 952 | + | <div class="tier-desc">Example: 50 GB stored, 5× burst. Sample libraries, playlists.</div> | |
| 947 | 953 | </div> | |
| 948 | 954 | <div class="tier"> | |
| 949 | - | <span class="tier-name">Everything</span> | |
| 950 | - | <span class="tier-price">$60</span> | |
| 955 | + | <span class="tier-name">Large file sync</span> | |
| 956 | + | <span class="tier-price">$60.00</span> | |
| 951 | 957 | <span class="tier-period">/ month</span> | |
| 952 | - | <div class="tier-desc">All features, current and future.</div> | |
| 958 | + | <div class="tier-desc">Example: 200 GB stored, 5× burst. Audio, video, courses.</div> | |
| 953 | 959 | </div> | |
| 954 | 960 | </div> | |
| 955 | 961 | ||
| 956 | 962 | <div class="highlight-box"> | |
| 957 | - | <p><strong>No per-user fees. No per-request fees. No egress charges.</strong> Your end users authenticate with their own MNW accounts. Pricing is per-developer, not per-seat. Flat monthly rate regardless of how many users or devices sync through your app. Source-available under PolyForm Noncommercial 1.0.0.</p> | |
| 963 | + | <p><strong>No per-user fees. No per-request fees. No egress charges.</strong> Your end users authenticate with their own MNW accounts. Pricing scales with what you actually store and transfer — not with how many users or devices sync through your app. No overages: the bill is known before the billing period starts; at limits, sync degrades but the bill does not change. Source-available under PolyForm Noncommercial 1.0.0.</p> | |
| 958 | 964 | </div> | |
| 959 | 965 | ||
| 960 | 966 | <div class="footer-inline" style="margin-top: 12px;"> | |
| 961 | - | <div class="left">MNW SyncKit — v0.2.1 — Rust SDK + hosted API</div> | |
| 967 | + | <div class="left">MNW SyncKit — v0.3.1 — Rust SDK + hosted API</div> | |
| 962 | 968 | <div class="right">makenot.work</div> | |
| 963 | 969 | </div> | |
| 964 | 970 |
| @@ -51,16 +51,16 @@ | |||
| 51 | 51 | ||
| 52 | 52 | | Scenario | GO users | BB users | AF users (avg $3/mo) | Monthly app revenue | | |
| 53 | 53 | |----------|----------|----------|----------------------|---------------------| | |
| 54 | - | | Conservative (6 mo) | 50 | 30 | 20 | ~$150 | | |
| 55 | - | | Moderate (12 mo) | 200 | 100 | 50 | ~$620 | | |
| 56 | - | | Optimistic (18 mo) | 500 | 300 | 150 | ~$1,650 | | |
| 54 | + | | Conservative (6 mo) | 50 | 30 | 20 | $162 (50·$1.64 + 30·$0.67 + 20·$3.00 = $82 + $20.10 + $60 = $162) | | |
| 55 | + | | Moderate (12 mo) | 200 | 100 | 50 | $545 (200·$1.64 + 100·$0.67 + 50·$3.00 = $328 + $67 + $150 = $545) | | |
| 56 | + | | Optimistic (18 mo) | 500 | 300 | 150 | $1,471 (500·$1.64 + 300·$0.67 + 150·$3.00 = $820 + $201 + $450 = $1,471) | | |
| 57 | 57 | ||
| 58 | 58 | ### Impact on break-even | |
| 59 | 59 | ||
| 60 | - | Current break-even: ~32-36 creators (covers ~$600/month fixed costs from creator subs alone). | |
| 60 | + | Current break-even: ~32-36 creators (covers $580/month fixed costs per expenses.md from creator subs alone). | |
| 61 | 61 | ||
| 62 | 62 | If app sync revenue covers infrastructure costs: | |
| 63 | - | - At moderate adoption ($620/month): infra fully covered by apps. Creator subscriptions become pure margin. | |
| 63 | + | - At moderate adoption (~$545/month per moderate scenario): app-sync revenue is comparable to ops-only fixed cost ($580/mo). Creator subscriptions then approach pure margin. | |
| 64 | 64 | - Break-even creator count drops to effectively **0 for infrastructure** — first creator subscription dollar is profit. | |
| 65 | 65 | - Self-sustaining threshold (covers $3K salary + infra) drops from ~295 creators to ~200-220 creators. | |
| 66 | 66 |
| @@ -30,14 +30,14 @@ | |||
| 30 | 30 | **App price:** Free. | |
| 31 | 31 | **Sync is the only monetization.** | |
| 32 | 32 | ||
| 33 | - | GO syncs 14 tables (tasks, subtasks, contacts, email accounts, events, milestones, attachments, annotations, etc.). Metadata is small (1-5 MB). Some users sync email attachments as blobs, but most don't. Attachment sync is included — the few heavy users are subsidized by the majority. | |
| 33 | + | GO syncs tasks, subtasks, contacts, email accounts, events, milestones, attachments, annotations, and related tables. Metadata is small (1-5 MB). Some users sync email attachments as blobs, but most don't. Attachment sync is included — the few heavy users are subsidized by the majority. | |
| 34 | 34 | ||
| 35 | 35 | | Plan | Price | Stripe fees | Net to MNW | Effective monthly | | |
| 36 | 36 | |------|-------|-------------|------------|-------------------| | |
| 37 | 37 | | Monthly | $2/mo | ~$0.36/mo | ~$1.64/mo | $1.64 | | |
| 38 | 38 | | Annual | $15/yr | ~$0.74/yr | ~$14.26/yr | $1.19 | | |
| 39 | 39 | ||
| 40 | - | Higher than BB because GO is a more complex app with a larger sync surface (14 tables vs 7, blob support, more development investment). | |
| 40 | + | Higher than BB because GO has a larger sync surface (more tables, blob support, more development investment). | |
| 41 | 41 | ||
| 42 | 42 | **What's included:** Full cloud sync across all devices — tasks, contacts, events, email accounts, attachments, everything GO stores. | |
| 43 | 43 | ||
| @@ -70,8 +70,6 @@ | |||
| 70 | 70 | ||
| 71 | 71 | > We prefer annual billing because payment processing fees on small monthly charges are disproportionate. On a $1/month charge, Stripe takes ~33%. On a $12/year charge, Stripe takes ~5%. Annual pricing passes that savings to you. | |
| 72 | 72 | ||
| 73 | - | This is consistent with MNW's transparency principles. We don't hide why annual is cheaper — we explain it. | |
| 74 | - | ||
| 75 | 73 | ## Relationship to MNW Creator Tiers | |
| 76 | 74 | ||
| 77 | 75 | None. SyncKit is a separate product marketed at developers. App sync pricing is independent of MNW creator subscriptions. A creator paying $30/mo for Big Files still pays separately for GO/BB/AF sync like any other user. |