From d09b11c35b5d2c450e5b9bfc311c77ab9366c3b6 Mon Sep 17 00:00:00 2001 From: rback37 Date: Tue, 4 Aug 2026 14:35:30 +0800 Subject: [PATCH 1/3] Publish source and community builder gateway --- .github/DISCUSSION_TEMPLATE/builder-idea.yml | 35 + .../translation-cohort.yml | 37 + .github/ISSUE_TEMPLATE/bug_report.yml | 54 + .github/ISSUE_TEMPLATE/config.yml | 8 + .github/ISSUE_TEMPLATE/product_feedback.yml | 42 + .github/ISSUE_TEMPLATE/translation_review.yml | 37 + .gitignore | 44 + .openai/hosting.json | 5 + BETA_RECRUITMENT.md | 158 + CODE_OF_CONDUCT.md | 51 +- CONTRIBUTING.md | 52 +- GLOBAL_DEPLOYMENT_AND_AI_REGIONS.md | 80 + GOVERNANCE.md | 27 + LICENSE | 662 + PRODUCT_PLAN.md | 311 + PROJECT_PROGRESS.md | 320 + README.md | 23 +- SECURITY.md | 43 +- SHORE_VALUE_PET_COMMUNITY_SYSTEM.md | 106 + SUPPORT.md | 27 + WORLD_GROWTH_SYSTEM.md | 107 + app/AboutPage.tsx | 65 + app/AccountGate.tsx | 235 + app/AccountPanel.tsx | 118 + app/AdminCommunityPanel.tsx | 165 + app/BetaAdminPanel.tsx | 96 + app/CommunityPanel.tsx | 237 + app/ContributePage.tsx | 105 + app/DebtWorldGame.tsx | 1873 +++ app/FeedbackPanel.tsx | 86 + app/OwnerAdminDashboard.tsx | 304 + app/SafetyCenter.tsx | 69 + app/TurnstileWidget.tsx | 99 + app/VaultPanel.tsx | 361 + app/about/page.tsx | 10 + app/admin/page.tsx | 9 + app/api/account/route.ts | 127 + app/api/admin/beta/route.ts | 294 + app/api/admin/community/route.ts | 166 + app/api/admin/session/route.ts | 23 + app/api/advisor/route.ts | 31 + app/api/analytics/route.ts | 64 + app/api/beta/feedback/route.ts | 36 + app/api/beta/route.ts | 21 + app/api/community/route.ts | 432 + app/api/debts/route.ts | 150 + app/api/payments/route.ts | 124 + app/api/progress/route.ts | 13 + app/api/rates/route.ts | 37 + app/api/referral/route.ts | 13 + app/api/security/route.ts | 8 + app/api/vault/route.ts | 331 + app/chatgpt-auth.ts | 86 + app/contribute/page.tsx | 10 + app/en/about/page.tsx | 10 + app/en/contribute/page.tsx | 10 + app/en/layout.tsx | 17 + app/en/page.tsx | 13 + app/en/safety/page.tsx | 10 + app/globals.css | 1473 ++ app/layout.tsx | 52 + app/page.tsx | 5 + app/robots.ts | 9 + app/safety/page.tsx | 10 + app/sitemap.ts | 16 + build/sites-vite-plugin.ts | 45 + db/index.ts | 19 + db/schema.ts | 514 + drizzle.config.ts | 7 + drizzle/0000_oval_jocasta.sql | 48 + drizzle/0001_sad_wendell_vaughn.sql | 81 + drizzle/0002_pink_next_avengers.sql | 4 + drizzle/0003_tough_black_bird.sql | 1 + drizzle/0004_skinny_xavin.sql | 1 + drizzle/0005_curious_ultragirl.sql | 60 + drizzle/0006_supreme_james_howlett.sql | 14 + drizzle/0007_faulty_nova.sql | 26 + drizzle/0008_shiny_squirrel_girl.sql | 11 + drizzle/0009_numerous_marvex.sql | 13 + drizzle/0010_opposite_solo.sql | 4 + drizzle/0011_bent_black_knight.sql | 39 + drizzle/0012_overrated_alex_power.sql | 59 + drizzle/0013_faithful_silverclaw.sql | 8 + drizzle/0014_sad_pestilence.sql | 68 + drizzle/0015_steep_praxagora.sql | 1 + drizzle/0016_icy_magdalene.sql | 2 + drizzle/0017_last_hellcat.sql | 15 + drizzle/meta/0000_snapshot.json | 355 + drizzle/meta/0001_snapshot.json | 946 ++ drizzle/meta/0002_snapshot.json | 978 ++ drizzle/meta/0003_snapshot.json | 986 ++ drizzle/meta/0004_snapshot.json | 994 ++ drizzle/meta/0005_snapshot.json | 1439 ++ drizzle/meta/0006_snapshot.json | 1412 ++ drizzle/meta/0007_snapshot.json | 1594 +++ drizzle/meta/0008_snapshot.json | 1671 +++ drizzle/meta/0009_snapshot.json | 1764 +++ drizzle/meta/0010_snapshot.json | 1793 +++ drizzle/meta/0011_snapshot.json | 2052 +++ drizzle/meta/0012_snapshot.json | 2446 ++++ drizzle/meta/0013_snapshot.json | 2510 ++++ drizzle/meta/0014_snapshot.json | 3010 +++++ drizzle/meta/0015_snapshot.json | 3018 +++++ drizzle/meta/0016_snapshot.json | 3046 +++++ drizzle/meta/0017_snapshot.json | 3149 +++++ drizzle/meta/_journal.json | 132 + eslint.config.mjs | 18 + examples/d1/app/api/notes/route.ts | 58 + examples/d1/db/schema.ts | 9 + launch-kit/CHANNEL_PLAYBOOK.md | 160 + launch-kit/DAILY_GROWTH_OPERATIONS.md | 389 + launch-kit/FOUNDING_BUILDER_ISSUES_2026-08.md | 164 + launch-kit/GITHUB_BUILD_LOG_2026-08-04.md | 54 + launch-kit/GITHUB_GROWTH_ROUND_1.md | 77 + launch-kit/GITHUB_PUBLIC_README_DRAFT.md | 108 + launch-kit/GITHUB_PUBLIC_README_FINAL.md | 102 + launch-kit/GITHUB_README_GROWTH_INSERT.md | 45 + launch-kit/GITHUB_RELEASE_PUBLIC_BETA_0_1.md | 59 + launch-kit/IMAGE_PROMPTS.md | 20 + launch-kit/PRESS_KIT_ZH_EN.md | 196 + launch-kit/PRODUCT_INTRO_SHORT.md | 9 + launch-kit/PUBLIC_BETA_CHECKLIST.md | 55 + launch-kit/README.md | 47 + launch-kit/REDDIT_FOUNDER_STORY_2026-08-03.md | 78 + launch-kit/REDDIT_LAUNCH_KIT.md | 121 + launch-kit/SOCIAL_COPY_ZH_EN.md | 151 + launch-kit/X_LAUNCH_KIT.md | 139 + .../assets/debt-world-avatar-v1-github.jpg | Bin 0 -> 137296 bytes launch-kit/assets/debt-world-avatar-v1.png | Bin 0 -> 1489939 bytes .../daily-social/2026-08-01-shared-world.png | Bin 0 -> 2344334 bytes .../2026-08-02-multi-debt-cashflow.png | Bin 0 -> 2029357 bytes .../2026-08-03-repayment-changes-world.png | Bin 0 -> 2130778 bytes .../daily-social/2026-08-04-feature.png | Bin 0 -> 2180482 bytes launch-kit/demo-gif/README_INSERT.md | 9 + .../debt-world-walkthrough-contact-sheet.jpg | Bin 0 -> 139603 bytes .../debt-world-walkthrough-preview.png | Bin 0 -> 252239 bytes .../demo-gif/debt-world-walkthrough.gif | Bin 0 -> 4112081 bytes launch-kit/images/debt-world-global-hero.png | Bin 0 -> 2440749 bytes .../images/debt-world-journey-vertical.png | Bin 0 -> 2719287 bytes .../images/debt-world-public-beta-en.png | Bin 0 -> 2512998 bytes .../images/debt-world-social-square.png | Bin 0 -> 2509295 bytes launch-kit/images/og-v2.png | Bin 0 -> 2358521 bytes launch-kit/images/og.png | Bin 0 -> 2448334 bytes lib/account-server.ts | 386 + lib/advisor-server.ts | 703 + lib/beta-server.ts | 120 + lib/community-safety.ts | 113 + lib/country-currency.ts | 78 + lib/debt-world-types.ts | 138 + lib/exchange-rates.ts | 62 + lib/referral-server.ts | 138 + lib/safety-policy.ts | 11 + lib/shore-value-server.ts | 53 + lib/turnstile-server.ts | 93 + lib/vault-server.ts | 578 + next.config.ts | 7 + package-lock.json | 11216 ++++++++++++++++ package.json | 45 + postcss.config.mjs | 7 + public/favicon.svg | 6 + public/file.svg | 1 + public/globe.svg | 1 + public/launch/2026-08-04-kian-pressure.png | Bin 0 -> 2180482 bytes public/og-beta.png | Bin 0 -> 2319958 bytes public/robots.txt | 6 + public/sitemap.xml | 39 + public/window.svg | 1 + tests/rendered-html.test.mjs | 863 ++ tsconfig.json | 34 + vite.config.ts | 59 + worker-configuration.d.ts | 32 + worker/index.ts | 47 + 172 files changed, 60855 insertions(+), 37 deletions(-) create mode 100644 .github/DISCUSSION_TEMPLATE/builder-idea.yml create mode 100644 .github/DISCUSSION_TEMPLATE/translation-cohort.yml create mode 100644 .github/ISSUE_TEMPLATE/bug_report.yml create mode 100644 .github/ISSUE_TEMPLATE/config.yml create mode 100644 .github/ISSUE_TEMPLATE/product_feedback.yml create mode 100644 .github/ISSUE_TEMPLATE/translation_review.yml create mode 100644 .gitignore create mode 100644 .openai/hosting.json create mode 100644 BETA_RECRUITMENT.md create mode 100644 GLOBAL_DEPLOYMENT_AND_AI_REGIONS.md create mode 100644 GOVERNANCE.md create mode 100644 LICENSE create mode 100644 PRODUCT_PLAN.md create mode 100644 PROJECT_PROGRESS.md create mode 100644 SHORE_VALUE_PET_COMMUNITY_SYSTEM.md create mode 100644 SUPPORT.md create mode 100644 WORLD_GROWTH_SYSTEM.md create mode 100644 app/AboutPage.tsx create mode 100644 app/AccountGate.tsx create mode 100644 app/AccountPanel.tsx create mode 100644 app/AdminCommunityPanel.tsx create mode 100644 app/BetaAdminPanel.tsx create mode 100644 app/CommunityPanel.tsx create mode 100644 app/ContributePage.tsx create mode 100644 app/DebtWorldGame.tsx create mode 100644 app/FeedbackPanel.tsx create mode 100644 app/OwnerAdminDashboard.tsx create mode 100644 app/SafetyCenter.tsx create mode 100644 app/TurnstileWidget.tsx create mode 100644 app/VaultPanel.tsx create mode 100644 app/about/page.tsx create mode 100644 app/admin/page.tsx create mode 100644 app/api/account/route.ts create mode 100644 app/api/admin/beta/route.ts create mode 100644 app/api/admin/community/route.ts create mode 100644 app/api/admin/session/route.ts create mode 100644 app/api/advisor/route.ts create mode 100644 app/api/analytics/route.ts create mode 100644 app/api/beta/feedback/route.ts create mode 100644 app/api/beta/route.ts create mode 100644 app/api/community/route.ts create mode 100644 app/api/debts/route.ts create mode 100644 app/api/payments/route.ts create mode 100644 app/api/progress/route.ts create mode 100644 app/api/rates/route.ts create mode 100644 app/api/referral/route.ts create mode 100644 app/api/security/route.ts create mode 100644 app/api/vault/route.ts create mode 100644 app/chatgpt-auth.ts create mode 100644 app/contribute/page.tsx create mode 100644 app/en/about/page.tsx create mode 100644 app/en/contribute/page.tsx create mode 100644 app/en/layout.tsx create mode 100644 app/en/page.tsx create mode 100644 app/en/safety/page.tsx create mode 100644 app/globals.css create mode 100644 app/layout.tsx create mode 100644 app/page.tsx create mode 100644 app/robots.ts create mode 100644 app/safety/page.tsx create mode 100644 app/sitemap.ts create mode 100644 build/sites-vite-plugin.ts create mode 100644 db/index.ts create mode 100644 db/schema.ts create mode 100644 drizzle.config.ts create mode 100644 drizzle/0000_oval_jocasta.sql create mode 100644 drizzle/0001_sad_wendell_vaughn.sql create mode 100644 drizzle/0002_pink_next_avengers.sql create mode 100644 drizzle/0003_tough_black_bird.sql create mode 100644 drizzle/0004_skinny_xavin.sql create mode 100644 drizzle/0005_curious_ultragirl.sql create mode 100644 drizzle/0006_supreme_james_howlett.sql create mode 100644 drizzle/0007_faulty_nova.sql create mode 100644 drizzle/0008_shiny_squirrel_girl.sql create mode 100644 drizzle/0009_numerous_marvex.sql create mode 100644 drizzle/0010_opposite_solo.sql create mode 100644 drizzle/0011_bent_black_knight.sql create mode 100644 drizzle/0012_overrated_alex_power.sql create mode 100644 drizzle/0013_faithful_silverclaw.sql create mode 100644 drizzle/0014_sad_pestilence.sql create mode 100644 drizzle/0015_steep_praxagora.sql create mode 100644 drizzle/0016_icy_magdalene.sql create mode 100644 drizzle/0017_last_hellcat.sql create mode 100644 drizzle/meta/0000_snapshot.json create mode 100644 drizzle/meta/0001_snapshot.json create mode 100644 drizzle/meta/0002_snapshot.json create mode 100644 drizzle/meta/0003_snapshot.json create mode 100644 drizzle/meta/0004_snapshot.json create mode 100644 drizzle/meta/0005_snapshot.json create mode 100644 drizzle/meta/0006_snapshot.json create mode 100644 drizzle/meta/0007_snapshot.json create mode 100644 drizzle/meta/0008_snapshot.json create mode 100644 drizzle/meta/0009_snapshot.json create mode 100644 drizzle/meta/0010_snapshot.json create mode 100644 drizzle/meta/0011_snapshot.json create mode 100644 drizzle/meta/0012_snapshot.json create mode 100644 drizzle/meta/0013_snapshot.json create mode 100644 drizzle/meta/0014_snapshot.json create mode 100644 drizzle/meta/0015_snapshot.json create mode 100644 drizzle/meta/0016_snapshot.json create mode 100644 drizzle/meta/0017_snapshot.json create mode 100644 drizzle/meta/_journal.json create mode 100644 eslint.config.mjs create mode 100644 examples/d1/app/api/notes/route.ts create mode 100644 examples/d1/db/schema.ts create mode 100644 launch-kit/CHANNEL_PLAYBOOK.md create mode 100644 launch-kit/DAILY_GROWTH_OPERATIONS.md create mode 100644 launch-kit/FOUNDING_BUILDER_ISSUES_2026-08.md create mode 100644 launch-kit/GITHUB_BUILD_LOG_2026-08-04.md create mode 100644 launch-kit/GITHUB_GROWTH_ROUND_1.md create mode 100644 launch-kit/GITHUB_PUBLIC_README_DRAFT.md create mode 100644 launch-kit/GITHUB_PUBLIC_README_FINAL.md create mode 100644 launch-kit/GITHUB_README_GROWTH_INSERT.md create mode 100644 launch-kit/GITHUB_RELEASE_PUBLIC_BETA_0_1.md create mode 100644 launch-kit/IMAGE_PROMPTS.md create mode 100644 launch-kit/PRESS_KIT_ZH_EN.md create mode 100644 launch-kit/PRODUCT_INTRO_SHORT.md create mode 100644 launch-kit/PUBLIC_BETA_CHECKLIST.md create mode 100644 launch-kit/README.md create mode 100644 launch-kit/REDDIT_FOUNDER_STORY_2026-08-03.md create mode 100644 launch-kit/REDDIT_LAUNCH_KIT.md create mode 100644 launch-kit/SOCIAL_COPY_ZH_EN.md create mode 100644 launch-kit/X_LAUNCH_KIT.md create mode 100644 launch-kit/assets/debt-world-avatar-v1-github.jpg create mode 100644 launch-kit/assets/debt-world-avatar-v1.png create mode 100644 launch-kit/daily-social/2026-08-01-shared-world.png create mode 100644 launch-kit/daily-social/2026-08-02-multi-debt-cashflow.png create mode 100644 launch-kit/daily-social/2026-08-03-repayment-changes-world.png create mode 100644 launch-kit/daily-social/2026-08-04-feature.png create mode 100644 launch-kit/demo-gif/README_INSERT.md create mode 100644 launch-kit/demo-gif/debt-world-walkthrough-contact-sheet.jpg create mode 100644 launch-kit/demo-gif/debt-world-walkthrough-preview.png create mode 100644 launch-kit/demo-gif/debt-world-walkthrough.gif create mode 100644 launch-kit/images/debt-world-global-hero.png create mode 100644 launch-kit/images/debt-world-journey-vertical.png create mode 100644 launch-kit/images/debt-world-public-beta-en.png create mode 100644 launch-kit/images/debt-world-social-square.png create mode 100644 launch-kit/images/og-v2.png create mode 100644 launch-kit/images/og.png create mode 100644 lib/account-server.ts create mode 100644 lib/advisor-server.ts create mode 100644 lib/beta-server.ts create mode 100644 lib/community-safety.ts create mode 100644 lib/country-currency.ts create mode 100644 lib/debt-world-types.ts create mode 100644 lib/exchange-rates.ts create mode 100644 lib/referral-server.ts create mode 100644 lib/safety-policy.ts create mode 100644 lib/shore-value-server.ts create mode 100644 lib/turnstile-server.ts create mode 100644 lib/vault-server.ts create mode 100644 next.config.ts create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 postcss.config.mjs create mode 100644 public/favicon.svg create mode 100644 public/file.svg create mode 100644 public/globe.svg create mode 100644 public/launch/2026-08-04-kian-pressure.png create mode 100644 public/og-beta.png create mode 100644 public/robots.txt create mode 100644 public/sitemap.xml create mode 100644 public/window.svg create mode 100644 tests/rendered-html.test.mjs create mode 100644 tsconfig.json create mode 100644 vite.config.ts create mode 100644 worker-configuration.d.ts create mode 100644 worker/index.ts diff --git a/.github/DISCUSSION_TEMPLATE/builder-idea.yml b/.github/DISCUSSION_TEMPLATE/builder-idea.yml new file mode 100644 index 0000000..7c68a4f --- /dev/null +++ b/.github/DISCUSSION_TEMPLATE/builder-idea.yml @@ -0,0 +1,35 @@ +title: "[World idea] " +body: + - type: markdown + attributes: + value: | + Propose one small, privacy-safe improvement to Debt World. Do not include real financial records, identity details, credentials, or private conversations. + - type: textarea + id: problem + attributes: + label: What problem does this solve? + description: Describe one user or contributor problem without personal financial details. + placeholder: A new contributor cannot tell which task is safe to start... + validations: + required: true + - type: textarea + id: proposal + attributes: + label: Smallest useful version + description: What is the smallest change that would test the idea? + validations: + required: true + - type: textarea + id: risk + attributes: + label: Privacy, abuse, and deletion considerations + description: What could expose someone, be gamed, shame users, or become hard to remove? + validations: + required: true + - type: checkboxes + id: safety + attributes: + label: Safety check + options: + - label: This proposal contains no real user data, exact personal finances, credentials, or private conversations. + required: true diff --git a/.github/DISCUSSION_TEMPLATE/translation-cohort.yml b/.github/DISCUSSION_TEMPLATE/translation-cohort.yml new file mode 100644 index 0000000..77fa32d --- /dev/null +++ b/.github/DISCUSSION_TEMPLATE/translation-cohort.yml @@ -0,0 +1,37 @@ +title: "[Language cohort] " +body: + - type: markdown + attributes: + value: | + Start or join a small language and regional review cohort. Reviewers improve clarity and dignity; they do not provide individual legal or financial advice. + - type: input + id: language + attributes: + label: Language and broad region + placeholder: Spanish · Latin America + validations: + required: true + - type: dropdown + id: contribution + attributes: + label: What can you review? + options: + - Interface translation + - Regional debt categories + - Tone and anti-shaming language + - Accessibility and reading level + - Public/nonprofit resource wording + validations: + required: true + - type: textarea + id: context + attributes: + label: Relevant experience + description: Optional. Share only what is safe and relevant; do not post personal financial records. + - type: checkboxes + id: boundaries + attributes: + label: Boundaries + options: + - label: I will not post identifiable user data, exact personal finances, credentials, or private conversations. + required: true diff --git a/.github/ISSUE_TEMPLATE/bug_report.yml b/.github/ISSUE_TEMPLATE/bug_report.yml new file mode 100644 index 0000000..e9db9fa --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.yml @@ -0,0 +1,54 @@ +name: Bug report / 故障报告 +description: Report a reproducible product problem without including private financial data. +title: "[Bug] " +labels: ["bug", "needs-triage"] +body: + - type: markdown + attributes: + value: | + Do not include passwords, recovery codes, exact debt amounts, bank details, identity documents, complete statements, or another person's information. + 请勿提交密码、恢复码、精确债务金额、银行卡、身份证件、完整账单或他人信息。 + - type: dropdown + id: area + attributes: + label: Area / 区域 + options: + - Account or login / 账号登录 + - Debt setup or editing / 债务录入编辑 + - Payments or progress / 还款进度 + - World or character / 世界角色 + - AI guide / 小岸 AI + - Community or moderation / 社区审核 + - Privacy, export, or deletion / 隐私导出删除 + - Translation or accessibility / 翻译无障碍 + - Other / 其他 + validations: + required: true + - type: textarea + id: steps + attributes: + label: Steps to reproduce / 复现步骤 + description: Use fictional or rounded example data only. + placeholder: "1. Open…\n2. Select…\n3. The page…" + validations: + required: true + - type: textarea + id: expected + attributes: + label: Expected and actual result / 预期与实际结果 + validations: + required: true + - type: input + id: environment + attributes: + label: Device and browser / 设备与浏览器 + placeholder: "Example: Android 15, Chrome 138" + validations: + required: true + - type: checkboxes + id: privacy + attributes: + label: Privacy confirmation / 隐私确认 + options: + - label: I removed all real financial and identity data from this report. / 我已移除所有真实财务和身份数据。 + required: true diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 0000000..f6568ea --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,8 @@ +blank_issues_enabled: false +contact_links: + - name: Safety and privacy / 安全与隐私 + url: https://debt-atlas-world.f2xdes.chatgpt.site/en/safety + about: Read the data, deletion, community, and professional-advice boundaries before reporting. + - name: 中文安全中心 + url: https://debt-atlas-world.f2xdes.chatgpt.site/safety + about: 提交前请先阅读数据、删除、社区和专业建议边界。 diff --git a/.github/ISSUE_TEMPLATE/product_feedback.yml b/.github/ISSUE_TEMPLATE/product_feedback.yml new file mode 100644 index 0000000..7a044eb --- /dev/null +++ b/.github/ISSUE_TEMPLATE/product_feedback.yml @@ -0,0 +1,42 @@ +name: Product feedback / 产品反馈 +description: Tell us what felt confusing, judgmental, unsafe, or unexpectedly helpful. +title: "[Feedback] " +labels: ["feedback", "needs-triage"] +body: + - type: markdown + attributes: + value: | + Specific discomfort is more useful than general praise. Never post exact financial or identity data here. + 具体的不舒服比笼统的夸奖更有用。请勿在这里发布精确财务或身份数据。 + - type: dropdown + id: feeling + attributes: + label: What best describes this feedback? / 反馈类型 + options: + - I could not understand a step / 某一步看不懂 + - Something felt judgmental or anxiety-inducing / 感到被评判或更焦虑 + - I did not trust a privacy boundary / 不信任某个隐私边界 + - A feature did not match real life / 功能与现实不符 + - Something helped me see the situation clearly / 某处确实更清楚 + - Accessibility or readability problem / 无障碍或可读性问题 + - Other / 其他 + validations: + required: true + - type: textarea + id: moment + attributes: + label: What happened? / 发生了什么 + description: Describe the exact screen or sentence using fictional or rounded amounts. + validations: + required: true + - type: textarea + id: change + attributes: + label: What would make it better? / 希望怎样改 + - type: checkboxes + id: privacy + attributes: + label: Privacy confirmation / 隐私确认 + options: + - label: I removed all real financial and identity data. / 我已移除所有真实财务和身份数据。 + required: true diff --git a/.github/ISSUE_TEMPLATE/translation_review.yml b/.github/ISSUE_TEMPLATE/translation_review.yml new file mode 100644 index 0000000..b47e6aa --- /dev/null +++ b/.github/ISSUE_TEMPLATE/translation_review.yml @@ -0,0 +1,37 @@ +name: Translation review / 翻译校对 +description: Suggest respectful wording without exposing any user's data. +title: "[Translation] " +labels: ["translation", "needs-review"] +body: + - type: input + id: language + attributes: + label: Language and region / 语言与地区 + placeholder: "Example: Spanish (Mexico)" + validations: + required: true + - type: input + id: source + attributes: + label: Current text / 当前文字 + validations: + required: true + - type: input + id: proposed + attributes: + label: Proposed text / 建议文字 + validations: + required: true + - type: textarea + id: reason + attributes: + label: Why is this clearer or more respectful? / 为什么更清楚或更尊重 + validations: + required: true + - type: checkboxes + id: consent + attributes: + label: Confirmation / 确认 + options: + - label: This suggestion contains no real user story or financial data. / 建议中不包含真实用户故事或财务数据。 + required: true diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..398cda3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,44 @@ +# See https://help.github.com/articles/ignoring-files/ for more about ignoring files. + +# dependencies +/node_modules +/.pnp +.pnp.* +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/versions + +# testing +/coverage + +# next.js +/.next/ +/.vinext/ +/out/ + +# misc +.DS_Store +*.pem + +# debug +npm-debug.log* +yarn-debug.log* +yarn-error.log* +.pnpm-debug.log* + +# env files (can opt-in for committing if needed) +.env* + +# vercel +.vercel + +# typescript +next-env.d.ts +/dist/ +/.wrangler/ +/outputs/ +/work/ +/.npm-cache/ +/.run/ diff --git a/.openai/hosting.json b/.openai/hosting.json new file mode 100644 index 0000000..5f6042d --- /dev/null +++ b/.openai/hosting.json @@ -0,0 +1,5 @@ +{ + "project_id": "appgprj_6a699f1c065081918396772bc1936c17", + "d1": "DB", + "r2": null +} diff --git a/BETA_RECRUITMENT.md b/BETA_RECRUITMENT.md new file mode 100644 index 0000000..fbd68f1 --- /dev/null +++ b/BETA_RECRUITMENT.md @@ -0,0 +1,158 @@ +# 上岸星球:公开测试招募与运营手册 + +更新日期:2026-08-01 + +## 当前可用入口 + +- 正式网站:[https://www.debtworld.org/](https://www.debtworld.org/) +- 英文入口:[https://www.debtworld.org/en](https://www.debtworld.org/en) +- 唯一管理员后台:[https://www.debtworld.org/admin](https://www.debtworld.org/admin) +- 旧 `chatgpt.site` 地址只作为故障备用,不再作为对外主链接。 + +管理员后台现在可以直接复制中英文公开测试文案,并查看“注册账号 → 创建世界 → 录入债务 → 提交反馈”的体验漏斗。公开注册无需邀请码,保留 Turnstile、每日 100 人上限、社区审核和紧急暂停新增。 + +## 这轮公开测试要证明什么 + +首轮不是追求下载量,也不是验证“大家喜不喜欢概念”。只验证四件事: + +1. 真实用户能否在 10 分钟内看懂并录入至少一笔债务。 +2. 三种还款路线是否让人更清楚,而不是制造新的焦虑或错误确定性。 +3. 用户是否愿意在 7 天内回来确认一次余额、还款或压力变化。 +4. 用户是否信任账号登录、跨设备记录、导出和删除流程。 + +目标人数上限为 30 人,分三批开放: + +- 第 0 批:3–5 位熟人,只测试进入、账号登录、反馈和删除。 +- 第 1 批:8–12 位有不同债务类型的真实用户,连续使用 7 天。 +- 第 2 批:补到 20–30 位,覆盖中英文、手机和电脑用户,连续使用 14 天。 + +任何一批出现跨账户读取、无法删除、密码泄露、危险 AI 建议或持续无法处理的举报,立即在管理员后台暂停新增。 + +## 对外定位 + +一句话: + +> 一个可以行走的匿名债务世界。它不评判你赚得够不够体面,只帮你把压力、债务和真实还款进度放到看得见的地方。 + +必须始终说明: + +- 是早期公开测试,不是成熟金融产品。 +- 数据来自用户本人填写,未连接银行。 +- AI 只做教育性整理,不是财务顾问、律师、医生或债务减免机构。 +- 不保证“上岸”,不代办协商,不推荐贷款,不收钱。 +- 公开注册无需邀请码,但保留每日限额、人机验证、审核和紧急暂停。 + +不要使用: + +- “AI 帮你摆脱债务”“保证上岸”“最强债务规划师”。 +- “免费测算你多久还清”“替代律师/财务顾问”。 +- “谁欠得最多”“比惨”“负债排行榜”。 +- 用虚假的用户数量、成功案例或收益数字制造从众。 + +## 零预算招募顺序 + +### 1. 先从可信的一度关系开始 + +给 10–15 位你信任、且愿意直说问题的人逐一发送邀请,不在群里群发。优先找: + +- 有房贷、信用卡、学贷、亲友借款或经营债务的人。 +- 其中至少 3 位平时不熟悉新软件。 +- 至少 3 位主要使用手机。 +- 至少 2 位能用英文完成体验。 + +不要要求对方公开自己欠多少钱。可以只说“如果你刚好有债务记录需求,愿不愿意匿名试用”。 + +### 2. 使用“朋友转介绍”,但控制首轮流量 + +完成第 1 批三天后,请体验过的人只推荐一位他们信任的人。只分享正式网址,不收集对方的债务金额或联系方式。 + +### 3. 进入社区前先征求管理员许可 + +Reddit 官方帮助明确提醒,不同社区对自我推广有自己的限制;向更大的社区转发前应先联系版主,常见经验规则是大部分参与应当是正常、有帮助的内容,而不是推广。参考:[Reddit spam guidance](https://support.reddithelp.com/hc/en-us/articles/28012014962580-How-do-I-keep-spam-out-of-my-community)、[Reddit community seeding](https://support.reddithelp.com/hc/en-us/articles/15484360497812-Planting-seeds-aka-encouraging-and-maintaining-an-active-community)。 + +因此: + +- 先在相关社区真实参与,不复制粘贴同一段招募文案。 +- 先私信版主说明产品、隐私边界、首轮人数和不收费,再询问是否允许发布。 +- 不在帖子里收集债务金额、邮箱或联系方式。 +- 不向回复者推销服务;只提供官方测试链接。 + +### 4. Product Hunt、Show HN 和 GitHub 放到第二阶段 + +Product Hunt 有专门的发布准备与社区增长流程,[官方 Launch Guide](https://www.producthunt.com/launch) 适合产品已经可以承接公开访问后使用。Show HN 的基本要求是可让他人实际尝试的作品,并按 [Show HN Guidelines](https://news.ycombinator.com/showhn.html) 发布。 + +这些渠道更适合找产品反馈、技术合作者和国际早期采用者,不是第一批债务用户的主要来源。第一轮人数少、隐私敏感,应先从信任关系和得到管理员许可的社区开始。 + +## 可直接使用的邀请文案 + +### 中文私信 + +我正在做一个叫“上岸星球”的小型网页实验。它想反过来对抗社交网络里“人均富豪”的错位感:每个人用匿名小人记录自己真实的债务类型、余额、每月还款和进度,也可以看到经过审核的普通人故事。 + +现在是第一轮公开测试,不收费,也不是理财、法律或债务减免服务。没有连接银行,不需要姓名、电话、身份证或银行卡;你可以随时导出和彻底删除自己的账号与角色记录。 + +如果你刚好有债务记录需求,并且愿意直接告诉我哪里看不懂、哪里让你不舒服,我想邀请你试用 7 天。你不需要向我透露具体金额,也不需要公开分享。入口:https://www.debtworld.org/ + +### English invitation + +I’m building a small web experiment called Debt World. It pushes back against the “everyone is rich” illusion online: an anonymous game-like person can record real debt types, balances, monthly payments, and progress, while reviewed community stories show that ordinary financial pressure is not a personal failure. + +This is an early public beta, free to use, and not financial, legal, medical, or debt-relief advice. It does not connect to a bank and does not require a legal name, phone number, ID, or card details. You can export or permanently delete your account and character data at any time. + +If debt tracking is relevant to you and you’re willing to tell me what is confusing, broken, or uncomfortable, I’d like to invite you to try it for seven days. You never need to tell me your exact amount or share anything publicly. Public beta: https://www.debtworld.org/en + +## 第一次体验任务 + +只给测试者这五个任务,不要现场教他们怎么操作: + +1. 打开网页,选择国家与展示货币。 +2. 与小岸对话并录入一笔真实或经过模糊处理的债务。 +3. 创建账号和角色,进入共享大世界。 +4. 查看三种还款路线,告诉我们哪一句最难懂。 +5. 使用顶部“反馈”按钮提交一次感受,然后导出或删除测试数据。 + +如果测试者卡住,先记录卡在哪里,再提供帮助;不要提前解释到让测试失去意义。 + +## 访谈问题 + +每次控制在 15 分钟: + +1. 打开前,你以为这个网站会做什么? +2. 哪一步让你最想退出? +3. 头顶总欠款数字让你更清楚、更焦虑,还是没有感觉?为什么? +4. “高利率、最小余额、现金流安全”三种路线,你能说出区别吗? +5. 哪一项数据你最不愿意填写? +6. 登录、导出和删除是否让你更信任?哪里仍然不信任? +7. 你愿意七天后回来更新一次吗?什么提醒不会让你反感? +8. 你会把它推荐给谁?你会怎样向对方描述? + +不要问“你喜不喜欢”,要问具体发生了什么。 + +## 每日运营节奏 + +- 上午:查看私测台名额、未处理反馈、社区待审与举报。 +- 中午:只修复阻塞使用、安全或数据错误的问题,不根据一个人反馈大改方向。 +- 晚上:记录当天新用户数、完成角色人数、首笔债务人数、反馈数、删除数和异常。 +- 24 小时内处理安全反馈和举报;普通体验反馈在 72 小时内标记处理状态。 + +## 邀请阶段的关键指标 + +- 受邀打开率:收到邀请后实际打开网页的人数 / 发出邀请人数。 +- 角色创建率:创建角色并进入共享世界人数 / 打开人数。 +- 首笔债务完成率:成功保存一笔债务人数 / 打开人数。 +- 反馈完成率:提交有效反馈人数 / 完成角色人数。 +- 7 日回访率:第 7 天仍回来更新或查看的人数 / 完成角色人数。 +- 删除成功率:主动尝试删除且成功的人数 / 尝试删除人数,目标必须为 100%。 +- 严重安全事件:跨账户、无法删除、密码暴露、危险建议、未处理举报,目标必须为 0。 + +不把总债务金额、谁欠最多或 AI 对话原文作为增长指标。 + +## 我能继续代你完成的推广工作 + +- 每个平台的合规文案、帖子、评论回复和私信模板。 +- 中英文产品介绍、FAQ、发布页和社交分享图。 +- 招募名单结构、访谈脚本、每周数据复盘与版本公告。 +- 在你明确授权并连接对应账号后,协助把已确认内容发布到可用的平台。 +- 根据真实反馈修改网页、追踪问题和输出下一轮招募计划。 + +我不能冒充你建立信任、自动骚扰陌生人、伪造用户评价或绕过平台规则;涉及真实发布和私信时,最终受众与内容由你确认。 diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md index d31ec47..bb96924 100644 --- a/CODE_OF_CONDUCT.md +++ b/CODE_OF_CONDUCT.md @@ -1,19 +1,44 @@ -# Code of conduct +# Debt World community code of conduct · 上岸星球社区行为准则 -Debt World exists to reduce shame and isolation. Project spaces must follow the same principle. +Debt World is built around a sensitive reality: debt can involve shame, fear, coercion, discrimination, and urgent personal risk. Every contributor must protect the dignity, privacy, and agency of the people represented by this project. -## Expected +上岸星球围绕非常敏感的现实展开:债务可能伴随羞耻、恐惧、胁迫、歧视和紧急风险。所有贡献者都必须保护用户的尊严、隐私和自主权。 -- Be respectful, specific, and patient. -- Critique product behavior, not a person’s debt, income, country, identity, or choices. -- Protect privacy and encourage qualified local help when a question exceeds the product’s educational scope. -- Disclose when you made or represent a product or service you mention. +## Expected behavior · 我们期待的行为 -## Not allowed +- Be specific, patient, and constructive when reviewing ideas or work. +- Use inclusive, non-shaming language. Debt is not a measure of character, intelligence, or worth. +- Respect cultural and regional differences in debt, law, family obligations, and language. +- Challenge an idea without attacking the person who proposed it. +- Minimize data. Use synthetic examples and remove personal details from screenshots and reports. +- Disclose conflicts of interest, especially links to lenders, collectors, debt-relief services, financial products, or paid advice. +- Pause and ask a maintainer before changing authentication, privacy, moderation, deletion, analytics, or public-data behavior. -- Debt shaming, harassment, threats, hate, or encouragement of harm. -- Requests for money, loans, transfers, crowdfunding, debt collection, or paid-service solicitation. -- Posting another person’s identity, contact details, financial records, recovery codes, or private messages. -- Guaranteed debt-relief claims, fake credentials, or personalized instructions presented as professional advice. +- 审阅建议或代码时保持具体、耐心、建设性。 +- 使用包容且不羞辱人的语言;债务不代表人格、智力或价值。 +- 尊重不同国家和地区在债务、法律、家庭责任与语言上的差异。 +- 可以反对观点,但不能攻击提出观点的人。 +- 坚持数据最小化;测试使用虚构数据,截图和问题报告必须去除个人信息。 +- 主动披露与贷款、催收、债务减免、金融产品或收费咨询有关的利益关系。 +- 修改账号、隐私、审核、删除、统计或公开数据逻辑前,先与维护者确认。 -The owner may remove content and restrict participation to protect users and the project. +## Unacceptable behavior · 禁止行为 + +- Harassment, threats, hate speech, sexualized conduct, stalking, or personal attacks. +- Debt shaming, victim blaming, or ranking people by exact debt, income, country, gender, age, MBTI, or zodiac sign. +- Publishing names, contact details, exact personal financial records, passwords, recovery information, private conversations, or identifiable screenshots. +- Soliciting loans, transfers, investments, paid advice, debt relief, collection services, or private contact with users. +- Claiming professional authority you do not hold or promising financial, legal, medical, credit, or debt-relief outcomes. +- Using contribution access to seek production data, secrets, admin privileges, or personal user information. + +## Scope and enforcement · 适用范围与处理 + +This code applies to the repository, discussions, issues, pull requests, project events, and public communication made on behalf of Debt World. Maintainers may edit, hide, lock, reject, or remove contributions that violate these rules and may temporarily or permanently restrict participation. + +本准则适用于仓库、讨论、Issue、Pull Request、项目活动以及以 Debt World 名义进行的公开沟通。违反规则的内容可能被编辑、隐藏、锁定、拒绝或移除,参与权限也可能被临时或永久限制。 + +Report conduct concerns privately through a [GitHub security advisory](https://github.com/rback37/debt-world/security/advisories/new) when the report includes sensitive or identifying information. Do not repeat private evidence in a public Issue. + +如果举报包含敏感信息或身份线索,请通过 [GitHub 私密安全报告](https://github.com/rback37/debt-world/security/advisories/new) 提交,不要在公开 Issue 中重复证据。 + +Maintainers should explain moderation decisions when it is safe to do so, preserve only the minimum evidence needed, and avoid exposing reporters or affected users. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index d86c8c3..30ee6ad 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,21 +1,45 @@ -# Contributing +# 参与共建上岸星球 · Contributing to Debt World -Thank you for helping Debt World become clearer, safer, and more useful. +上岸星球需要产品、设计、前端、后端、隐私安全、社区审核、翻译、消费者权益和心理健康等不同背景的贡献者。贡献不要求会写代码。 -## Good public contributions +[打开中英文共建入口](https://www.debtworld.org/contribute) · [查看可领取任务](https://github.com/rback37/debt-world/issues) -- Reproducible product bugs without personal financial data. -- Accessibility, device, browser, keyboard, or slow-network findings. -- Wording and translation improvements. -- Respectful proposals for missing debt categories. -- Privacy, moderation, financial-education, and consumer-safety review. +## 第一次贡献:只选一块砖 -## Before opening an issue +第一次不需要承诺长期参与。请选择一个 10–30 分钟可以完成的任务: -1. Remove all real amounts, names, account numbers, contact details, screenshots of statements, and private conversations. -2. Describe the page, device/browser, steps, expected result, and actual result. -3. Say whether the issue blocks use, affects privacy/safety, or is a normal improvement. +- 校对 10–25 句界面文字; +- 用一台真实手机或慢网完成一次注册测试; +- 补充一个国家常见但当前缺失的债务分类; +- 检查一个页面的键盘操作、字号或颜色对比; +- 领取带有 `good first issue` 的小型代码或文档任务。 -Do not use GitHub to request a loan, promote a service, solicit users, or give personalized legal or financial advice. Private personal feedback belongs in the product’s Feedback panel. +在 Issue 留言认领后再开始,避免多人重复劳动。提交内容要说明改了什么、为什么、怎样验证,以及涉及的隐私或滥用风险。 -This repository currently contains public product and community documentation, not the production source. A source contribution workflow and license will be added only if the owner later opens a reviewed portion of the codebase. +## 最适合贡献的内容 + +- 校对某个国家或地区的债务分类与可靠援助资源。 +- 增加中英以外的翻译,确保语言自然且不带羞辱。 +- 改善匿名、删除、举报、无障碍和数据最小化流程。 +- 修复界面问题或提升手机体验。 +- 提议社区规则,但不要提交真实用户债务资料。 + +## 安全底线 + +- Issue、截图、测试数据和提交记录中不得出现真实姓名、账户、账单、电话、邮箱、地址或债权人信息。 +- 不接收真实债务故事的 Pull Request;故事必须通过受控的同意与审核流程。 +- 不加入贷款推广、债务减免销售、陌生私信或用户转账功能。 +- 示例数据必须明确为虚构或充分匿名化。 +- 不要在公开 Issue 中提交恢复码、密码、精确债务金额、完整错误响应或可被利用的安全细节。 + +开始前请先阅读 `PRODUCT_PLAN.md` 和 `launch-kit/PUBLIC_BETA_CHECKLIST.md`。小改动可以直接提交;涉及隐私、账号、公开内容或数据结构的改动,应先开 Issue 说明风险、滥用方式与删除方案。 + +贡献即表示你有权提交这些内容,并同意按本项目的 `AGPL-3.0-or-later` 许可发布贡献。生产数据库、精确用户财务数据、私人 AI 对话、密钥与管理员权限不开放给贡献者。 + +行为边界见 [CODE_OF_CONDUCT.md](./CODE_OF_CONDUCT.md),安全问题见 [SECURITY.md](./SECURITY.md),不同问题的正确入口见 [SUPPORT.md](./SUPPORT.md)。 + +## English summary + +Code is only one form of contribution. We welcome product feedback, accessibility testing, privacy review, translation, moderation design, consumer-safety knowledge, and mobile/slow-network testing. + +Never include real user financial data, identity details, recovery codes, passwords, bank statements, or exploitable security details in a public issue or pull request. Real debt stories must use the controlled in-product consent and moderation flow—not GitHub. diff --git a/GLOBAL_DEPLOYMENT_AND_AI_REGIONS.md b/GLOBAL_DEPLOYMENT_AND_AI_REGIONS.md new file mode 100644 index 0000000..db29ee4 --- /dev/null +++ b/GLOBAL_DEPLOYMENT_AND_AI_REGIONS.md @@ -0,0 +1,80 @@ +# 上岸星球:全球访问与 AI 区域部署方案 + +更新日期:2026-07-31 + +## 结论 + +不存在一个能够承诺“全球所有国家、所有运营商、任何时候都无限制”的单一服务器。上岸星球的现实目标应是: + +1. 不再把 `chatgpt.site` 作为唯一入口,品牌使用自己持有的独立域名。 +2. 全球主站运行在用户自己控制的 Cloudflare 账户中,当前 Sites 版本保留为预览与应急入口。 +3. 中国大陆若需要可承诺的稳定访问,后续单独做境内部署、ICP备案、内容与数据合规,不与零预算全球公测强行同时完成。 +4. AI 密钥只在服务器端使用;访问者所在国家不会拿到或直接调用长期密钥。 + +## 为什么现有项目可以迁移 + +当前项目已经是 Vinext + Cloudflare Worker + D1:网页逻辑运行在 Worker,结构化数据保存在 D1。它不是只能存在于 ChatGPT 里的网页。`.openai/hosting.json` 是当前 Sites 项目的绑定说明,不是产品永久依赖。 + +Cloudflare Worker 支持把自有域名直接指向 Worker,并自动创建 DNS 与证书。官方说明: + +## 分三步迁移 + +### G0:先换成自己的门牌(1–2 天) + +- 购买并持有一个品牌域名。 +- 将 `www` 或 `app` 子域名绑定到当前正式版本。 +- 保留现在的 Sites 地址作为隐藏的应急入口,不再作为主要宣传链接。 +- 增加 `/health` 健康检查和独立状态页,区分“网站不可达”与“AI 暂不可用”。 + +这一阶段主要解决“用户看到 ChatGPT 域名而不敢点、部分网络拦截域名”的问题,但不能解决所有地区对底层网络的限制。 + +### G1:迁入自己控制的全球环境(3–7 天) + +- 创建创始人自己持有的 Cloudflare 账户与 Worker 项目。 +- 将私有源码仓库连接到部署流程。 +- 在自己的账户创建 D1,先导出当前数据库,再在停写窗口内导入新库。 +- 重新配置管理员、会话、MiniMax、OpenAI 等服务器密钥;任何密钥都不进入 Git。 +- 在测试域名完成注册、恢复、保存、还款、投稿、举报、删除和管理员审核全流程。 +- 切换 DNS 后保持旧站只读 7 天,确认无遗漏再关闭写入。 + +初期只保留一个可写数据库,不能让新旧两个站点各自写一份,否则同一个用户会出现两套债务进度。 + +Cloudflare Workers 会在全球网络自动扩展;免费计划当前有每日请求上限,公测前必须配置用量告警。官方限制:。D1 免费与付费容量、恢复窗口和吞吐限制:。 + +### G2:中国大陆稳定版(用户量证明后再做) + +- 确定境内运营主体与域名持有人。 +- 完成 ICP 备案或许可、当地隐私与内容规则复核。 +- 使用境内云与 CDN,单独设计数据边界和跨境处理。 +- 只同步达到匿名门槛的公共聚合结果,不默认跨区复制私人债务明细。 + +Cloudflare 中国网络本身也要求 Enterprise 套餐、额外订阅、ICP备案和内容审核,不属于当前低预算方案。官方说明:。 + +## MiniMax 在海外能否使用 + +可以使用国际开发者平台,但要区分账户、接口和密钥: + +- 国际接口:`https://api.minimax.io/v1` +- 中国接口:`https://api.minimaxi.com/v1` +- 当前代码已支持用服务器变量 `MINIMAX_REGION=global` 切换到国际接口。 +- Token Plan Key 与按量付费 API Key 是两套不同密钥,不能混用。官方说明: +- 国际平台条款明确排除了若干受全面制裁地区,因此也不能宣传成“任何国家无限制”。官方条款: + +用户从海外打开网页时,浏览器调用的是上岸星球服务器;服务器再调用 MiniMax 国际接口。因此关键是服务器区域、国际平台密钥和条款,而不是让每位用户自己登录 MiniMax。 + +### 对现有 MiniMax 会员的处理 + +1. 先确认年度 Max 会员是在国际平台还是中国平台购买。 +2. 在对应平台创建专用的服务器密钥,不能把个人聊天产品的登录凭据当 API 密钥。 +3. 曾经出现在聊天消息中的密钥必须撤销并轮换,即使后来已经保存在 Sites 设置里,也不能继续视为安全。 +4. 创始人内测可以使用有明确额度的 Token Plan;公开多用户前切换为可监控的生产计费或团队方案,并设置每日预算和自动降级。 + +## 全球公测前的通过标准 + +- 独立域名在北美、欧洲、东南亚、印度、中东、非洲、南美至少各完成一次真实网络测试。 +- 低速网络下首页可打开,AI 不可用时仍能记录、还款和浏览已缓存的基础世界。 +- 中英文注册、恢复、导出、彻底删除均通过。 +- MiniMax 国际接口故障时自动切到本机规则引导,不连续重试烧额度。 +- 有 Turnstile、注册上限、写入限流、数据库恢复演练和费用告警。 +- 页面文案使用“面向全球公开测试”,不使用“全球绝对无限制”。 + diff --git a/GOVERNANCE.md b/GOVERNANCE.md new file mode 100644 index 0000000..1933ca4 --- /dev/null +++ b/GOVERNANCE.md @@ -0,0 +1,27 @@ +# Community governance · 共建治理 + +Debt World is currently founder-maintained. Participation is open; production access is not. + +上岸星球目前由创始人维护。贡献入口开放,但生产环境权限不开放。 + +## Participation levels + +1. **Participant** — reports a reproducible bug, tests a device, reviews wording, or proposes a regional debt category. +2. **Contributor** — has an accepted issue, review, documentation change, translation, design, or pull request. +3. **Reviewer** — repeatedly contributes in one area and may help review public, synthetic work in that area. +4. **Maintainer** — can merge code or manage community surfaces after sustained, trustworthy participation and explicit founder approval. + +No role automatically grants access to production databases, exact user finances, private AI conversations, credentials, analytics identifiers, moderation identities, or administrator functions. + +任何角色都不会自动获得生产数据库、用户精确财务数据、私人 AI 对话、密钥、分析标识、审核身份或管理员功能。 + +## Decision principles + +- User dignity and privacy take priority over growth speed. +- Exact personal data stays private by default. +- New public categories require cross-user thresholds and human review. +- Authentication, deletion, moderation, analytics, and public-data changes require explicit maintainer review. +- Reversible experiments are preferred to irreversible data collection. +- Product decisions should be documented in issues or discussions without exposing user data. + +The founder makes final decisions during the public beta. Governance can expand when a stable group of recurring contributors exists. diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..2beb9e1 --- /dev/null +++ b/LICENSE @@ -0,0 +1,662 @@ + GNU AFFERO GENERAL PUBLIC LICENSE + Version 3, 19 November 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU Affero General Public License is a free, copyleft license for +software and other kinds of works, specifically designed to ensure +cooperation with the community in the case of network server software. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +our General Public Licenses are intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + Developers that use our General Public Licenses protect your rights +with two steps: (1) assert copyright on the software, and (2) offer +you this License which gives you legal permission to copy, distribute +and/or modify the software. + + A secondary benefit of defending all users' freedom is that +improvements made in alternate versions of the program, if they +receive widespread use, become available for other developers to +incorporate. Many developers of free software are heartened and +encouraged by the resulting cooperation. However, in the case of +software used on network servers, this result may fail to come about. +The GNU General Public License permits making a modified version and +letting the public access it on a server without ever releasing its +source code to the public. + + The GNU Affero General Public License is designed specifically to +ensure that, in such cases, the modified source code becomes available +to the community. It requires the operator of a network server to +provide the source code of the modified version running there to the +users of that server. Therefore, public use of a modified version, on +a publicly accessible server, gives the public access to the source +code of the modified version. + + An older license, called the Affero General Public License and +published by Affero, was designed to accomplish similar goals. This is +a different license, not a version of the Affero GPL, but Affero has +released a new version of the Affero GPL which permits relicensing under +this license. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU Affero General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Remote Network Interaction; Use with the GNU General Public License. + + Notwithstanding any other provision of this License, if you modify the +Program, your modified version must prominently offer all users +interacting with it remotely through a computer network (if your version +supports such interaction) an opportunity to receive the Corresponding +Source of your version by providing access to the Corresponding Source +from a network server at no charge, through some standard or customary +means of facilitating copying of software. This Corresponding Source +shall include the Corresponding Source for any work covered by version 3 +of the GNU General Public License that is incorporated pursuant to the +following paragraph. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the work with which it is combined will remain governed by version +3 of the GNU General Public License. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU Affero General Public License from time to time. Such new versions +will be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU Affero General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU Affero General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU Affero General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU Affero General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU Affero General Public License for more details. + + You should have received a copy of the GNU Affero General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If your software can interact with users remotely through a computer +network, you should also make sure that it provides a way for users to +get its source. For example, if your program is a web application, its +interface could display a "Source" link that leads users to an archive +of the code. There are many ways you could offer source, and different +solutions will be better for different programs; see section 13 for the +specific requirements. + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU AGPL, see +. + diff --git a/PRODUCT_PLAN.md b/PRODUCT_PLAN.md new file mode 100644 index 0000000..c3df1a7 --- /dev/null +++ b/PRODUCT_PLAN.md @@ -0,0 +1,311 @@ +# 上岸星球 Debt World:产品落地计划 + +更新日期:2026-07-29 + +## 0. 方向修订:从内容网站到现实时间债务世界 + +用户验证后的正确产品形态不是一张“债务故事地图”,而是一个可以长期进入的轻量生活模拟世界: + +1. 用户先与 AI 通过文字或语音交谈,表达压力,不必一上来面对复杂表格。 +2. AI 把叙述拆成多笔独立债务:类型、原始金额、当前余额、月还款、还款日、还款方式和主观压力。 +3. 系统生成可移动的匿名小人;每笔债务成为围绕小人的标签和进度环。 +4. 真实日历到达还款日前,世界生成任务与提醒。 +5. 只有用户确认实际还款,或未来经授权的银行同步确认入账,余额和进度才改变。 +6. 用户在世界中行走,靠近其他匿名角色,看到同地区、同类型或相似月供压力的人。 +7. 上岸不是排行榜;世界只展示个人轨迹、共同里程碑和可选择的公开故事。 + +### 当前 0.2 游戏原型 + +- 已支持键盘与手机移动、NPC、靠近互动、多笔负债、环绕标签、现实还款日期、确认还款、本机持久化和中英文。 +- 已支持浏览器语音识别与语音朗读,用于验证语音交互意愿。 +- AI 当前明确标注为本机引导模式;真实模型尚未接入,避免制造“假 AI”。 +- 未连接银行;确认还款是用户自报,因此页面明确说明数据来源。 + +### 正式数据模型 + +每笔债务至少包含:`debt_id`、用户、类型、本币、原始本金、当前余额、月还款、还款日、还款方式、利率区间、是否逾期、创建时间、公开范围和支付记录。每次还款记录独立保存金额、计划日期、实际日期、确认来源和更新后的余额,不能只覆盖一个百分比。 + +进度分为三层: + +- 金额进度:`(原始本金 - 当前余额) / 原始本金`。 +- 时间进度:计划期数与已完成期数,不把展期误认为失败。 +- 行动进度:完成协商、停止新增高息债务、建立缓冲金等非金额里程碑。 + +房贷等债务不能简单用“月供全部减本金”计算,因为月供通常包含利息、保险或其他费用。正式版本必须让用户输入“本期本金减少额”,或从可靠账单/银行数据获取更新后的余额;当前原型用整笔月还款减少余额只作为交互演示,发布真实数据前必须更正。 + +### AI 与语音架构 + +- 文字:用 Responses API 进行多轮澄清并输出受约束的债务草稿;模型只建议缺失字段和压力分类,最终数值必须由用户确认。 +- 语音:浏览器通过 WebRTC 连接 Realtime API。长期 API 密钥只保存在服务端,浏览器使用短期会话凭证。 +- 推荐角色:温和、简短、不评判;先反映情绪,再一次只问一个问题;不主动推荐贷款、投资或债务减免公司。 +- 高风险表达:AI 不承担危机处置。检测到自伤、暴力、诈骗或非法催收风险时,停止普通游戏引导,展示当地紧急资源并进入受训人工审核流程。 +- 成本控制:文字梳理使用支持结构化输出的成本敏感模型;只有用户主动按住通话时才启用实时音频,离开页面立即结束会话。 + +OpenAI 官方资料说明 Realtime API 支持通过 WebRTC、WebSocket 或 SIP 进行低延迟文字和音频交互,并原生支持语音到语音;浏览器端不应持有长期 API 密钥。[Realtime API reference](https://platform.openai.com/docs/api-reference/realtime?lang=javascript) · [GPT Realtime model](https://developers.openai.com/api/docs/models/gpt-realtime) + +### 与真实世界同步的三个阶段 + +1. **用户确认(现在)**:到期日生成任务,用户确认付款并输入新余额或本金减少额。成本最低、全球可用,但属于自报。 +2. **账单证明(后续可选)**:用户上传已去除身份信息的账单,系统只提取余额和日期;这会显著增加隐私与审核风险,不应作为首选。 +3. **银行同步(逐国推出)**:使用各国的开放银行或聚合服务,只读取用户授权账户;必须逐国处理牌照、数据驻留、撤回授权和供应商成本,不能假装一次覆盖全球。 + +### 自生长世界:由数据发现新的债务方向 + +正式世界不应永远依赖团队预先写死的分类。用户可以记录“欠朋友的钱”“宠物医疗”“移民签证借款”等自由名称;只有用户单独开启匿名参与后,这些名称和宽泛地区才进入发现流程。AI 使用结构化输出进行聚类、建议中英文名称和初始权重,但不能直接修改网页或发布建筑。 + +候选必须经过不同用户数、地区数、近期增长、重复持续性和数据质量门槛,再由人工审核。世界按“信号池 → 路牌 → 营地 → 建筑 → 社区”成长。精确金额、月供、昵称和压力原文不参与评分,稀有分类不公开,所有权重和成长事件可审计、可重算、可撤销。完整方案见 [WORLD_GROWTH_SYSTEM.md](./WORLD_GROWTH_SYSTEM.md)。 + +## 1. 产品结论 + +这是一个可行但必须“安全优先”的社区产品。建议把它定义为:**匿名债务经历与进度社区**,而不是债务代偿、贷款撮合、征信、理财顾问或银行账户聚合工具。 + +综合可行性:**7/10,值得做小规模验证**。 + +| 维度 | 评分 | 判断 | +|---|---:|---| +| 真实需求 | 8/10 | 债务羞耻、孤独和缺少真实参照是普遍问题;现有大型社区已有大量求助与上岸故事 | +| 产品差异 | 8/10 | “全球匿名角色 + 债务构成 + 还款轨迹”比普通计算器和论坛更直观 | +| 技术落地 | 8/10 | 首版不连接银行,可用低成本网页技术快速上线 | +| 冷启动 | 6/10 | 空社区没有价值,必须先访谈并获得首批授权故事 | +| 信任与审核 | 5/10 | 涉及敏感财务、心理压力、诈骗和错误建议,是最大难点 | +| 商业潜力 | 6/10 | 有会员、公益合作、工具订阅空间,但前期不应急于变现 | + +Go / No-Go 条件:在 30 天内获得 100 名候补用户、30 个合规故事、15 次访谈,并且至少 25% 的受访者愿意每周更新进度,即继续开发真实社区;否则调整定位为“个人债务旅程工具 + 可选公开故事”。 + +## 2. 一句话定位 + +**让普通人匿名展示真实债务与上岸进度,在不被评判的环境里得到陪伴和可执行的下一步。** + +核心承诺:真实、匿名、跨国家、有希望。 + +明确不做: + +- 不连接银行账户,不上传账单或身份证。 +- 不提供“保证减债”“快速清零”等承诺。 +- 不做贷款、现金贷、债务重组公司的导流生意。 +- 不公开精确地址、单位、债权人或可识别亲友的信息。 +- 首版不开放陌生人私信,不允许用户之间转账。 +- 不把个人经验包装成财务、法律或医疗建议。 + +## 3. 用户与核心场景 + +首要用户:22–45 岁、有两类以上债务、会回避账单或感到羞耻,但已经产生改变意愿的人。 + +次要用户:已经还清部分或全部债务,愿意匿名留下经验的人。 + +首版只解决三个任务: + +1. “让我知道不是只有我这样。” +2. “让我能把混乱的压力说清楚。” +3. “让我找到今天能走的一小步。” + +北极星指标:**每周完成一次有意义行动的活跃用户数**。行动包括更新进度、记录一步、送出鼓励、保存可靠资源或完成一次债务梳理。 + +### 品牌工作名 + +首选工作组合:**上岸星球 / Debt Atlas**。 + +- “上岸星球”在中文语境里有方向和希望,比“负重星球”更轻,也避免把人永远定义为负债者。 +- “Debt Atlas”让国际用户立即理解这是全球债务图景,而不是又一个炫富社交网络。 +- 对外固定搭配一句解释:中文“看见真实负债,少一点孤单”,英文“See real debt. Feel less alone.” +- 中英文名称不必直译,但必须共享视觉标识和核心句。 + +其他可测试方向:“真实负债 / Debt, Unfiltered”更直接但偏媒体;“负债世界 / The Debt World”最清楚但情绪较重;“Shared Weight”情感温和,但已经被其他社区使用,不建议采用。最终名称需在公开发布前完成目标国家的商标与域名检索;当前判断不构成法律清查。 + +### 多语言原则 + +- 首版提供完整中文与英文,而不是英文按钮配中文正文。 +- 第二阶段将界面文案从页面代码分离为语言资源,优先增加西班牙语、葡萄牙语、印地语、阿拉伯语和法语。 +- 不使用未经校对的机器翻译直接发布财务、法律、危机支持或安全提示。 +- 普通故事可先机器翻译,但必须标注并允许母语用户纠错;高风险内容由当地语言审核者确认。 +- 浏览器自动推荐语言,但用户始终可以手动切换,并记住选择。 +- 债务类型使用稳定的后台代码,本地语言只改变显示文字,保证跨国家统计可比较。 + +### 国家与货币理解原则 + +- 进入世界先选择国家或地区,不要求城市与精确位置。 +- 每笔债务始终保存原币;地图和他人角色按访问者选择的本币提供近似换算。 +- 换算显示参考日期,并明确不是银行结算价;实时来源失败时只能使用标注为近似值的备用汇率。 +- “还款能力”不做信用评分。首版只显示用户自愿填写的每月可支配收入、月供占比和剩余月度余量,并允许完全不填写收入。 + +## 4. 全球债务分类 + +前台使用用户易懂的 11 类,后台允许每个国家增加本地子类型。 + +1. 住房:房贷、二次抵押、住房押金贷款、拖欠租金。 +2. 信用卡与循环信贷:信用卡、透支、商店卡。 +3. 教育:政府/私人学贷、学费与职业培训借款。 +4. 医疗与照护:诊疗、药品、护理、分娩和家庭照护借款。 +5. 交通:车贷、摩托车贷、维修与通勤相关借款。 +6. 个人消费:无抵押个人贷、分期消费、家装与婚礼借款。 +7. 小微经营:经营贷、设备、库存、担保和创业债务。 +8. 短期高息:发薪日贷、现金贷、典当、先买后付。 +9. 公共与法律:税款、罚款、赡养费和诉讼相关债务。 +10. 非正式债务:亲友、雇主、社区互助组织和民间借贷。 +11. 生活欠款:房租、水电、通信、保险和其他逾期账单。 + +每笔记录建议字段:本币金额区间、币种、初始金额区间、已偿还百分比、利率区间、是否逾期、每月还款压力区间、国家/大区、债务产生原因、自述、下一步。公开页面默认只显示本币区间、换算后的大致美元区间、进度和大区。 + +## 5. MVP 功能边界 + +### 已完成的 0.1 原型 + +- 全球债务世界与匿名虚拟角色。 +- 角色头顶显示剩余金额,圆环显示偿还进度。 +- 按债务类型筛选。 +- 查看地区、困扰、行动和匿名轨迹。 +- “送一点光”公开鼓励,不开放私信。 +- 创建匿名角色的安全表单体验。 +- 桌面与手机布局。 +- 首版不上传或保存用户输入。 + +### 0.2 私测版(第 2–4 周) + +- 邮箱魔法链接或 Passkey 登录,前台始终使用昵称。 +- 创建、编辑、删除自己的债务旅程。 +- 金额区间、本币与更新时间;汇率只做近似展示。 +- 每周进度签到、行动记录和上岸里程碑。 +- 公开鼓励、收藏、举报;仍不开放私信。 +- 后台审核队列、关键词和个人信息检测、操作日志。 +- 中英双语,先只接受 18 岁以上用户。 +- 每个地区显示可靠的非营利债务援助和心理危机资源。 + +### 0.3 公测版(第 5–8 周) + +- 国家与债务类型的匿名聚合统计。 +- 经审核的上岸经验卡片。 +- 小组挑战:30 天不新增债务、第一次协商、应急金起步。 +- 贡献者翻译与地区资源校对。 +- 数据导出、彻底删除账户和内容。 + +## 6. 安全、隐私与社区规则 + +这个产品最重要的功能不是地图,而是信任。 + +- 数据最小化:不收身份证、银行账号、账单图片、精确地址和通讯录。 +- 金额默认使用区间;精确金额是用户可选项。 +- 地理位置默认只到国家或大区;人口较少地区进一步模糊。 +- 展示统计必须满足最低样本数,避免从小群体反推个人。 +- 故事发布前进行个人信息提醒和敏感信息检测。 +- 删除操作必须真正删除公开内容和关联数据。 +- 举报类别包括诈骗、骚扰、错误建议、身份暴露、自伤风险和催收行为。 +- 自伤或危机表达不由普通用户“劝导”,页面提供当地紧急资源并进入受训审核流程。 +- 所有经验卡标注“个人经历,不构成建议”;地区专业资源单独审核。 +- 禁止债务买卖、代偿募集、私下转账、付费引流和债务减免承诺。 + +正式开放前需由目标市场律师审查隐私政策、服务条款、未成年人规则、内容责任、跨境数据、删除权和财务推广限制。初期不要同时宣称覆盖所有国家;先支持中英双语和 5–8 个重点地区,再逐步扩展。 + +## 7. 90 天排期 + +### 第 1–7 天:验证问题 + +- 上线私有原型,完成 15 次一对一访谈。 +- 用表格记录用户原话、最重的压力、现有工具、是否愿意公开以及隐私顾虑。 +- 招募 30 个首批故事,必须逐条获得发布授权。 +- 写出社区规则、隐私清单、举报处理流程和危机处理流程。 +- 创建公开候补页,只收邮箱、语言和地区,不收债务详情。 + +### 第 8–21 天:真实私测 + +- 加入账号、数据保存、编辑与删除。 +- 建立审核后台和举报入口。 +- 让 30–50 名封闭用户使用两周,每周访谈 5 人。 +- 重点验证创建完成率、首次更新率和一周回访率。 + +### 第 22–45 天:内容冷启动 + +- 发布 50 个经过授权和去识别化的种子故事。 +- 每个故事提供中英摘要和可分享的进度卡。 +- 建立 10 个高质量“真实下一步”资源页;不做泛泛理财文章。 +- 邀请 3–5 名财务辅导、消费者权益或心理健康领域志愿顾问审阅规则。 + +### 第 46–60 天:小范围公开 + +- 开放邀请码和候补名单,每周增加不超过 100 人。 +- 观察举报率、内容通过率、回复质量和服务器成本。 +- 只在有管理许可的社区发布招募帖,不批量灌水或伪装成用户推荐。 + +### 第 61–90 天:决定扩张方向 + +- 如果 4 周留存达到 20%、每个故事平均获得 3 次以上有效互动、严重举报低于 1%,开始公开发布。 +- 如果浏览很多但没人更新,转向“个人进度工具 + 可选公开”。 +- 如果互动多但诈骗/错误建议高,暂停增长,优先加强审核与身份风险控制。 +- 选择第二批语言和地区,按活跃用户与志愿翻译能力决定,而不是一次铺开全球。 + +## 8. 零预算冷启动 + +### 第一批内容 + +不要等用户进入空地图。创始人先做 20–30 次匿名访谈,把故事改写为短卡片,发回本人确认后再上线。把每个故事拆成:来自哪里、债务类型、最难时刻、当前一步、希望听到什么。 + +### 免费渠道 + +- Reddit 的 debtfree、Debt、personalfinance 等社区:先征得版主许可,发布研究招募或 Show & Tell,不批量贴链接。 +- Product Hunt、Hacker News Show HN、Indie Hackers:适合产品首发和寻找贡献者。 +- 小红书、即刻、豆瓣和微信公众号:发布“债务不是人格缺陷”的匿名故事卡,而不是直接做广告。 +- GitHub:公开前端、翻译文件、债务分类和安全规则,使用 Issues 招募翻译与地区资源校对者。 +- SEO:优先制作“某国家 + 某类债务 + 真实经历/可靠帮助”的高质量页面,不做低质量批量 AI 文章。 +- 合作:大学校友支持、消费者权益组织、非营利信用咨询机构、心理健康社区和移民互助组织。 + +### 可持续传播循环 + +1. 用户更新 10% 进度或完成一步。 +2. 系统生成不含身份和精确金额的分享卡。 +3. 朋友访问匿名轨迹,送出公开鼓励。 +4. 新访客看到同地区、同类型的故事并创建角色。 + +分享文案不要强调“欠了多少”,而强调“已经走了多远”。禁止用排行榜比较谁欠得最多、还得最快或收入最高。 + +### 四周内容节奏 + +- 周一:一个国家、一个匿名真实故事。 +- 周三:一个可执行的“小一步”,注明地区差异与来源。 +- 周五:本周全社区共同偿还的进度和新上岸人数。 +- 周日:创始人公开产品数据、审核问题和下一周改进。 + +## 9. 关键指标 + +| 阶段 | 指标 | 目标 | +|---|---|---:| +| 需求验证 | 访谈后愿意加入候补 | ≥ 50% | +| 激活 | 开始创建后完成角色 | ≥ 55% | +| 首周价值 | 7 天内至少更新或互动一次 | ≥ 30% | +| 留存 | 第 4 周仍有一次有意义行动 | ≥ 20% | +| 社区温度 | 每个新故事 7 天内有效鼓励数 | ≥ 3 | +| 安全 | 严重诈骗/身份暴露举报 | < 1% 内容 | +| 信任 | 用户主动删除率 | 持续观察原因,不设越低越好 | + +不要把“平台展示的债务总额”作为北极星指标,它会激励猎奇、夸大和攀比。 + +## 10. 技术与成本建议 + +原型和早期私测优先使用 Cloudflare Workers + D1 或一个集成式后端,不要同时维护多套基础设施。 + +- Cloudflare Workers Free 计划适合早期流量;官方当前列出的免费计划日请求上限为 100,000。 +- D1 免费额度当前包括每日 500 万行读取、10 万行写入和总计 5GB 存储,足够小规模私测。 +- 如果团队更熟悉 Postgres 和现成登录,可选择 Supabase Free;官方当前列出 50,000 MAU、500MB 数据库、1GB 文件存储,但闲置项目会暂停。 +- 早期不要上传图片和账单,既省钱也降低数据风险。 +- 域名是最值得的少量支出;其他服务先使用免费额度并设置用量警报。 + +首选方案:继续使用当前网站栈,下一阶段增加一个 D1 数据库、匿名化账号、Turnstile 防机器人和人工审核后台。上线真实数据前建立自动备份、删除流程和审计日志。 + +## 11. 未来商业化原则 + +前 6 个月不以收入为目标。达到稳定留存后,可测试: + +- 自愿赞助或非营利合作资助。 +- 不含广告的高级个人规划工具、数据导出和自定义里程碑。 +- 机构版匿名趋势报告,只提供达到最低样本阈值的聚合数据。 +- 经审核的公益机构资源目录。 + +永久避免:卖用户债务线索、按债务类型定向广告、向催收方或贷款方提供数据、从高息贷款或债务减免成交中抽佣。 + +## 12. 调研来源 + +- [World Bank Global Findex 2025](https://www.worldbank.org/en/publication/globalfindex/report):覆盖 141 个经济体约 148,000 名成年人,包含借贷、金融健康和数字安全。 +- [OECD Consumer Finance Risk Monitor 2026](https://www.oecd.org/en/publications/consumer-finance-risk-monitor-2026_61f7dbe0-en/full-report/products-and-services-giving-rise-to-consumer-detriment_31788da9.html):个人贷、信用卡、房贷和先买后付的消费者风险。 +- [WHO Stress Q&A](https://www.who.int/news-room/questions-and-answers/item/stress):长期压力与身心健康风险。 +- [FTC: How to Get Out of Debt](https://consumer.ftc.gov/articles/how-get-out-debt):债务减免诈骗和消费者注意事项。 +- [Cloudflare Workers pricing](https://developers.cloudflare.com/workers/platform/pricing/) 与 [limits](https://developers.cloudflare.com/workers/platform/limits/):免费与付费计划及当前限制。 +- [Cloudflare D1 pricing](https://developers.cloudflare.com/d1/platform/pricing/):早期数据库免费额度。 +- [Supabase pricing](https://supabase.com/pricing):备选后端的免费计划和限制。 diff --git a/PROJECT_PROGRESS.md b/PROJECT_PROGRESS.md new file mode 100644 index 0000000..8ebbe03 --- /dev/null +++ b/PROJECT_PROGRESS.md @@ -0,0 +1,320 @@ +# 上岸星球:正式上线进度表 + +更新日期:2026-07-31 +当前阶段:**0.71 公测增长闭环:公开注册已开启,管理员后台加入 30 秒自动刷新、匿名渠道来源和注册→建档→录债→反馈转化统计** + +这份文件是项目的唯一进度基准。以后每完成一项就在这里勾选,避免需求、技术和推广工作散落在聊天记录里。 + +## 一、最终目标 + +做成一个任何国家的用户都能打开的匿名债务世界: + +- 用户通过文字或语音与 AI 交谈,把压力整理为多笔债务。 +- 每笔债务与真实金额、还款日、月供和实际余额变化相连。 +- 用户操纵虚拟小人在世界中行走,看到不同地区普通人的真实处境。 +- 用户能安全地分享进度、经验和鼓励,但不能私下借钱、引流或骚扰。 +- 用户可以随时导出和彻底删除自己的数据。 +- 世界能从用户主动授权的匿名数据中发现未知负债方向,并依次长出路牌、建筑和新社区。 +- 首发为网页;用户验证成功后再把同一套产品封装成手机 App。 + +## 二、现在到底运行在哪里 + +目前网页已经托管在全球边缘网络上,不需要先购买一台传统服务器。 + +| 能力 | 当前状态 | 正式方案 | 是否现在花钱 | +|---|---|---|---| +| 网页与游戏运行 | 已上线,全球公开入口可访问 | 继续使用当前 Sites 全球托管 | 暂不需要 | +| 用户债务数据 | 默认本机;可主动创建匿名 D1 云端保险箱 | 继续加固 D1、备份与公开范围 | 免费额度起步 | +| 图片、语音、账单文件 | 未保存 | 前期不上传;以后需要时再用 R2 | 暂不需要 | +| 用户身份 | 用户名+密码账号、恢复码与跨设备恢复已上线 | 真实测试后再评估 Passkey;不强制邮箱 | 可免费起步 | +| 文字 AI | 已接入私测:OpenAI / MiniMax + 本机降级 | 服务器自动选择已配置通道并保管密钥 | 每日 20 次;MiniMax Token Plan 仅用于创始人私测 | +| 实时语音 AI | 浏览器基础语音 | OpenAI Realtime API + WebRTC | 按使用量付费 | +| 防机器人 | Cloudflare Turnstile 已在注册入口强制启用;社区另有频率限制 | 真实测试后决定是否扩大到高风险社区写入 | 免费 | +| 自有域名 | `debtworld.org` 已购买;`www.debtworld.org` 已启用 HTTPS | 等根域名证书完成后统一跳转 | 已支付首年域名费 | +| 源代码备份 | 本地项目与托管源代码 | 建立私有 GitHub 仓库,成熟后再决定哪些部分开源 | 免费 | + +### 架构结论 + +首选结构是: + +`全球用户 → 当前网页托管 → 安全接口 → D1 数据库` + +文字 AI 由安全接口调用当前配置的 OpenAI 或 MiniMax;语音阶段再单独选择服务商。浏览器永远不能拿到长期 API 密钥。第一阶段不使用 R2,不接银行,也不上传账单,从源头减少隐私和成本风险。 + +### “全球能用”需要诚实区分 + +- 当前托管方式适合面向多数国家和地区的公开网页。 +- 中国大陆用户通常也可能访问,但境外网络不能承诺始终稳定、低延迟。 +- 如果未来要保证中国大陆稳定访问,需要单独评估境内云服务、ICP备案、内容合规和数据安排。这不是零预算阶段要同时解决的事。 +- 因此首发目标是“全球公开测试,中英文完整可用”,不是“一天内在所有国家都达到本地平台级速度”。 + +## 三、总进度 + +| 阶段 | 结果 | 状态 | 预计时间 | +|---|---|---|---:| +| 0.1 概念验证 | 债务世界与匿名角色概念 | ✅ 完成 | 已完成 | +| 0.2 可玩原型 | 小人移动、对话录入、多债务、真实日期、中英文 | ✅ 完成 | 已完成 | +| 0.3 云端私测 | 匿名账户、云端保存、编辑、删除、恢复 | 🟡 核心完成,待安全加固 | 5–8 天 | +| 0.35 自生长世界底座 | 自由负债名称、匿名授权、候选分类与成长事件 | ✅ 基础完成,AI 聚类尚未启用 | 已完成 | +| 0.36 全球理解层 | 首次国家选择、统一货币换算、空格查看角色、多进度条 | ✅ 完成 | 已完成 | +| 0.37 视觉可读性 | 全站字号与间距升级、轻量游戏角色、手机端适配 | ✅ 完成 | 已完成 | +| 0.38 财务全貌层 | 最大债务来源、收支对比、月底余量、可展开债务构成 | ✅ 完成 | 已完成 | +| 0.39 清晰数字与隐私 | 完整金额、游戏计分牌数字、全站文字放大、单笔分享权限 | ✅ 完成 | 已完成 | +| 0.4 安全社区 | 匿名故事、固定鼓励、举报、审核队列、聚合门槛 | ✅ 审核与基础限流完成,待 Turnstile | 已完成 | +| 0.41 真实额外还款 | 提前还款、每日一次真实幸运收入、来源化历史 | ✅ 完成 | 已完成 | +| 0.42 持续小岸 | 设置后继续沟通、个人数据分析、财务与法律导航边界 | ✅ 本机教育模式完成,待真实模型 | 已完成 | +| 0.43 角色交互优化 | 空格查看、Esc 关闭、自己的角色身份光环、柔和悬浮信息牌 | ✅ 完成 | 已完成 | +| 0.44 鼓励视觉反馈 | 送光即时回执、人物脚下四级光效、设备内单次鼓励 | ✅ 完成 | 已完成 | +| 0.45 真实故事入图 | 审核通过故事成为地图人物、真实鼓励驱动光效、10/50/100 道光里程碑 | ✅ 完成 | 已完成 | +| 0.46 安全审核台 | 管理员批准/拒绝/隐藏/恢复、举报结案、审核记录、每日防刷限额 | ✅ 完成 | 已完成 | +| 0.47 公开前安全中心 | 中英文隐私说明、社区规则、删除流程、专业建议与紧急风险边界 | ✅ 完成 | 已完成 | +| 0.48 版本化规则同意 | 首次投稿前确认 18+、隐私与社区规则,云端保存版本与时间 | ✅ 完成 | 已完成 | +| 0.49 用户公开内容控制 | 用户可撤回并永久删除单篇投稿,导出包含规则同意记录 | ✅ 完成 | 已完成 | +| 0.5 AI 私测 | 真实文字 AI;小范围限时语音 | 🟡 MiniMax 实网文字对话已验证,待语音 | 4–7 天 | +| 0.51 还款策略 | APR、最低还款、状态、剩余期数与三路线比较 | ✅ 完成 | 已完成 | +| 0.53 邀请准备 | 邀请码、30 人名额、暂停新增、私密反馈与私测台 | ✅ 完成 | 已完成 | +| 0.54 个体化债务角色 | 年龄段、性别、MBTI、星座、自由描述;债务驱动体型、衣着、背负物和锁链 | ✅ 完成 | 已完成 | +| 0.55 可扩张世界体验 | 地图缩放拖动、本人昵称与光效修复、首次规则、轮换标语、金条狗小岸 | ✅ 完成 | 已完成 | +| 0.56 公测发布准备 | 中英文媒体包、平台文案、分阶段传播方案、GitHub 草稿与原创宣传图 | ✅ 完成 | 已完成 | +| 0.57 全球入口与星光托起 | 独立域名迁移路线、MiniMax 国际区、送光驱动气球与云朵 | ✅ 已发布;`www.debtworld.org` 可访问 | 已完成 | +| 0.58 上岸值账本 | Turnstile、唯一邀请、非现金积分与赠予审计 | 🟡 注册 Turnstile、账本结构和真实还款奖励已完成;邀请奖励与赠予审计待开放 | 2–4 天 | +| 0.59 宠物成长 | 真实进度产粮、喂食互动、跨设备同步且无断签惩罚 | ⬜ 待做 | 2–4 天 | +| 0.60 主题与评论 | 类贴吧主题、一层评论、固定反应、举报审核与删除 | ⬜ 待做 | 4–7 天 | +| 0.60 首批邀请测试 | 首批真实用户验证进入、保存、反馈和删除 | ✅ 内测反馈良好,已完成 | 已完成 | +| 0.7 小范围公开 | 无需邀请码,保留真人验证、每日上限、审核和紧急暂停 | ✅ 已开放公开测试 | 已完成 | +| 0.71 公测增长闭环 | 渠道专属入口、隐私最小化来源统计、后台自动刷新、搜索发现文件 | ✅ 完成,首轮 GitHub 公告待发布 | 已完成 | +| 1.0 全球公测 | 自有域名、稳定规则、增长与多语言扩展 | 🟡 中英文公开测试已开始,待更多地区真实用户与法律复核 | 总计约 8–12 周 | + +在用户能稳定配合测试和账号准备的情况下,**3–5 周可以做到安全的小范围公开,8–12 周可以进入全球公测**。时间重点不在“租服务器”,而在数据安全、删除、举报、审核和真实用户验证。 + +## 四、下一阶段:0.3 云端私测版 + +这是从“好玩的演示”变成“真实产品”的关键一步,必须按顺序完成。 + +### A. 数据与账号 + +- [x] 建立 D1 数据库和版本迁移。 +- [x] 建立匿名用户、设备会话和账户恢复码。 +- [x] 保存多笔债务、金额、币种、还款日、月供和还款方式。 +- [x] 每次实际还款保存为独立记录,不直接覆盖历史。 +- [x] 提前还款单独记录真实现金与最新本金,不误改原定还款日。 +- [x] “幸运收入”仅登记真实额外收入;匿名云端按用户当地日期强制每天一次,并选择用于哪笔债务。 +- [x] 房贷等债务使用“账单最新余额”更新,不把整笔月供误当本金。 +- [x] 实现编辑、导出和彻底删除。 +- [x] 实现单笔债务隐藏和公开范围;默认仅自己,可选未来匿名金额区间。 +- [ ] 设置公开范围:仅自己、匿名公开、仅聚合统计。 +- [x] 所有写入操作在服务器校验,不相信浏览器传来的身份或金额格式。 +- [x] 允许用户记录现有分类之外的自由负债名称。 +- [x] 将“参与世界成长”设为独立授权,默认关闭。 + +### B. 安全底座 + +- [x] 注册入口加入 Cloudflare Turnstile;社区写入继续使用保险箱身份、隐私清洗和频率限制,真实测试后再决定是否增加二次验证。 +- [x] 按匿名保险箱限制每日高频投稿、鼓励和举报;重复操作不重复计数。 +- [x] 自动清除故事中的电话、邮箱、账号、网址和精确数字等敏感信息。 +- [x] 社区审核建立最小操作记录,只存状态变化、简短原因和管理员身份摘要,不保存完整债务或 AI 私密对话。 +- [ ] 做数据库恢复演练。 +- [x] 编写中英文隐私说明、社区规则、删除流程、“非财务/法律/医疗建议”与紧急风险边界。 + +### C. 产品体验 + +- [x] 使用恢复码从其他设备恢复自己的角色。 +- [x] 到期日前生成任务;只有用户确认后才更新状态。 +- [x] 世界只显示用户主动公开且审核通过的匿名信息;待审内容不进入地图。 +- [x] 公开金额权限仅允许匿名区间,精确金额默认且始终仅自己可见。 +- [ ] 完成手机端、慢网和低性能设备测试。 +- [ ] 中英文所有安全文案人工复核。 + +### D. 国家、汇率与角色观察 + +- [x] 首次进入必须选择国家或地区;不收集城市和精确位置。 +- [x] 常见国家自动匹配本币,其他国家可以手动填写名称与 ISO 货币代码。 +- [x] 世界金额按访问者选择的货币统一换算,并保留原币提示。 +- [x] 实时参考汇率不可用时使用明确标注的近似备用值;换算不用于账务结算。 +- [x] 玩家头顶显示醒目的总负债数字。 +- [x] 靠近角色后可按空格键查看,手机仍可直接点击。 +- [x] 角色详情显示本金进度、月供压力和自报还款余量,并明确不是信用评分。 +- [x] 国家、展示货币和可选月收入保存到匿名保险箱。 +- [x] 可选月度日常开销保存到匿名保险箱,并计算“收入-日常开销-还款=月底余量”。 +- [x] 世界标签突出最大债务来源与占比;点击自己或他人角色可查看完整债务构成和现金流。 + +### 0.3 完成标准 + +必须同时满足以下条件,才进入真实用户私测: + +1. 新建、编辑、退出、重新进入、导出、删除全流程都通过。 +2. 一个用户无法读取或修改另一个用户的私有数据。 +3. 数据库可以恢复,删除的数据不会继续公开显示。 +4. 页面明确区分自报数据、AI 整理结果和真实金融机构数据。 +5. 不要求上传身份证、银行卡、通讯录、账单或精确住址。 + +## 五、0.35:让世界从数据中生长 + +- [x] 数据库建立分类候选、信号分配、权重版本和成长事件结构。 +- [x] 自由负债名称会进入用户自己的小人标签、时间轴和档案。 +- [x] 精确金额、昵称和压力原文不进入新社区候选评分。 +- [ ] 接入只输出结构化提议的 AI 聚类任务,AI 不直接修改线上代码。 +- [ ] 建立仅管理员可见的候选后台,支持合并、拆分、改名、拒绝和撤销。 +- [ ] 用至少 30–50 名受邀用户验证最低人数、地区与隐私门槛。 +- [ ] 前端按配置生成路牌、营地、建筑和社区,不硬编码新类型。 +- [ ] 加入“相同 / 不同 / 名称不尊重 / 隐私风险”的用户纠错。 + +详细规则、初始权重和阶段定义见 [WORLD_GROWTH_SYSTEM.md](./WORLD_GROWTH_SYSTEM.md)。 + +## 六、0.4–0.5:社区和真实 AI + +### 社区 + +- [x] 审核通过的匿名故事会进入地图,真实鼓励总数驱动脚下光效和 10/50/100 里程碑。 +- [x] 世界中显示经过授权且审核通过的匿名角色。 +- [x] 只开放固定公开鼓励,不开放陌生人私信。 +- [x] 加入举报:诈骗、骚扰、错误建议、身份暴露、自伤风险、催收引流。 +- [x] 建立投稿待审核、举报待处理和高风险先隐藏的状态队列。 +- [x] 建立只对授权管理员显示的审核台,可批准、拒绝、隐藏、恢复、处理举报并查看操作记录。 +- [x] 聚合统计设置至少 30 个审核样本门槛,防止从小样本反推出个人。 +- [x] 不做“谁欠最多”的个人排行榜,只展示达到门槛的类型与还款方式聚合。 +- [x] 禁止私信、借款、转账、众筹、收费引流和催收联系入口。 +- [x] 首次投稿前必须确认 18+ 与当前版本规则;版本和时间进入个人数据导出。 +- [x] 用户可从“我的投稿”撤回并永久删除单篇故事,立即从社区与地图移除。 +- [x] 收到的真实送光会生成气球与云朵,在视觉上托起角色背负物;不修改债务余额、铁链或上岸资格。 +- [ ] 加入上岸值、可赠星光和托起值三本独立账本,积分无现金价值且不能抵扣债务。 +- [ ] 在 Turnstile 和唯一邀请关系完成后开放邀请奖励,延迟 7 天结算并设置周上限。 +- [ ] 开放主题帖与一层评论,不开放私信;评论沿用隐私清洗、限流、举报和人工审核。 +- [ ] 金条狗小岸加入粮食、喂食和互动;漏记或无法还款时不饥饿、不掉级、不责备用户。 + +完整规则见 [SHORE_VALUE_PET_COMMUNITY_SYSTEM.md](./SHORE_VALUE_PET_COMMUNITY_SYSTEM.md)。 + +### AI 与语音 + +- [x] 初始设置后可以继续与小岸沟通;本机模式读取债务、现金流和还款历史生成教育性行动清单。 +- [x] 对优先还款、提前还款、压力、世界数据和法律/催收问题分别设置安全回答边界。 +- [x] 明确小岸不冒充持牌财务顾问或律师;当地法律、合同费用和诉讼期限必须另行核实。 +- [x] 接入真实文字 AI,将一次叙述中的多笔债务整理为“待用户确认”的债务草稿,不自动保存。 +- [x] AI 每次只追问一个缺失字段,不评价、不恐吓、不保证上岸。 +- [x] 金额、币种、利率、最低还款、状态、剩余期数和还款日均由用户最终确认;未知值不由系统猜测。 +- [x] 同时比较高利率优先、最小余额优先和现金流安全优先;逾期状态与必要生活开销优先,所有结果只作为草案。 +- [x] 对每个匿名保险箱设置每日 20 次文字用量和令牌累计,防止费用失控。 +- [x] AI 请求不发送恢复码、匿名昵称、精确城市或历史聊天;本站不保存提问和回答原文。 +- [x] API 密钥只保存在 Sites 密钥环境中,浏览器和源码无法读取。 +- [ ] 先给 10 名测试者开放实时语音,每人每天限制几分钟。 +- [ ] 用户离开页面立即结束语音会话。 +- [ ] 已识别自伤、诈骗、非法催收、法律期限和医疗风险并切换安全回答;待加入按国家整理的当地帮助资源。 +- [ ] 上线前做中英双语高风险对话测试。 + +语音不能作为首个公开版本的前置条件。先证明用户愿意持续记录,再扩大实时语音,否则最容易在用户价值尚未验证时产生费用。 + +## 七、公开发布门槛 + +在切换成任何人可访问之前,以下项目必须全部完成: + +- [x] 正式数据可由用户主动保存到 D1 匿名云端保险箱,不再只能依赖浏览器本地保存。 +- [x] 有账户恢复、数据导出和彻底删除。 +- [x] 有举报入口、唯一管理员审核台和暂停新增开关;公测期间由创始人每日处理。 +- [x] 有中英文隐私说明、社区规则、删除说明和 18+ 社区限制。 +- [ ] 公开前完成正式服务条款与目标地区法律复核。 +- [x] 注册有 Turnstile,社区有频率限制、敏感信息清洗和人工审核。 +- [ ] 至少 30 名受邀用户使用两周。 +- [ ] 没有已知的跨账户读取或修改漏洞。 +- [x] 名称、`www.debtworld.org` 和中英文社交分享卡已统一。 +- [ ] 设置服务器和 AI 用量告警。 +- [x] 唯一管理员后台可暂停或恢复新增世界,并查看用户体验阶段和私密反馈。 + +达到门槛后再做三件事: + +1. 将当前站点访问方式切换为公开。 +2. 绑定自有域名并开启 HTTPS。 +3. 先放行 100 名用户,观察一周后再扩容。 + +## 八、创始人与 Codex 的分工 + +### Codex 负责 + +- 产品拆解、页面与游戏开发、数据库结构和安全接口。 +- 中英文产品文案、测试清单和发布操作。 +- 进度表维护、成本控制逻辑、数据导出与删除流程。 +- 推广素材、招募文案、GitHub 说明和每周数据复盘模板。 + +### 创始人必须亲自负责或确认 + +- 最终品牌名和要购买的域名。 +- 创建并持有域名、GitHub、AI 服务等账户;密钥不能发在聊天里。 +- 隐私政策和服务条款的主体信息。 +- 首批用户访谈、故事授权和举报处理人。 +- 对公开发布、预算增加、付费服务和高风险规则作最终决定。 + +## 九、本周执行顺序 + +### 第 1–2 天 + +- [x] 核实 MiniMax 国际接口、Token Plan 边界和受限地区条款。 +- [x] 写明独立域名、用户自有 Cloudflare 与中国区分阶段部署路线。 +- [x] 将真实送光接到气球与云朵减负效果。 +- [x] 发布并验证 0.57,正式站、缩放和星光托起效果已进入线上版本。 +- [x] 购买 `debtworld.org`,启用 `https://www.debtworld.org/`;旧地址仅作故障备用。 + +### 第 3–5 天 + +- [x] 注册入口接入 Turnstile,并保留社区保险箱身份、频率限制和审核防护。 +- [x] 建立上岸值、星光赠予、托起值和唯一邀请关系的 D1 账本结构;真实还款已发放非现金上岸值和星光。 +- [ ] 管理员后台增加异常邀请、积分撤销和每日额度观察;在首批用户真实产生行为后再开放邀请奖励。 + +### 第 6–9 天 + +- [ ] 加入宠物粮食、喂食、摸头和散步,完成跨设备同步。 +- [ ] 加入主题帖与一层评论,复用审核、举报、删除和隐私过滤。 +- [ ] 对 10 名现有测试者开放,不做公开邀请裂变。 + +### 第 10–14 天 + +- [ ] 根据举报量、评论质量和 7 日回访调整积分上限。 +- [ ] 全球六大区域真实网络抽测,AI 故障时验证本机降级。 +- [ ] 达到安全门槛后扩大到 30–100 名受邀用户。 + +## 十、当前决策记录 + +- 2026-07-29:产品从信息网站改为可以行走的轻量债务世界。 +- 2026-07-29:真实进度必须由账单余额或用户确认驱动,不能按月供直接减本金。 +- 2026-07-29:继续使用当前全球托管,首版不租传统服务器。 +- 2026-07-29:正式数据使用 D1;R2 暂不启用。 +- 2026-07-29:在云端保存、删除、举报和审核完成前,站点保持仅所有者可访问。 +- 2026-07-29:完成 D1 数据库、匿名恢复码、跨设备恢复、多债务与还款历史、编辑、导出和彻底删除。 +- 2026-07-29:恢复码仅在创建或轮换时显示,服务器只保存不可逆摘要;用户未主动开启前不上传本机数据。 +- 2026-07-29:网页先行,验证留存后再做 App。 +- 2026-07-29:未知负债方向由用户自由命名;只有主动授权的数据才参与匿名发现。 +- 2026-07-29:AI 只提出结构化分类和权重建议,不能直接写代码或发布建筑;上线必须达到样本门槛并经过人工审核。 +- 2026-07-29:进入世界前先选择国家;跨国金额统一换算成访问者本币,同时保留原币和参考汇率日期。 +- 2026-07-29:还款能力只做基于自报月收入与月供的压力展示,不做征信、违约预测或价值判断。 +- 2026-07-29:后续真实 AI 使用创始人的 OpenAI API 项目,由服务器保存密钥;ChatGPT 订阅不作为网站 API 凭证。 +- 2026-07-29:辅助文字、按钮和表单统一提高可读尺寸;占空间最紧张的进度环数字是唯一保留的微型数字。 +- 2026-07-29:用纯 CSS 角色替换占位小人,加入肤色、发型、表情、服装和国籍徽章,兼顾游戏感与低端设备性能。 +- 2026-07-29:角色世界标签只展示总负债、最大来源和月余等结论;点击后才展开收入、日常开销、月还款和各笔债务构成,避免地图信息过载。 +- 2026-07-29:精确收支默认属于本人私有视图;未来公开角色需单独授权,并默认使用比例或区间。 +- 2026-07-30:所有金额取消 K/M 等缩写,统一显示完整数字和千位分隔;关键金额使用高对比游戏计分牌样式。 +- 2026-07-30:全站建立最低可读字号,辅助说明不再使用微型文字,手机端不再依赖过度缩放。 +- 2026-07-30:每笔债务增加独立分享权限;默认“仅自己”,用户只能选择未来匿名金额区间,不能公开精确金额。 +- 2026-07-30:真实文字 AI 使用 `gpt-5.6-terra` 和 Responses API;每次只发送当前问题及必要债务摘要,结构化结果只能成为待确认草稿。 +- 2026-07-30:每个匿名保险箱每日最多 20 次 AI 请求;只累计次数与令牌,不保存 AI 对话原文,OpenAI 请求设置 `store: false`。 +- 2026-07-30:加入 OpenAI / MiniMax M2.7 双通道和运行环境自检;MiniMax Token Plan 只用于所有者私测,公开多用户上线前改用官方建议的生产计费方案。 +- 2026-07-30:任何发到聊天中的 API 密钥都视为泄露,不写入源码或服务器,必须先撤销并轮换。 +- 2026-07-31:不再使用“全球无限制”承诺;采用独立域名、用户自有全球部署和中国大陆合规部署三阶段路线。 +- 2026-07-31:MiniMax 海外用户使用国际平台与 `api.minimax.io`;Token Plan 与按量付费密钥分开,公开前配置预算和自动降级。 +- 2026-07-31:上岸值不可转让,星光可赠予,托起值只驱动视觉;三者都没有现金价值,也不修改真实欠款。 +- 2026-07-31:邀请奖励必须在 Turnstile、唯一邀请关系、7 天延迟结算和周上限完成后才开放。 +- 2026-07-31:宠物采用无惩罚陪伴设计;评论采用主题帖与一层评论,不开放私信、借钱、转账或收费引流。 +- 2026-07-31:购买 `debtworld.org`;`https://www.debtworld.org/` 已通过 Sites 自定义域名与 HTTPS 验证,根域名证书继续等待平台完成。 +- 2026-07-31:Cloudflare Turnstile 在用户名密码注册入口强制启用,允许正式域名、`www` 与旧测试域名;密钥只保存在托管环境。 +- 2026-07-31:管理员后台加入首批用户邀请台、中文/英文一键复制文案、注册→建世界→录债务→反馈漏斗和体验阶段筛选。 +- 2026-07-31:公测后台加入 30 秒自动刷新、最近更新时间和 GitHub/微博/Reddit/Product Hunt/Show HN/朋友邀请的粗粒度来源转化;只在注册时保存渠道标签,不保存完整 URL、搜索词或浏览历史。 +- 2026-08-01:对外产品语言统一为“账号、角色、共享大世界”;取消“匿名云端保险箱/恢复码”的宣传表达,精确个人数据仍不进入公开地图。 +- 2026-08-01:GitHub 个人资料已加入 Debt World 身份、官网、全球定位和主题头像;公开仓库 README 已加入共享世界、隐私边界、协作者与负责任融资说明,提交 `aea6906`。 +- 2026-08-01:公测宣传包删除小红书方案;Reddit 采用单社区、透明披露、先正常参与后发布的节奏,禁止群发、自动评论、刷票和在个人债务故事下推广。 +- 2026-08-01:Reddit `rback37` 已注册并登录;账号资料页可用,等待创始人对上传主题头像、保存简介与官网链接进行最后确认。 +- 2026-08-01:修复登录后顶部工具区拥挤、按钮样式不一致与移动端遮挡;桌面端允许自动换行,手机端改为单行横向滑动,世界画布继续占满剩余空间。 +- 2026-08-01:管理员权限改为双重绑定:必须同时通过 ChatGPT 所有者身份与已绑定的上岸星球账号;其他账号不显示后台入口,直接请求后台也返回拒绝。删除已绑定账号时自动解绑,所有者可在新账号上重新绑定。 +- 2026-08-01:新版完成构建、代码检查与 5 项端到端测试,覆盖普通账号越权拦截、管理员绑定、债务数据、反馈审核、导出与删除。 +- 2026-08-01:唯一管理员账号已在线绑定并核验:首页仅在绑定账号下显示后台入口,后台页可正常查看审核、暂停新增与公测运营入口。 +- 2026-08-01:创建每日“官网巡检+合规宣发草稿”自动任务;每天只生成一次候选渠道与文案,不自动发帖、评论、私信或刷票,也不输出用户精确债务和私人对话。 +- 2026-08-01:公开增长版加入真实邀请激活:朋友通过专属链接注册并至少录入一笔债务后,双方才获得非现金上岸值与星光;空账号不奖励。 +- 2026-08-01:管理员后台加入隐私友好的每日独立访客、页面打开、注册、首次录债与邀请激活 14 日看板;访客标识按日不可逆摘要,不保存 IP、设备、搜索词或完整浏览地址。 +- 2026-08-01:新增中英文可索引产品介绍页、结构化数据、robots 与 sitemap;正式推广链接按 Reddit、X、GitHub 等渠道统计转化。 +- 2026-08-01:准备 X 全球账号资料、首发置顶与首周 7 条不重复内容;日常自动化只生成候选草稿,不自动发帖、私信、回复、关注或互动。 diff --git a/README.md b/README.md index 1c35360..a2cc53e 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ > A shared, walkable world for honest debt journeys. > 一个会随着真实匿名数据不断生长的债务世界。 -[Live beta](https://www.debtworld.org/en?src=githubreadme) · [23-second demo](#walk-the-world-in-23-seconds--23-秒看懂上岸星球) · [5-minute test](#test-debt-world-in-5-minutes--5-分钟体验) · [Roadmap](ROADMAP.md) · [Public build log](https://github.com/rback37/debt-world/issues/1) · [Contribute](CONTRIBUTING.md) · [Safety](https://www.debtworld.org/en/safety) +[Live beta](https://www.debtworld.org/en?src=githubreadme) · [23-second demo](#walk-the-world-in-23-seconds--23-秒看懂上岸星球) · [5-minute test](#test-debt-world-in-5-minutes--5-分钟体验) · [Build the world](https://www.debtworld.org/en/contribute) · [Roadmap](ROADMAP.md) · [Public build log](https://github.com/rback37/debt-world/issues/1) · [Contribute](CONTRIBUTING.md) · [Safety](https://www.debtworld.org/en/safety) ## Walk the world in 23 seconds · 23 秒看懂上岸星球 @@ -86,10 +86,29 @@ We are also open to responsible early-stage partners, grants, or funding that pr ## Repository scope -This public repository is the project’s product-and-community home. Production source code, infrastructure settings, secrets, private operating notes, and user data are intentionally not published here. A source license has not been selected, so this repository must not be described as open source. +This public repository is the project’s product, source, and community home. The runnable application source is published under **GNU AGPL-3.0-or-later** so people can inspect it, improve it, and build compatible community versions while preserving the same network-source freedoms. + +Production secrets, user data, exact financial records, private AI conversations, recovery codes, administrator access, and private operating material are never part of the public repository. The project name, logo, and visual brand are not automatically licensed as trademarks. + +Local development requires Node.js 22.13 or newer: + +```bash +npm install +npm run dev +``` + +Validation: + +```bash +npm run build +npm run lint +npm test +``` - [Roadmap](ROADMAP.md) - [Contributing](CONTRIBUTING.md) +- [Community discussions](https://github.com/rback37/debt-world/discussions) +- [AGPL-3.0 license](LICENSE) - [Security](SECURITY.md) - [Code of conduct](CODE_OF_CONDUCT.md) diff --git a/SECURITY.md b/SECURITY.md index 2f7b25c..9d8f1f7 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -1,12 +1,39 @@ -# Security policy +# Security policy · 安全报告规则 -Protecting vulnerable users and private financial data is more important than public proof. +Debt World handles sensitive financial records and anonymous community content. Please report security and privacy problems privately. -## Report safely +上岸星球涉及敏感财务记录和匿名社区内容。安全与隐私问题请使用私密渠道报告。 -- Do not open a public issue containing an exploitable detail, personal data, passwords, recovery codes, financial records, or private AI conversations. -- Do not attempt to access another person’s record, test with real stolen data, or retain any data encountered accidentally. -- For a sensitive product or security concern, use the private Feedback panel inside [Debt World](https://www.debtworld.org/) and label the message as a security concern. Include only the minimum reproduction detail and no secrets. -- Public GitHub issues are appropriate for non-sensitive bugs and hardening ideas. +## Private reporting -The project is an early public beta. A dedicated private vulnerability-reporting channel will be added before broader-scale promotion. +Use GitHub's private vulnerability reporting page: + +**https://github.com/rback37/debt-world/security/advisories/new** + +Please include only what is necessary: + +- affected page or endpoint; +- a short description of the impact; +- minimal reproduction steps using synthetic data; +- browser and device family when relevant; and +- a safe contact path through GitHub. + +请只提交定位问题所需的最少信息:受影响页面、影响说明、使用虚构数据的复现步骤,以及必要的浏览器或设备类型。 + +## Never include + +- passwords, API keys, recovery information, cookies, or authentication tokens; +- real names, emails, phone numbers, addresses, identity documents, or creditor account numbers; +- exact personal debt, income, payment, or bank records; +- private Kian conversations or raw production responses; or +- information belonging to another user. + +If you have already exposed a secret, revoke or rotate it before reporting. Do not test against other users, attempt persistence, download production data, or disrupt the public service. + +如果密钥已经暴露,请先撤销或轮换。不要对其他用户测试、维持访问、下载生产数据或影响线上服务。 + +## Public issues + +Use public Issues only for bugs that can be reproduced with synthetic data and contain no exploitable detail. Maintainers may move or remove unsafe public reports. + +There is currently no paid bug-bounty program. We will acknowledge good-faith reports and coordinate a responsible fix and disclosure where appropriate. diff --git a/SHORE_VALUE_PET_COMMUNITY_SYSTEM.md b/SHORE_VALUE_PET_COMMUNITY_SYSTEM.md new file mode 100644 index 0000000..0181610 --- /dev/null +++ b/SHORE_VALUE_PET_COMMUNITY_SYSTEM.md @@ -0,0 +1,106 @@ +# 上岸值、星光减负、宠物与社区系统 + +更新日期:2026-07-31 + +## 一、先把三种数分开 + +为了避免用户误以为虚拟积分能抵消真实欠款,也避免邀请刷量,产品使用三种独立记录: + +| 名称 | 用途 | 能否赠予 | 是否影响真实欠款 | +|---|---|---:|---:| +| 上岸值 | 表示本人持续整理与真实更新的过程 | 否 | 否 | +| 星光 | 固定额度的社区鼓励,可送给别人 | 是 | 否 | +| 托起值 | 累计收到的星光,驱动气球、云朵和脚下光效 | 否 | 否 | + +真实余额、铁链和还款进度只能由用户确认的最新本金与还款记录改变。社区星光只让背负物在画面中显得被托起,不能修改数字、信用状态或“上岸成功”资格。 + +## 二、上岸值如何获得 + +首版只奖励健康、可验证的产品行为,不奖励债务金额大小: + +- 确认一笔真实还款并填写最新本金:+5,每笔真实记录只算一次。 +- 完成每周债务与收支核对:+3,每周一次。 +- 更新一笔债务的利率、最低还款或状态:+1,每周最多 3 次。 +- 一篇亲身经验通过审核:+2,每周最多 2 篇。 +- 评论被作者或管理员标记“对我有帮助”:+1,每周最多 5 次。 + +删除对应记录后不倒扣已经消耗的虚拟物品,但审计账本保留撤销事件。不能购买、提现、兑换现金、抵扣债务或转让上岸值。 + +## 三、分享和邀请 + +分享按钮只在用户主动点击时生成隐私安全的公共链接,不能带精确债务或私人画像。 + +- 外部分享:每天第一次完成可得到 1 份宠物粮食,不按点击量或转发次数奖励。 +- 邀请:使用每人独立邀请码;被邀请人注册满 7 天,并至少完成一次债务整理和一次回访后,双方各得 3 点星光。 +- 每人每周最多 3 个有效邀请;自己邀请自己、同设备批量注册、立即注销重建均不给奖励。 +- 不做公开邀请排行榜,不使用现金裂变,不允许在评论区散发邀请码。 + +独立邀请奖励必须在 Turnstile、设备级异常检测和唯一邀请关系完成后才上线。当前共用私测邀请码不能直接发奖励。 + +## 四、星光赠予与气球减负 + +- 每个账号每天获得 3 点可赠星光;完成一次真实更新可额外获得 1 点,当日最多 5 点。 +- 对同一故事或评论每天最多赠予 1 点,不能给自己。 +- 送出后出现星光飞行反馈,接收者的累计托起值增加。 +- 气球里程碑:1、10、50、100;从单气球逐步变为多气球与云朵。 +- 当用户减少债务时,铁链按真实进度减少;当用户收到支持时,气球把背负物视觉上向上托。两套动画同时存在但数据源完全分离。 +- 支持“减少动态效果”和低性能模式。 + +当前第一版已经把现有审核故事的真实送光总数接入气球与云朵效果。后续只需把同一视觉层改读新的托起值账本。 + +## 五、金条狗小岸的宠物机制 + +宠物用于陪伴,不用愧疚推动用户: + +- 粮食来源:真实还款记录、每周核对、一次有效外部分享、完成安全知识卡。 +- 没还款或中断记录时宠物不会挨饿、死亡、掉级或责怪用户。 +- 喂食只解锁互动、动作、装饰和小故事,不解锁财务建议优先权。 +- 成长阶段参考长期参与与还款进度,但不比较欠款金额;高债务用户不会因此得到更差宠物。 +- 每天最多喂 3 次,避免无限点击;每次保存独立事件,跨设备一致。 + +首版互动:喂食、摸头、散步。第二版再加入小窝装饰和不同性格,不在公测前做抽卡或付费道具。 + +## 六、类贴吧社区 + +采用“主题帖 + 一层评论”,不做陌生人私信: + +### 主题分类 + +- 给我打气 +- 亲身还款方法 +- 增收尝试 +- 协商与材料准备 +- 生活缓冲 +- 已上岸复盘 + +### 评论规则 + +- 每条最多 500 字,只能表达支持、提问或亲身经验。 +- 个人经验统一标注“这对我有用,不代表适合所有人”。 +- 电话、邮箱、社交账号、网址、精确金额和身份线索自动隐藏。 +- 禁止借钱、转账、众筹、收费咨询、贷款/催收引流、保证减债结果和要求他人停止还款。 +- 每个账号每天最多 10 条评论;新账号前 48 小时最多 3 条。 +- 用户可随时删除自己的评论;编辑窗口 15 分钟,编辑后重新进入审核。 +- 评论支持固定“给你力量”和“对我有帮助”,不做踩、不做欠款榜、不做煽动性热度榜。 +- 高风险举报先隐藏再审核,管理员后台显示上下文和操作记录。 + +## 七、服务器数据结构 + +正式实现使用 D1,不用浏览器存储充当真实账本: + +- `shore_value_ledger`:不可覆盖的上岸值事件与撤销事件。 +- `starlight_wallets`:当前可赠星光余额。 +- `starlight_gifts`:赠予者、接收者、公开内容、日期与幂等键。 +- `referral_codes` / `referral_relationships`:唯一邀请关系和延迟结算状态。 +- `pet_profiles` / `pet_events`:宠物阶段、粮食余额、喂食与互动。 +- `story_comments` / `comment_reports` / `comment_moderation_actions`:评论、举报和审核记录。 + +所有加分、赠予和喂食都由服务器事务完成;浏览器不能提交“给我加 100 分”这样的结果。 + +## 八、上线顺序 + +1. **0.57 星光托起视觉**:复用现有真实送光,完成气球/云朵效果。已发布为 Version 27。 +2. **0.58 防刷与积分账本**:唯一邀请关系、上岸值、星光账本和真实还款奖励已完成;Turnstile 前后端校验已接入,待独立域名确定后填入正式站点密钥并强制启用。 +3. **0.59 宠物互动**:粮食事件、跨设备同步、无惩罚成长。 +4. **0.60 主题与评论**:一层评论、审核、举报、删除和管理员队列。 +5. **0.61 小范围验证**:先向 30–100 名受邀用户开放两周,再决定是否扩大邀请奖励。 diff --git a/SUPPORT.md b/SUPPORT.md new file mode 100644 index 0000000..7245ee9 --- /dev/null +++ b/SUPPORT.md @@ -0,0 +1,27 @@ +# Getting help · 获取帮助 + +Choose the path that matches the problem. This keeps personal financial information out of public developer spaces. + +请根据问题类型选择入口,避免把私人财务信息带入公开开发社区。 + +## Product experience or private feedback + +Use the **Feedback / 反馈** button inside [Debt World](https://www.debtworld.org/). Do not post exact debt amounts, income, passwords, recovery information, bank details, or private Kian conversations on GitHub. + +产品体验、看不懂的步骤或不舒服的表达,请使用站内“反馈”。 + +## Reproducible public bug + +Open a [bug report](https://github.com/rback37/debt-world/issues/new?template=bug_report.yml) with synthetic data, clear steps, and privacy-safe screenshots. + +## Translation or regional debt category + +Open a [translation and regional review](https://github.com/rback37/debt-world/issues/new?template=translation_review.yml). Describe the country, language, and wording or category—not a real person's financial record. + +## Security, privacy vulnerability, or exposed identity + +Use [private vulnerability reporting](https://github.com/rback37/debt-world/security/advisories/new). Do not open a public Issue. + +## Personal financial, legal, medical, or crisis help + +Debt World is an educational organization and tracking product, not a lender, debt-relief company, financial adviser, lawyer, doctor, or emergency service. We cannot provide individual professional advice through GitHub. Contact a qualified local professional or trusted public/nonprofit resource. If someone faces immediate danger or cannot stay safe, contact local emergency or crisis services immediately. diff --git a/WORLD_GROWTH_SYSTEM.md b/WORLD_GROWTH_SYSTEM.md new file mode 100644 index 0000000..ca8e968 --- /dev/null +++ b/WORLD_GROWTH_SYSTEM.md @@ -0,0 +1,107 @@ +# 上岸星球:自生长世界规则 + +更新日期:2026-07-29 + +## 一、目标 + +上岸星球不是一张由团队预先画完的地图,而是一个由真实、匿名、经授权的数据慢慢长出来的世界。 + +例子:最初只有“亲友借款”。当越来越多用户写下“欠朋友的钱”“朋友替我垫了房租”等新称呼,系统发现它们是同一类稳定现象后,地图会依次出现路牌、临时营地、建筑,最后形成“朋友借款社区”。世界的变化代表“这种处境被更多人看见”,不代表欠款金额更大或更值得围观。 + +## 二、从一句话到一座社区 + +```text +用户自定义称呼 + → 明确同意匿名参与 + → 去除金额、昵称和压力原文 + → AI 生成结构化分类提议 + → 统计不同用户、地区、增长与重复出现 + → 人工审核名称、边界和安全风险 + → 发布为世界节点 + → 后续数据推动节点继续成长或合并 +``` + +AI 不能直接修改网页代码、创建线上建筑或改变正式分类。它只生成候选提议;正式世界只读取经过验证和审核的结构化配置。每次权重变化、分类合并和建筑升级都要留下版本与事件记录,能够撤销。 + +## 三、用户授权与隐私边界 + +- “参与世界成长”默认关闭,并且与云端备份、还款记录完全分开。 +- 只有用户主动开启后,自定义负债名称和大区才可以成为匿名发现信号。 +- 精确金额、月供、昵称、压力原文、还款方式和恢复码永远不进入新分类评分。 +- 一个罕见称呼不能单独出现在公共地图;必须达到不同用户数和地区数门槛。 +- 用户关闭授权后,不再产生新信号;删除保险箱会删除关联信号,并触发聚合结果重算。 +- 建筑若因删除或纠错低于门槛,可以进入“历史/淡出”状态,不继续显示当前活跃度,但保留不含个人信息的审计事件。 + +## 四、AI 分类提议 + +AI 的输出必须是固定结构,而不是自由编程: + +- 候选分类代码和中英文名称。 +- 建议归属的父分类。 +- 与既有分类是“相同、子类、相关或不同”的判断。 +- 置信度、简短理由和需要人工注意的歧义。 +- 安全标记:是否可能包含人名、机构名、精确地点、违法催收、自伤或诈骗信息。 +- 使用的模型、提示版本和分类版本。 + +低置信度信号进入待确认池;相似候选可以合并,但不能为了让数字好看而重复计算同一个人的多笔记录。 + +## 五、出现权重 + +首个可测试版本使用以下权重,合计为 1。权重不是永恒规则,每次调整都生成新版本,旧结果可以复算。 + +| 信号 | 初始权重 | 含义 | +|---|---:|---| +| 不同用户频率 | 0.30 | 有多少个不同的人遇到,而不是同一人说了多少次 | +| 近期增长 | 0.20 | 最近是否持续出现,防止陈旧热点永久占据地图 | +| 地区分布 | 0.15 | 是否跨越多个大区;不会展示小地区明细 | +| 重复持续性 | 0.15 | 是否在多个统计周期中稳定出现 | +| 类型连接 | 0.10 | 是否与其他负债共同出现,可用于生成道路或桥梁 | +| 数据质量 | 0.10 | 分类置信度、完整性和异常检测结果 | + +建议分数: + +`出现分数 = 0.30×频率 + 0.20×增长 + 0.15×地区 + 0.15×持续性 + 0.10×连接 + 0.10×质量` + +这里所有输入都先归一化到 0–1。系统还需要硬门槛,不能仅凭总分发布:至少 5 名不同授权用户、至少 2 个宽泛地区、无高风险隐私标记并完成人工审核。这个数字只是私测起点;公开前应根据重识别风险提高,不应为了地图热闹而降低。 + +## 六、世界成长阶段 + +| 阶段 | 世界表现 | 发布条件 | +|---|---|---| +| 0 信号池 | 不公开,只在候选后台出现 | 获得第一批经授权信号 | +| 1 路牌 | 地图出现一个小型提示点 | 达到最低人数和地区门槛,审核通过 | +| 2 营地 | 可进入并看到匿名聚合说明 | 连续多个周期出现,分类边界稳定 | +| 3 建筑 | 形成长期可探索地点 | 用户规模、持续性和数据质量继续提高 | +| 4 社区 | 多个相关子类型形成街区 | 子类型足够丰富,且不会暴露稀有人群 | + +建筑高度可代表遇到这一情况的不同人数,窗户亮度可代表近期活跃度,道路可代表不同债务经常共同出现。不能用建筑大小直接表示总欠款额,也不做“谁欠得最多”的排行榜。 + +## 七、用户参与纠错 + +每个新社区都应允许用户选择: + +- “这和我的情况相同”。 +- “名字相似,但不是同一种”。 +- “建议换一个更尊重人的名称”。 +- “可能泄露隐私或造成伤害”。 + +反馈只改变候选评分和审核优先级,不立即改变线上地图。分类被拆分、合并或改名时,公开显示简短的变更说明。 + +## 八、当前已经落地的基础 + +- 债务可使用自由名称,现有分类之外的方向可以被记录。 +- 匿名云端保险箱增加独立、默认关闭的世界成长授权。 +- 数据库已准备权重版本、分类候选、匿名信号分配和世界成长事件。 +- 自由名称会显示在用户自己的角色标签、时间轴和债务档案中。 + +当前没有启用自动 AI 聚类,也没有把任何真实用户数据发布成建筑。下一步应先做仅管理员可见的候选后台和定时聚类任务,在至少 30–50 名受邀用户中验证误分类、隐私和名称尊重程度,再允许首个真实社区出现。 + +## 九、实施顺序 + +1. 收集:在私有世界验证自由命名和授权理解度。 +2. 提议:AI 定时输出结构化候选,不写线上代码。 +3. 审核:建立候选后台、合并/拆分、风险标记和审计记录。 +4. 生长:前端按结构化阶段绘制路牌、营地、建筑和社区。 +5. 反馈:加入用户纠错和名称建议,定期复算权重。 +6. 公开:达到安全与样本门槛后,才展示真实聚合社区。 + diff --git a/app/AboutPage.tsx b/app/AboutPage.tsx new file mode 100644 index 0000000..b603127 --- /dev/null +++ b/app/AboutPage.tsx @@ -0,0 +1,65 @@ +import type { Locale } from "@/lib/debt-world-types"; + +const copy = { + zh: { + kicker: "DEBT WORLD · PUBLIC BETA", + title: "不是人均富豪的橱窗,而是一个真实前行的债务世界", + lead: "上岸星球把房贷、信用卡、学贷、亲友借款和更多意想不到的压力,变成一个可以行走、观察和互相照亮的匿名世界。", + enter: "进入共同大世界", + language: "English", + sections: [ + ["先把混乱说清楚", "与小岸对话,写下每笔债务、余额、利率、月还、收入与日常开销。系统把它们整理成个人画像和真实进度,但不会假装替你做持牌财务或法律决定。"], + ["进度跟着现实改变", "真实还款、提前还款和额外收入记录会更新余额、铁链、背负物与脚下光效。游戏反馈帮助看见变化,但不会篡改真实债务或信用信息。"], + ["看见别人也在负重", "共同世界只使用经过隐私保护的匿名汇总。你可以看到不同国家、债务类型和还款方法的趋势,也可以为真实故事送光、交流经验。"], + ["世界会由数据长大", "当越来越多人写下新的负债原因,新的标签、社区与建筑会逐渐出现。产品希望成为一张不断生长的全球债务地图。"], + ], + debtTitle: "目前支持的债务入口", + debts: ["房贷与住房贷款", "信用卡与循环信贷", "学生贷款与教育借款", "车贷", "消费分期", "医疗债务", "税务欠款", "经营与商业贷款", "亲友借款", "自定义未知类型"], + faqTitle: "常见问题", + faq: [ + ["需要真实姓名或邮箱吗?", "不需要。公开测试使用用户名和密码,角色昵称可以保持匿名。"], + ["别人能看到我的精确金额吗?", "精确债务、收入、开销和私人 AI 对话默认不公开;共同世界展示经过限制的匿名信息与群体趋势。"], + ["这是财务顾问、律师或债务减免服务吗?", "不是。这里提供信息整理、教育性支持和同伴经验;重要决定应向所在地区的合格专业人士核实。"], + ["邀请奖励如何生效?", "朋友通过专属链接注册并至少真实录入一笔债务后,双方获得虚拟上岸值或星光。它们只改变世界视觉体验。"], + ], + }, + en: { + kicker: "DEBT WORLD · PUBLIC BETA", + title: "Not another highlight reel—a world for real debt journeys", + lead: "Debt World turns mortgages, credit cards, student loans, money owed to friends, and unexpected financial pressure into an anonymous world people can walk through and illuminate together.", + enter: "Enter the shared world", + language: "中文", + sections: [ + ["Turn confusion into a clear picture", "Talk with Kian about each balance, APR, monthly payment, income, and living cost. The system organizes them into a personal map and real progress without pretending to replace licensed financial or legal advice."], + ["Progress changes with real life", "Confirmed payments, prepayments, and real extra income update balances, chains, burdens, and ground light. Game feedback makes change visible but never alters real debt or credit information."], + ["See that others carry weight too", "The shared world uses privacy-protected anonymous aggregates. Explore patterns across countries, debt types, and repayment approaches, then send light to reviewed stories and exchange experience."], + ["A world that grows from data", "As more people describe new reasons for debt, new labels, districts, and buildings can emerge. The long-term vision is a living global map of debt pressure and progress."], + ], + debtTitle: "Debt paths currently supported", + debts: ["Mortgages and housing loans", "Credit cards and revolving credit", "Student and education loans", "Auto loans", "Consumer installment debt", "Medical debt", "Tax debt", "Business loans", "Money owed to friends or family", "Custom and emerging debt types"], + faqTitle: "Frequently asked questions", + faq: [ + ["Do I need a legal name or email?", "No. The public beta uses a username and password, while your character alias can remain anonymous."], + ["Can others see my exact amounts?", "Exact debts, income, living costs, and private AI conversations are not public by default. The shared world uses limited anonymous information and group trends."], + ["Is this a financial adviser, law firm, or debt-relief service?", "No. It provides organization, educational support, and peer experience. Verify important decisions with a qualified professional in your jurisdiction."], + ["When do referral rewards activate?", "After a friend registers through your personal link and truthfully adds at least one debt, both people receive virtual Shore value or starlight. These affect only the world experience."], + ], + }, +} as const; + +export default function AboutPage({ locale }: { locale: Locale }) { + const c = copy[locale]; + const base = "https://www.debtworld.org"; + const faqJson = { "@context": "https://schema.org", "@type": "FAQPage", mainEntity: c.faq.map(([name, text]) => ({ "@type": "Question", name, acceptedAnswer: { "@type": "Answer", text } })) }; + const appJson = { "@context": "https://schema.org", "@type": "WebApplication", name: "Debt World", alternateName: "上岸星球", url: `${base}${locale === "zh" ? "/" : "/en"}`, applicationCategory: "FinanceApplication", operatingSystem: "Web", isAccessibleForFree: true, description: c.lead }; + return
+