English
English
Appearance
English
English
Appearance
Started 2026-09-11. Reason: SaaS is deeply unprofitable at current scale — 3 real paying customers ($43/mo MRR) against $450–700/mo AWS run-rate, and the free-tier is dominated by abuse ("most users just want to use IPFS for cracking"). Rather than pursue growth, we're winding down the SaaS wrapper and running a minimal service for the remaining paying customers only.
| GUID | Plan | Notes | |
|---|---|---|---|
b428d488-e071-70f4-ad7e-bdd36405ea38 | karma | daniel-CEO@DPMF.Technology (Daniel Monks) | Active daily |
c418d448-d071-7081-b73e-8b675e1330cb | karma | saori22nishida@gmail.com (saori) | 15 days idle but subscribed |
74888468-70e1-7005-1119-63a75ebee6b0 | bodhi | info@tatout.io (Simon) | Zero activity — verify still valid |
14c80498-d0f1-7066-e64a-878b1a035ffd | nirvana | ignacio.coll+ipfstest_1@gmail.com (Ignacio Test) | Internal test account, not real revenue |
d4980408-f0d1-70da-9caa-2def95069904 | bodhi (TRIAL) | muhammadolawale27@gmail.com (Muhammad) | Added 2026-09-11 — trial user with a working 10k-file snapshot (TK-1789031159249). Kept because his ticket was resolved yesterday with a live snapshot CID. Re-evaluate at trial expiry (~2026-09-16) |
If this list changes: update all four places (they're all hardcoded because Lambda@Edge doesn't support env vars):
src/BWS-IPFS-Apex_gateway.mjs → KEEP_USER_GUIDSsrc/@common/shared.mjs → SUNSET_KEEP_USER_GUIDSsrc/BWS-IPFS-User_presignup.mjs — early-return with a friendly error when SIGNUPS_DISABLED=1src/BWS-IPFS-Apex_gateway.mjs — ddbAttributed() now projects USER_GUID and returns true only if that GUID is in KEEP_USER_GUIDS. All other CIDs get the existing branded 410 pagesrc/@common/shared.mjs — validateStorage() throws CreditsError with a "service is winding down" message when SUNSET_UPLOADS_LOCKED=1 and the caller isn't in the KEEP setfrontend/src/pages/SignUpPage.tsx — renders a "signups are closed" notice when SUNSET_MODE=trueSIGNUPS_DISABLED=1 on prod-bws-api-ipfs-upload-User-PresignupSUNSET_UPLOADS_LOCKED=1 — Globals section, so every Serverless::Function inherits it; live on New-Call, New-Api-Call, Upload-Large-Init, Upload-Large-Complete, Pin-CID-Call, Folder-Snapshot-CallSUNSET_CHECKOUT_LOCKED=1 on prod-bws-api-ipfs-upload-Stripe-Checkout-Call — rejects every new checkout attempt. Portal + webhook + reconciler are untouched so existing paying customers can still manage or cancel their subscription and Stripe continues to bill them normally.Kept: billing, health, safety-net (badbits, pin-safety-scan, threat-hash-import), paying-user maintenance (gateway-bandwidth, ipns-republish, pin-resolve, storage/bandwidth-reconcile), ops (auto-code-deploy-watcher, codepipeline-failure, deploy-status-updater, cost-rate-watcher, stripe-reconciler, manual-grant-reconciler).
Disabled:
Re-enable = aws events enable-rule --name <name> per rule.
bafybeifxyvxwao3xxgbof5qgfegvdyxqb5wbzun4ybh5pyr6q7huhjw65i) will 410 after cache expiry because he's on trial (not KEEP). Since his files were snapshotted yesterday and he's a trial-only user, that's intended behavior once the sunset takes effectNot started. Four emails to write:
Not started. 30-day CAR-export window before purge.
Not started. Delete every non-KEEP user's files, folders, keys, gateways, IPNS keys, upload tokens; Kubo pin/rm + repo/gc on their CIDs.
Not started. ECS 3 → 1 task, drop unused CloudFront distributions, drop DDB tables (e2e-runs, behavior-events, seo-tracking, health-history, deploy-status, ip-reputation, retention counters, campaign-visits, rate-limit-events), delete inactive Secrets, delete acquisition Lambdas + their CloudWatch alarms + their scheduled rules from IaC.
Every P4 cut needs its own CLAUDE.md-compliant cost analysis and explicit approval before executing.
Target run-rate: ~$50–80/mo serving 3–5 paying customers.
If the shutdown reverses (a big customer signs, a different strategy emerges):
SIGNUPS_DISABLED= (empty) on prod-bws-api-ipfs-upload-User-PresignupSUNSET_UPLOADS_LOCKED= (empty) on the Globals block of node-lambdas.yml and redeploy (or empty on each affected Lambda directly)SUNSET_MODE = false in frontend/src/pages/SignUpPage.tsx and redeployApex_gateway.mjs, revert ddbAttributed() to the pre-sunset shape (delete the KEEP_USER_GUIDS gate)aws events enable-rule --name <n> eachPost-P0 audit (see SUNSET_AUDIT_2026-09-11.md) surfaced that Kubo's libp2p swarm port and one unaliased CloudFront distribution were still unmetered vectors. Fixes shipped immediately, all reversible:
tcp 4001 0.0.0.0/0 from Kubo task security group sg-016d22e417aae3c25aws ec2 authorize-security-group-ingress --group-id sg-016d22e417aae3c25 --protocol tcp --port 4001 --cidr 0.0.0.0/0E2V22RZSULORO9 (no alias, direct ALB backend) — flipped Enabled=falseIPFS_URL secret was found still pointing at d39la1r504sgpg.cloudfront.net (this distribution's domain). Every New-Api-Call invocation was failing with getaddrinfo ENOTFOUND after ~5s and returning 500 to the caller — 382 failures in a 2h window drove prod-lambda-total-duration-velocity into ALARM. The KEEP-only apex gate + SUNSET_UPLOADS_LOCKED cover the BW-leak risk this distribution was originally hardened against, so re-enabling is safe under sunset. Watch AWS/CloudFront BytesDownloaded on E2V22RZSULORO9 — it should stay near zero because no alias points at it and only our own Lambdas call its domain.prod-total-monthly: $3500 → $500prod-cloudfront-monthly: $4000 → $50bws-nodes-prod_200-cost $1000, prod-account-hardstop $10000prod-kubo-swarm-tx-anomalyECS/ContainerInsights NetworkTxBytes on bws-nodes-ipfs-cluster, sum > 2 GB in 5 minprod-platform-kill-switch SNS topic (alarm AND ok state changes) → same channel that already reaches the operator on other kill-switch eventsThe purge script now lives at scripts/sunset/purge-non-keep.sh. Three modes:
dry-run — safe, prints counts (# users to purge, # CIDs to unpin, GB reclaimed)commit — destructive, guarded by both a date check (refuses before 2026-10-11) and a typed 'PURGE' confirmation; sets FORCE=1 to override the date checkverify — post-purge sanity: sample-fetches each KEEP customer's newest CID and reports HTTP statusThe date guard is important: our sunset emails told non-paying users they had a 30-day CAR-export window after the 2026-09-11 shutdown communication. 2026-10-11 is the earliest we should run commit. Running the script dry-run any time is safe.