Skip to main content

max / makenotwork

Creator trust audit round 4, Everything tier rename, privacy job tracking Trust audit (round 4): - Fix stale docs: fan-plus.md, how-we-work.md (video), roadmap.md (embeds) - Add ToS change notice periods (30d general, 90d privacy, 90d pricing) - Add Teams & Bands section to getting-started guide - Add Stripe country availability note to getting-started - Add custom domains link to first-week checklist - Add mobile apps to FAQ and roadmap (native iOS/Android, library-focused) - Add email tools FAQ entry (broadcasts only, no drip workflows) - Add storefront customization to roadmap (3 tiers, all plans) - Update vaporware table in audit findings Privacy compliance: - Migration 081: scheduler_job_runs table for persistent job tracking - New fingerprint IP scrub job (30-day retention, mirrors session scrub) - New streaming session cleanup job (expired + 24h inactive) - Record all 6 privacy/cleanup jobs with last-run time and rows affected - Daily jobs run on first tick after restart (no 24h gap) - Add Privacy & Compliance section to /health page Everything tier rename (Streaming -> Everything): - Migration 079: rename in DB, update Stripe price ID env var - Remove demo seed data (migration 080) - Update all docs, templates, pricing pages Other: - Remove unused fingerprint module (watermarking stubs) - Free trial request fields in join wizard - Legal review prep doc, outreach tiers doc
Co-Authored-By
Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Author: Max J. <87768334+MaxJMath@users.noreply.github.com> · 2026-04-27 21:02 UTC
Commit: b058fd5c26070d6e0b2457852bb7a472cda26c84
Parent: bd0e8e7
77 files changed, +1137 insertions, -1216 deletions
M CLAUDE.md +1 -1
@@ -26,7 +26,7 @@
26 26 - **Basic** — $10/mo (text, all base features)
27 27 - **Small Files** — $20/mo (audio, software, plugins, small downloads)
28 28 - **Big Files** — $30/mo (video, courses, large downloads)
29 - - **Streaming** — $40/mo (live streaming + everything above)
29 + - **Everything** — $40/mo (all features, current and future)
30 30
31 31 ## Ecosystem
32 32
@@ -3385,7 +3385,7 @@
3385 3385
3386 3386 [[package]]
3387 3387 name = "makenotwork"
3388 - version = "0.4.2"
3388 + version = "0.4.3"
3389 3389 dependencies = [
3390 3390 "anyhow",
3391 3391 "argon2",
@@ -24,7 +24,7 @@
24 24 "basic" => "Basic",
25 25 "small_files" => "Small Files",
26 26 "big_files" => "Big Files",
27 - "streaming" => "Streaming",
27 + "everything" => "Everything",
28 28 _ => tier,
29 29 }
30 30 }
@@ -93,7 +93,7 @@
93 93 fn format_tier_known() {
94 94 assert_eq!(format_tier("basic"), "Basic");
95 95 assert_eq!(format_tier("small_files"), "Small Files");
96 - assert_eq!(format_tier("streaming"), "Streaming");
96 + assert_eq!(format_tier("everything"), "Everything");
97 97 }
98 98
99 99 #[test]
@@ -163,7 +163,7 @@
163 163
164 164 - Checkout sessions for one-time purchases and subscriptions
165 165 - Webhook handlers for payment confirmation, subscription lifecycle, disputes
166 - - Creator tier subscriptions (Basic $10, Small Files $20, Big Files $30, Streaming $40)
166 + - Creator tier subscriptions (Basic $10, Small Files $20, Big Files $30, Everything $40)
167 167 - Fan+ consumer subscriptions ($8/mo)
168 168 - Promo codes (percentage/fixed discount, free access)
169 169
@@ -6,7 +6,7 @@
6 6
7 7 ## Design Principle
8 8
9 - - **BigFiles / Streaming tiers**: Store original file. Lossless preservation is the feature.
9 + - **BigFiles / Everything tiers**: Store original file. Lossless preservation is the feature.
10 10 - **SmallFiles tier**: Store a high-quality transparent encode. Humans can't tell the difference.
11 11 - Originals are always kept for BigFiles+. SmallFiles stores only the optimized version.
12 12 - Never transcode lossy-to-lossy. Never transcode lossy-to-lossless (wastes space, no quality gain).
@@ -57,7 +57,7 @@
57 57 ```
58 58 Is the source lossless (WAV/AIFF/FLAC/ALAC)?
59 59 YES:
60 - Tier = BigFiles/Streaming?
60 + Tier = BigFiles/Everything?
61 61 -> Store as FLAC (lossless, ~50% smaller than WAV/AIFF)
62 62 -> Keep original alongside if WAV/AIFF (creator can re-download)
63 63 Tier = SmallFiles?
@@ -116,7 +116,7 @@
116 116 ```
117 117 Is the source lossless/production (ProRes, uncompressed)?
118 118 YES:
119 - Tier = BigFiles/Streaming?
119 + Tier = BigFiles/Everything?
120 120 -> Re-encode to H.264 CRF 18 in MP4 (universal playback)
121 121 -> Optionally also generate VP9/AV1 for web streaming
122 122 -> Keep original? Only if tier storage allows it
@@ -170,7 +170,7 @@
170 170
171 171 Fan downloads: choice of original lossless or delivery format.
172 172
173 - ### Streaming ($40/mo) — "Lossless + adaptive streaming"
173 + ### Everything ($40/mo) — "Lossless + adaptive streaming"
174 174
175 175 Same as BigFiles, plus:
176 176 - Multiple quality tiers generated for adaptive streaming (HLS/DASH)
@@ -10,7 +10,7 @@
10 10 | Projects & Content | 8 | Creator projects, items, versions, chapters, insertions, sections, bundles |
11 11 | Tags & Taxonomy | 4 | Hierarchical tags, item tagging, platform labels |
12 12 | Commerce | 7 | Transactions, subscriptions, promo codes, license keys |
13 - | Creator Tiers | 2 | Platform subscription tiers (Basic/Small/Big/Streaming) |
13 + | Creator Tiers | 2 | Platform subscription tiers (Basic/Small/Big/Everything) |
14 14 | Email & Mailing | 4 | Mailing lists, subscribers, suppressions, signups |
15 15 | Social | 3 | Follows, blog posts, custom links |
16 16 | Collections | 2 | User-curated item lists |
@@ -265,7 +265,7 @@
265 265 ## Creator Tiers
266 266
267 267 ### creator_subscriptions
268 - Platform subscription for creators (Basic $10, Small Files $20, Big Files $30, Streaming $40). One row per creator.
268 + Platform subscription for creators (Basic $10, Small Files $20, Big Files $30, Everything $40). One row per creator.
269 269
270 270 - **FK:** user_id → users CASCADE (UNIQUE)
271 271 - **Key columns:** tier, status, stripe_subscription_id UNIQUE, grace_enforced_at
@@ -56,8 +56,9 @@
56 56 | Feature | Status |
57 57 |---------|--------|
58 58 | Live streaming (RTMP, chat, clips) | Not implemented |
59 - | Fan+ subscription | DB only, no UI |
60 - | Video transcoding/adaptive | Partial (upload works, playback missing) |
59 + | Fan+ subscription | Implemented (checkout, billing, badge — docs were stale) |
60 + | Video upload/playback | Implemented (upload, player, access control — docs were stale) |
61 + | Video transcoding/adaptive | Not implemented (upload-format-only delivery) |
61 62 | Content Archive (12-month preservation) | Not implemented |
62 63 | Independent moderation appeals | Not implemented (one-person team) |
63 64 | 99.9% uptime | Not implemented (currently 99.5% target) |
M server/docs/todo.md +71 -105
@@ -3,12 +3,12 @@
3 3 ## Status
4 4 Done: All pre-beta phases. Active: Creator setup (Stripe), manual testing. Next: Soft launch.
5 5
6 - v0.4.1. Audit grade A. ~1,233 tests.
6 + v0.4.3. Audit grade A. ~1,412 tests.
7 7
8 8 ---
9 9
10 10 ## Code Review Remediation — Deferred
11 - - [ ] Monitor scheduler.rs (635), git/mod.rs (613), license_keys.rs (684) for growth
11 + - [ ] Monitor scheduler.rs (1184), git/mod.rs (224), license_keys.rs (684) for growth
12 12 - [ ] Consider splitting bin/mnw-admin.rs git-auth commands into separate module
13 13
14 14 ---
@@ -54,15 +54,15 @@
54 54 - [ ] Test free download flow (GO), PWYW flow (BB), purchase flow (AF), subscription flow (GO)
55 55 - [ ] Test discount code on AF purchase
56 56 - [ ] Test license key delivery after AF purchase
57 - - [ ] Capture screenshots for docs (dashboard, audio player, discover, pricing, git browser)
57 + - [ ] Capture screenshots for docs (dashboard, audio player, discover, pricing, git browser) — or replace with sandbox links
58 58
59 59 ### Documentation — Remaining
60 - - [ ] Review new docs against live UI for accuracy (button labels, navigation paths)
61 - - [ ] liability.md legal review (has [PENDING LEGAL REVIEW] placeholders)
62 - - [ ] dmca-counter.md designated agent address (needs DMCA agent registration)
60 + - [x] Review new docs against live UI for accuracy (button labels, navigation paths) — fixed in round 3 audit
61 + - [ ] liability.md legal review (has [PENDING LEGAL REVIEW] placeholders) — rolled into legal review prep
62 + - [ ] dmca-counter.md designated agent address (needs DMCA agent registration) — rolled into legal review prep
63 63
64 64 ### Git Access Provisioning
65 - - [ ] Web UI for managing SSH keys per MNW account (residents/collaborators add keys in dashboard)
65 + - [ ] Dashboard page for SSH key management (API + HTMX partials exist at `routes/api/ssh_keys.rs`, needs dashboard tab)
66 66 - [ ] Per-repo collaborator access (grant push by MNW username, stored in DB, wired to authorized_keys rebuild)
67 67 - [ ] Replace manual `setup-ssh-keys.sh` with account-driven key management
68 68
@@ -87,7 +87,7 @@
87 87
88 88 ## Frontend Audit — Remaining
89 89
90 - - [ ] Add a visual to landing page (HTML/CSS ready, needs `static/images/landing-screenshot.png`)
90 + - [x] Landing page visual — replaced screenshot with sandbox link ("Try the dashboard without signing up")
91 91 - [ ] Create og:image social card (1200x630, for landing page and fallback — distinct from logo.png)
92 92
93 93 ---
@@ -111,109 +111,89 @@
111 111 - [ ] Allows horizontal scaling independently of request serving
112 112 - [ ] Consider GPU-accelerated analysis if volume warrants it
113 113
114 - ### Other scanning hardening
115 - - [x] ~~Add timeout to YARA scanning. Fixed: `scanner.set_timeout(30s)` via yara-x native API.~~
116 - - [ ] Cap ClamAV response buffer size (currently unbounded `read_to_end`)
117 - - [x] ~~Nested archive detection: check magic bytes, not just file extensions. Fixed: magic bytes check for ZIP, gzip, 7z, RAR in archive.rs.~~
118 114
119 115 ---
120 116
121 117 ## Code Fuzz Findings (2026-04-25)
122 118
123 - Three rounds of adversarial code review. 51 findings total: 50 fixed, 1 accepted risk, 1 deferred.
119 + Three rounds of adversarial code review. 51 findings total: 50 fixed, 1 accepted risk, 2 deferred. Fixed items moved to todo_done.md.
124 120
125 121 ### Accepted Risk
126 122 - Idempotency check not atomic with operation — concurrent requests both execute (`db/idempotency.rs`). Safe because underlying ops are themselves idempotent.
123 + - Revoked session usable for up to 30s -- session cache IS cleared by revoke_session and revoke_other_sessions handlers; window only applies to direct DB manipulation (admin)
127 124
128 125 ### Deferred
129 126 - 7-day SyncKit JWT with no per-user revocation (`constants.rs:37`). Stolen token usable for full window. Requires key rotation infrastructure (SyncKit S4, post-beta).
130 -
131 - ### Resolved (28 findings)
132 - All critical, serious, and minor findings from rounds 1 and 2 are fixed. See git history for details.
133 -
134 - ## Code Fuzz Findings -- Round 3 (2026-04-25)
135 -
136 - ### Fixed
137 - - [x] SubscriptionStatus missing Trialing/Incomplete/IncompleteExpired variants (db/enums.rs)
138 - - [x] SyncKit auth does not block deactivated users (synckit_auth.rs)
139 - - [x] Build token comparison not constant-time (routes/builds.rs)
140 - - [x] Subscription access checks ignore paused_at (db/subscriptions.rs)
141 - - [x] Cover/MediaImage uploads bypass storage cap with i64::MAX (db/creator_tiers.rs)
142 - - [x] Promo code use_count consumed even when user already owns item (db/transactions.rs)
143 - - [x] Idempotency middleware caches empty string instead of real body (metrics.rs)
144 - - [x] OAuth: no dummy hash on user-not-found path (timing leak, routes/oauth.rs)
145 - - [x] OAuth: no password length cap (Argon2 DoS, routes/oauth.rs)
146 - - [x] OAuth: suspended/deactivated users can still authorize (routes/oauth.rs)
147 - - [x] OAuth session validation: result.valid not checked before suspension (routes/oauth.rs)
148 - - [x] OAuth legacy session path ignores deactivated flag (routes/oauth.rs)
149 - - [x] Subscription test fixture missing paused_at field (db/models/subscription.rs)
150 - - [x] Git routes have no rate limiting (routes/git/mod.rs)
151 - - [x] No Content-Security-Policy header (lib.rs)
152 - - [x] /metrics endpoint unprotected (lib.rs)
153 - - [x] Upload confirm: no idempotency, no S3 cleanup on storage error (routes/storage/uploads.rs)
154 - - [x] Version confirm: no idempotency, no S3 cleanup on storage error (routes/storage/versions.rs)
155 - - [x] Image confirm: storage increment after DB write, no idempotency (routes/storage/images.rs)
156 - - [x] Media confirm: no content_type/extension re-validation, no S3 cleanup (routes/storage/media.rs)
157 -
158 - - [x] CSRF token not rotated after login -- now regenerated in login_user (auth.rs, csrf.rs)
159 - - [x] Read-modify-write race on sort_order/position -- atomic INSERT...SELECT (db/custom_links.rs, db/collections.rs)
160 - - [x] N+1 reorder loops without transactions -- wrapped in transactions (db/custom_links.rs, db/collections.rs)
161 - - [x] Race condition in custom domain creation -- SELECT FOR UPDATE in transaction (db/custom_domains.rs)
162 -
163 - - [x] Double-purchase TOCTOU -- partial unique index on (buyer_id, item_id/project_id) WHERE status='pending' prevents concurrent checkouts (migration 073, checkout handlers)
164 -
165 - - [x] Promo code max_uses bypassable on paid path -- use_count now reserved at checkout time, released by scheduler on stale cleanup (migration 074, checkout handlers, scheduler)
166 -
167 - ### Deferred
168 127 - Rate limit IP extraction trusts X-Forwarded-For when traffic bypasses Cloudflare (helpers.rs). Fix requires splitting rate limit extraction by path: CF-Connecting-IP for public web routes, peer socket for internal/CLI/git. Needs careful routing since CLI, git smart HTTP, and SyncKit all hit the same server but some bypass Cloudflare.
169 128 - S3 key/file size UPDATE queries lack ownership in SQL -- defense-in-depth; callers verify ownership (db/items.rs)
170 129
171 - ### Accepted
172 - - Revoked session usable for up to 30s -- session cache IS cleared by revoke_session and revoke_other_sessions handlers; window only applies to direct DB manipulation (admin)
173 -
174 130 ---
175 131
176 - ## Creator Trust Audit (2026-04-25)
132 + ## Creator Trust Audit (2026-04-25, round 2 2026-04-26)
177 133
178 - Systematic creator-perspective audit of docs, legal, code, and competitive positioning.
179 -
180 - ### Resolved (20+ findings)
181 - All doc/code fixes, trust gaps, security issues, and doc clarity items are complete. Key changes: subscription export endpoint, offsite backups with WAM alerting, API key hashing, security headers, fan subscription pause on suspension, account limbo state, support ticket portal, expanded tax/payout/discovery/storage docs, privacy policy updates. See git history.
182 -
183 - ### Doc/Code Contradictions (all resolved)
184 - - [x] Payout minimum: aligned payouts.md with Stripe reality ($1 minimum), named Stripe explicitly
185 - - [x] Content protection watermarking: scoped claim to "audio and image files delivered without watermarks", disclosed text fingerprinting
186 - - [x] Mailing list import: reworded as roadmap item, linked to migration guide
187 - - [x] IP retention: added daily scheduler job scrubbing IPs from user_sessions, download_fingerprints, streaming_sessions at 30 days
188 -
189 - ### Missing Creator-Facing Documentation
190 - - [x] Named Stripe explicitly in payouts.md and payments.md (replaced all "payment processor" references)
191 - - [x] Creator application criteria added to getting-started.md (what we look for, what gets rejected)
192 - - [x] Tips documented (new guide/tips.md)
193 - - [x] Bundles documented (new guide/bundles.md)
194 - - [x] Revenue splits documented (new guide/splits.md)
195 - - [x] Currencies/countries: linked to Stripe's own docs (46+ countries, 135+ currencies) rather than maintaining stale tables; fixed grammar from bulk find-replace
196 -
197 - ### Trust Gaps
198 - - [x] 30-day post-termination export window -- migration 076 adds terminated_at; admin terminate route (requires prior suspension); scheduler deletes after 30 days; Stripe subscriptions canceled; termination email sent with export instructions
199 - - [x] Per-item content removal admin action -- migration 075, admin routes (remove/restore), email notifications, publish guards prevent re-publishing removed items
200 - - ~~No incident post-mortems or public historical incident log~~ — will publish as posts in the MNW Changelog blog project
134 + Two rounds of creator-perspective audit. 25+ findings resolved (moved to todo_done.md). Incident post-mortems will publish as posts in the MNW Changelog blog project.
201 135
202 136 ### Competitive Positioning (acknowledged, not bugs)
203 137 - No free tier — deliberate tradeoff. Earn-back credit program planned.
204 138 - No mobile fan app — creator apps exist, no general fan app.
205 139 - No editorial discovery — search, tags, follows only. Interested in non-algorithmic discovery methods.
140 + - $10/mo minimum is biggest competitive gap vs Bandcamp/Gumroad/itch.io (all have free tiers).
206 141
207 142 ---
208 143
209 - ## Content Fingerprinting — Remaining
210 - - [ ] Invisible image watermarks — LSB encoding (stub exists at `fingerprint/watermark_image.rs`)
211 - - [ ] Invisible audio watermarks — spread-spectrum (stub exists at `fingerprint/watermark_audio.rs`)
212 - - [ ] Wire visible stamps into download routes (stamp text files before serving)
213 - - [ ] Wire ZWC watermarks into download routes (watermark text files before serving)
214 - - [ ] ZIP/tar archive stamping (inject LICENSE.txt at archive root)
215 - - [ ] Dashboard UI for fingerprint tracing (lookup by fingerprint_id, view download history)
216 - - [ ] Anti-hotlink header checks in streaming routes (logic exists in `fingerprint/streaming.rs`)
144 + ## Creator Trust Audit (2026-04-27, round 3)
145 +
146 + Resolved (moved to todo_done.md): download budget removal, grace period duration, tax disclaimer, unlimited downloads doc, Stripe suspension doc, "original creative work" definition, post-cancellation retention, analytics "we don't track" expansion, Streaming→Everything rename, video "coming soon" labels removed, HSTS verified, git repo disk cleanup, succession plan, pricing page tier consistency, free item purchase redirect, dashboard Everything tier label.
147 +
148 + ### Remaining
149 + - [ ] **Legal/tax professional review** — prep doc at `docs/internal/legal_review_prep.md` with 41 specific questions across ToS, privacy, DMCA, payments, tax. Recommended: split engagement (internet attorney 3h + tax professional 1-2h)
150 +
151 + ## Creator Trust Audit (2026-04-27, round 4)
152 +
153 + Resolved mechanically: fan-plus.md "not yet available" removed (feature is live). how-we-work.md video "not yet available" removed (video upload/playback works). roadmap.md embeds + video moved from Direction to What's Built. Vaporware table in todo-creator-trust-audit.md updated.
154 +
155 + ### Docs — needs content decisions
156 + - [x] **Tax documentation**: Already covered in payouts.md (lines 33-53) — US 1099-K, non-US guidance, Stripe links, "not tax advice" disclaimer. Pattern: statements + links to Stripe, avoids hardcoded thresholds.
157 + - [x] **Support contact info**: Already covered — support/contact.md has 6 email addresses + response SLAs, dashboard has ticket form (user_support.html → WAM), forums exist
158 + - [x] **Stripe country limitations**: Added Stripe availability note with link to stripe.com/global in getting-started.md, before "What we look for"
159 + - [x] **"Material changes" in ToS**: Replaced vague "material changes" with specific notice periods: 30 days general, 90 days privacy, 90 days + grandfathering pricing, immediate for legal/security emergencies
160 + - [x] **Creator earnings data / social proof**: Too early — platform is new. Founder uses it for own creations. Revisit when real creators are onboarded.
161 + - [x] **Team/band accounts**: Added "Teams & Bands" section to getting-started.md — shared account vs individual accounts with co-authors, migration path
162 +
163 + ### Security
164 + - [x] **IP retention cleanup verification**: Added `scheduler_job_runs` table (migration 081), job run recording for all 6 privacy jobs, new `fingerprint_ip_scrub` + `streaming_session_cleanup` jobs, "Privacy & Compliance" section on `/health` page showing last-run time + rows affected + status indicator. Daily jobs now also run on first tick after restart.
165 +
166 + ### Competitive
167 + - [x] **Free trial application**: Waitlist application now includes free trial request fields (tier preference, trial length, reason). Available in both the join wizard and API route. Admin reviews and grants trials manually.
168 + - [x] **Mobile fan app**: Expanded FAQ entry with native iOS/Android plans (library, offline, push). Added "Mobile apps" section to roadmap Direction.
169 + - [x] **Email automation**: Added FAQ entry clarifying broadcasts + auto-notifications only, no drip/segmentation, suggesting external email service for advanced needs
170 +
171 + ### Low priority
172 + - [x] **Custom domains prominence**: Added link to custom-domains.md in getting-started "Share your link" step
173 + - [x] **Creator storefront preview/demo**: Added storefront customization (3 tiers: theme basics, custom CSS, full template access, all tiers) to roadmap Direction. Preview/demo deferred to beta.
174 +
175 + ---
176 +
177 + ## Launch Readiness (2026-04-27)
178 +
179 + ### Fixed
180 + - [x] Pricing page: Big Files and Everything enabled in calculator
181 + - [x] Purchase page: free items redirect to item page instead of broken checkout form
182 + - [x] Dashboard: Everything tier shows "Coming soon" instead of broken Subscribe button
183 + - [x] Pricing calculator: flipped colors so competitors show red when MNW is cheaper
184 + - [x] Removed demo data: migration 080 deletes Elena Vasquez seed content
185 + - [x] Docs accuracy: fixed "Connect Payments" → "Connect with Stripe", publish flow, notification labels, added tips notification
186 + - [x] Landing page: replaced screenshot placeholder with sandbox link
187 + - [x] Human testing code review: all 99 checklist items verified in code (routes, handlers, templates all exist)
188 +
189 + ### Pre-Launch Remaining
190 + - [ ] Stripe live mode: confirm creator Stripe Connect onboarding complete (not test mode)
191 + - [ ] Human testing: complete sign-off table in `deploy/human_testing.md` (code verified, needs manual walkthrough)
192 + - [ ] Content seeding: at least one real creator with published content on discover page
193 + - [ ] Content seeding items from Pre-Beta section above (subscription tier, license keys, discount codes, purchase flow tests)
194 + - [ ] Outreach: hand-write emails using tiered creator list at `docs/internal/outreach/tiers.md`. Per-creator talking points and pitch angles included. Start with Tier 1 (alpha testers), then Tier 2 (profitable switchers)
195 +
196 + ---
217 197
218 198 ---
219 199
@@ -264,7 +244,7 @@
264 244 - [ ] Remux where possible (H.264 in MOV -> H.264 in MP4, zero quality loss)
265 245 - [ ] Auto-generated thumbnails (ffmpeg frame extraction at configurable timestamp)
266 246
267 - #### Phase 14E-5: Streaming Tier Features
247 + #### Phase 14E-5: Everything Tier Features
268 248 - [ ] Adaptive bitrate streaming (HLS/DASH) — multiple quality levels per video
269 249 - [ ] Audio: FLAC + Opus 128 + Opus 64 quality ladder
270 250 - [ ] Video: original + 1080p + 720p + 480p quality ladder (VP9 or AV1)
@@ -318,14 +298,10 @@
318 298 Weak points identified vs Ko-fi. Ordered by effort/impact.
319 299
320 300 #### Easy Wins
321 - - [x] Tips/donations — accept one-time payments without a product attached
322 - - [x] Revenue splits — record split obligations on purchases/tips for multi-author projects
323 - - [ ] Embeddable widgets — buy button / audio preview / checkout popup for external sites (Ko-fi's embed model is how many creators discover the platform)
324 301 - [ ] Fundraising goals — display campaign target + progress bar on project page (simple DB field + UI, high engagement signal)
325 302
326 303 #### Medium Effort
327 304 - [ ] Commissions — listing with portfolio, slot limits, client messaging, upfront payment (Ko-fi has full workflow; artists expect this)
328 - - [ ] Physical product listings — already planned above in Phase 20C
329 305
330 306 #### Structural Gaps (acknowledged, not urgent)
331 307 - [ ] Zero-cost entry — Ko-fi free tier costs $0 and takes 0% on tips. MNW's minimum is $10/mo. Earn-back credit softens this but doesn't eliminate the barrier for artists earning nothing yet. No action needed — this is a deliberate model difference, not a bug.
@@ -343,7 +319,7 @@
343 319 ### Phase 21: Scheduled Content — Remaining
344 320 - [ ] Pre-save + pre-order, countdown display, calendar view
345 321
346 - ### Phase 22: Streaming
322 + ### Phase 22: Live Streaming (Everything tier)
347 323 - [ ] Trigger: >500 creators, stable 1yr
348 324
349 325 ### Phase 23: DSP
@@ -399,17 +375,9 @@
399 375 - [ ] MNW: OG metadata for item/project pages (social sharing cards)
400 376 - [ ] MNW blog posts: auto-preview linked URLs (same as MT)
401 377
402 - ### Type Safety — Remaining
403 - - [ ] `PriceCents(i32)` newtype
404 -
405 - ### Reconsider
406 - - [ ] Cloudflare Email Address Obfuscation (currently OFF — was mangling git clone URLs)
407 378
408 379 ---
409 380
410 - ## Audit Items
411 - - [ ] Verify Postmark DKIM selector `20170907043118pm` in Postmark dashboard (returned empty in Run 6 DNS check)
412 -
413 381 ## Dependencies (blocked on upstream)
414 382 - [ ] Monitor yara-x for wasmtime >=42.0.2 (11 CVEs including 2 critical — RUSTSEC-2026-0095, -0096)
415 383 - [ ] Monitor aws-sdk-s3 for lru fix (RUSTSEC-2026-0002)
@@ -419,7 +387,6 @@
419 387 ## Deferred
420 388 - [ ] Corporate structure: holding company (Makecreative Holdings LLC) with subsidiary LLCs for liability isolation if itsall.work launches. Setup checklist, Stripe contingency plan, entity details documented.
421 389 - [ ] Revenue-share crowdfunding: enable creators to fund projects by selling future revenue shares. 5-phase plan (MVP, controlled rollout, platform features, Reg CF compliance, full launch). Requires securities attorney consultation (~$5K) as first step. Year 1 cost ~$80K, separate from core MNW ops. See financial_dashboard.md.
422 - - [ ] sqlx offline mode
423 390 - [ ] Team/organization accounts
424 391 - [ ] Creator @makenot.work email addresses (forwarding-only to creator's real email, vanity address as premium feature). Migadu Mini ($90/yr) for business email; creator addresses via forwarding aliases on Maxi plan or lightweight relay. No mailbox hosting for creators.
425 392 - [ ] Tax-year revenue summary, invoice generation, 1099 guidance
@@ -429,7 +396,6 @@
429 396 - [ ] Podcast private RSS feeds (per-subscriber unique RSS, Spotify integration — Patreon/Substack have this)
430 397 - [ ] OG image generation
431 398 - [ ] UTM parameter tracking
432 - - [ ] Notification digest preferences, in-app notification center
433 399 - [ ] Blog post revision history
434 400 - [ ] Series/serial ordering, reading progress
435 401 - [ ] Traffic/referrer tracking
@@ -444,11 +410,11 @@
444 410 lib.rs, main.rs, config.rs, error.rs, auth.rs, db/
445 411 storage.rs, payments/, templates/, routes/
446 412 git/, git_issues/, synckit_auth.rs, build_runner.rs, validation/
447 - fingerprint/ (registry, visible stamps, watermarks, streaming)
413 + license_templates.rs (license presets for items)
448 414 import/ (CSV converter, pipeline, intermediate format)
449 415 MNW/server/tests/
450 416 integration.rs, harness/, workflows/*.rs
451 - MNW/server/migrations/ (001-070)
417 + MNW/server/migrations/ (001-080)
452 418 MNW/server/templates/
453 419 MNW/server/deploy/
454 420 MNW/server/site-docs/public/, MNW/server/site-docs/unpublished/
@@ -459,4 +425,4 @@
459 425 ```
460 426
461 427 ## Deps
462 - sqlx 0.8, uuid 1, chrono 0.4, argon2 0.5, tower-sessions 0.15, docengine (path dep, replaces pulldown-cmark + ammonia), aws-sdk-s3 1, async-stripe 0.37, reqwest 0.12, postmark (live), webauthn-rs 0.5
428 + sqlx 0.8, uuid 1, chrono 0.4, argon2 0.5, tower-sessions 0.14 (store 0.15), docengine (path dep), s3-storage (path dep, wraps aws-sdk-s3 1), async-stripe 0.37, reqwest 0.12, postmark (live), webauthn-rs 0.5