Skip to main content

max / makenotwork

Business docs: 6-phase audit remediation Resolves the May 2026 audit findings across the business-doc corpus. ~150 corrections, 12 new SOPs, 9 new reference artifacts, 1 public doc consolidation. Phase 0 — canonical reference artifacts: - stripe_fees.md, hetzner_prices.md, vendor_prices.md, tier_mix.md, assumptions.md (A1-A31 with proxies + cadences), assumptions.toml (machine-readable, for future docengine substitution feature) - pricing.md, reserve_policy.md (framework drafts with OPEN decisions) - expenses.md updated: itemized + dated, F = $580/mo (was implied $573) Phase 1 — math/version corrections: - Stripe fee 2.9% + $0.30 propagated; Fan+ unit corrected to $2.47 - TODO_revenue_projections scenarios recomputed ($162/$545/$1,471) - SyncKit egress $0.0011/GB (was $0.01); worked examples fixed - 49 states + DC for MTL; SDK v0.3.1; Axum (not Actix); CCX/CPX Hetzner SKUs corrected; Object Storage €5.99 (not €4.99) - Chargeback "fighting and losing adds $15" deleted; Poisson 1.4% - Runway 6-12mo -> 4.4yr; license "open source" -> "source-available" Phase 2 — phantom removals: - Phantom infrastructure (Redis, LB) labeled or removed - Unsourced stats deleted (312%/89%, 73%, 68%, 400% Firebase) - 6 stats sourced via web research (Goldman Sachs, Linktree, Substack, YouTube, Ghost, Kajabi) with publication dates - SyncKit pitch resolved as B2B: Simple/Builder per-GB pricing - Three archived <details> blocks deleted from synckit-plan.md - Vague-filler pruned across all docs Phase 3 — restructure: - Public economics.md: 131 -> 54 lines, all margin tables / formulas / per-tier costs stripped per Option C (no public dashboards) - New public pricing.md: founding + standard rates, no internal terms; merged with legacy guide/pricing.md (fan-pricing models) - tech_costs.md: assumptions block at top citing A1-A31; per-tier formula C(N) = C_storage + C_egress + C_Stripe + F/N with arithmetic verified at N=100/500/1000; Everything tier split into "currently active" vs "projected when streaming ships" - Internal economics.md rewritten to "cost-plus with bounded reserves" framing; cross-refs replace number restatement Phase 5 — SOPs + legal citations: - 12 SOPs in sops/: shutdown-notice, price-change-notice, fan-plus-shutdown, dispute-resolution, data-export-sla, wal-archive, backup-recovery, pricing-change-decision, reserve-management, ticket-categorization, founding-cohort-tracking, + README index - WAL archive_timeout=300 confirmed live in setup-wal-archiving.sh - backup-db.sh cron 03:00 UTC / 30-day retention confirmed - GDPR/CCPA: 10 rights mapped to verified code paths in compliance.md - Public SOP cross-refs via HTML comments (internal-only pointers) - Legal citations added with three factual corrections caught: - CO captive insurance min: $100K -> $500K (CRS 10-6-116) - Stripe Tax country count: 50+ -> 100+ - Stripe Instant Payout: flat 1% -> regional (1% intl, 1.5% US) - Three lawyer-review flags: CRS 11-110 x2, CRS 10-6-116 - Pre-launch gap flagged: USCO DMCA agent registration not on file Phase 6 — final sweep: - Consolidated guide/pricing.md into about/pricing.md; 9 inbound links rewritten - Final propagation: $600 -> $580 in 9 locations, $620 -> $545, ARPU $24 -> $22, v0.2.1 -> v0.3.1 in GO/BB pitch HTML - Second-pass vague-filler cleanup: B+ score deleted, "near-identical values" softened, "cash grab" framing dropped Decisions still pending founder approval (OPEN markers in assumptions.toml + pricing.md §7 + reserve_policy.md §8): founding ratio, cohort cap value, T_fixed, S_legal, S_shock, R_opp parameters. Docs cite the source files; any value change propagates without restatement. Roadmap entry added to todo.md: docengine substitution feature (~3-day post-launch sprint) — assumptions.toml is the target source of truth.
Co-Authored-By
Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Author: Max J. <87768334+MaxJMath@users.noreply.github.com> · 2026-05-16 17:15 UTC
Commit: 7f3e7722dbd3e3a8ff65e9c40cbd3bd7b9d6de68
Parent: 065429e
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 &mdash; v0.2.1 alpha</div>
524 + <div class="left">Balanced Breakfast &mdash; 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 &mdash; v0.2.1 alpha</div>
679 + <div class="left">Balanced Breakfast &mdash; 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 &mdash; v0.2.1 alpha</div>
530 + <div class="left">GoingsOn &mdash; 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 &mdash; v0.2.1 alpha</div>
645 + <div class="left">GoingsOn &mdash; 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 &mdash; v0.2.1 alpha</div>
811 + <div class="left">GoingsOn &mdash; 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 &mdash; v0.2.1</div>
634 + <div class="left">MNW SyncKit &mdash; 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 &mdash; v0.2.1</div>
782 + <div class="left">MNW SyncKit &mdash; 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 &times; $0.15) + (burst multiplier &times; GB stored &times; $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&times;; <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&times; 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&times; 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&times; 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&times; 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 &mdash; 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 &mdash; v0.2.1 &mdash; Rust SDK + hosted API</div>
967 + <div class="left">MNW SyncKit &mdash; v0.3.1 &mdash; 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.