Skip to content

Tos update#3916

Closed
iiamlewis wants to merge 8 commits into
mainfrom
TOS-Update
Closed

Tos update#3916
iiamlewis wants to merge 8 commits into
mainfrom
TOS-Update

Conversation

@iiamlewis
Copy link
Copy Markdown
Contributor

Tos updates, altering the current registered address and other legal changes. Effecitve date of today 13/05/2026

Describe the PR.
Tos updates, altering the current registered address and other legal changes. Effecitve date of today 13/05/2026

Please complete the following:

  • I have added screenshots for all UI updates
  • I process any text displayed to the user through translateText() and I've added it to the en.json file
  • I have added relevant tests to the test directory
  • I confirm I have thoroughly tested these changes and take full responsibility for any bugs introduced

Please put your Discord username so you can be contacted if a bug or regression is found:

Iamlewis

iiamlewis and others added 8 commits May 11, 2026 11:55
Revise legal resources to reflect current services and compliance. privacy-policy.html: major rewrite and reorganization — updated "Last Updated" date, added structured sections (Who We Are, Scope/Definitions, Information We Collect, Cookies, Legal Bases, Public Profiles, Data Retention, Transfers, Security, Your Rights, Automated Decision-Making, Children's Privacy, Third-Party Links, Changes, Contact), added table styles, cookie categories, retention table, international transfer safeguards, processor and advertising details (Stripe, Playwire), and contact/legal emails. terms-of-service.html: update styles and date, expand "Service" scope to include game clients (Steam, Crazy Games, etc.) and Discord bot, add eligibility/age requirements, strengthen conduct rules and add a detailed Fair Play / competitive integrity section (offensive identifiers, teaming in FFA, multi-accounting, rating manipulation, cheating, exploits, disruptive play, enforcement and appeals). These changes improve clarity, legal compliance (EEA/UK/CA references), and moderation/anti-abuse policies.
## Description:

Show bonus amount on currency packs

- Add `bonusAmount` field to `PackSchema` (non-negative int)
- Render a rotated green corner ribbon (`+X FREE!`) on pack tiles when
`bonusAmount > 0`
- Add `cosmetics.free` translation key with `numFree` param

<img width="720" height="359" alt="Screenshot 2026-05-12 at 7 40 12 AM"
src="https://github.com/user-attachments/assets/3dd70fc4-c922-47f4-aee6-055047b58563"
/>

Describe the PR.

## Please complete the following:

- [x] I have added screenshots for all UI updates
- [x] I process any text displayed to the user through translateText()
and I've added it to the en.json file
- [x] I have added relevant tests to the test directory
- [x] I confirm I have thoroughly tested these changes and take full
responsibility for any bugs introduced

## Please put your Discord username so you can be contacted if a bug or
regression is found:

evan
Replace OpenFront LLC with OpenFront Inc. and add corporate identification in Privacy Policy and Terms of Service. Update registered agent and mailing address to Paracorp Incorporated (Camden, DE), change governing law to Delaware, and update "Last Updated" dates to 5/13/2026. Applies to resources/privacy-policy.html and resources/terms-of-service.html to reflect the company's legal and contact details.
@coderabbitai
Copy link
Copy Markdown
Contributor

coderabbitai Bot commented May 13, 2026

Review Change Stack

Walkthrough

This PR introduces a bonus cosmetics feature with UI display, adds a loading spinner to the game mode selector, updates navigation styling with a CSS class, and comprehensively restructures the privacy policy and terms of service documents with revised legal language, new sections, and updated entity references.

Changes

Bonus cosmetics feature

Layer / File(s) Summary
Pack schema and translation
src/core/CosmeticSchemas.ts, resources/lang/en.json
PackSchema adds a non-negative integer bonusAmount field; a new cosmetics.free translation key with value "+{numFree} BONUS!" is added.
Bonus ribbon rendering
src/client/components/CosmeticButton.ts
Pack preview conditionally renders an absolutely positioned, rotated green ribbon displaying the translated bonus when pack.bonusAmount > 0.

Game mode loading state

Layer / File(s) Summary
Loading spinner in game mode selector
src/client/GameModeSelector.ts
render() shows a centered loading spinner when this.lobbies is null, otherwise renders the existing game cards grid.

Navigation styling updates

Layer / File(s) Summary
Add no-crazygames class to nav buttons
src/client/components/DesktopNavBar.ts, src/client/components/MobileNavBar.ts
Leaderboard and navigation buttons add the no-crazygames CSS class to existing class strings.

Legal documents restructure

Layer / File(s) Summary
Privacy policy restructure
resources/privacy-policy.html
Styling updated for table and heading elements; content completely rewritten with new "Last Updated" date (5/13/2026), tabular legal bases and retention sections, expanded data collection and rights categories (UK/EEA/California), security/breach notice, and updated contact details for OpenFront Inc. (Delaware).
Terms of service restructure
resources/terms-of-service.html
h3 heading styling added; content reorganized with new "Last Updated" date (5/13/2026), new "Eligibility" section, expanded "Fair Play and Competitive Integrity" section (Section 6) covering FFA coordination, multi-accounting, ranking manipulation, cheating/exploits, and appeals; remaining sections renumbered; liability clauses updated; governing law changed to Delaware; contact information expanded with full mailing address.

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

Poem

🎁 Bonus ribbons spin in emerald delight,
While spinners twirl as lobbies load just right,
Legal prose now flows from Delaware's light,
Navigation gleams with no-crazy might,
Fair play rules ensure the fight! ⚖️

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
Title check ❓ Inconclusive The title 'Tos update' is vague and generic, using non-descriptive terminology that does not convey meaningful information about the substantial changes in the pull request. Use a more specific title like 'Update Terms of Service and Privacy Policy with legal entity changes and fair play enforcement' to clearly indicate the main changes.
✅ Passed checks (4 passed)
Check name Status Explanation
Description check ✅ Passed The description mentions ToS updates and legal changes effective 5/13/2026, which aligns with the substantial privacy policy and terms of service changes visible in the changeset.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

Warning

Review ran into problems

🔥 Problems

Stopped waiting for pipeline failures after 30000ms. One of your pipelines takes longer than our 30000ms fetch window to run, so review may not consider pipeline-failure results for inline comments if any failures occurred after the fetch window. Increase the timeout if you want to wait longer or run a @coderabbit review after the pipeline has finished.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@iiamlewis iiamlewis closed this May 13, 2026
@github-project-automation github-project-automation Bot moved this from Triage to Complete in OpenFront Release Management May 13, 2026
Copy link
Copy Markdown
Contributor

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 4

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (2)
src/client/components/MobileNavBar.ts (1)

113-116: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Leaderboard is still missing no-crazygames.

Mobile has the same partial update: clans is gated, leaderboard is not. Add the class here as well to match intended CrazyGames hiding behavior.

Suggested fix
-        <button
-          class="nav-menu-item block w-full text-left font-bold uppercase tracking-[0.05em] text-white/70 transition-all duration-200 cursor-pointer hover:text-blue-600 hover:translate-x-2.5 hover:drop-shadow-[0_0_20px_rgba(37,99,235,0.5)] [&.active]:text-blue-600 [&.active]:translate-x-2.5 [&.active]:drop-shadow-[0_0_20px_rgba(37,99,235,0.5)] text-[clamp(18px,2.8vh,32px)] py-[clamp(0.2rem,0.8vh,0.75rem)]"
+        <button
+          class="no-crazygames nav-menu-item block w-full text-left font-bold uppercase tracking-[0.05em] text-white/70 transition-all duration-200 cursor-pointer hover:text-blue-600 hover:translate-x-2.5 hover:drop-shadow-[0_0_20px_rgba(37,99,235,0.5)] [&.active]:text-blue-600 [&.active]:translate-x-2.5 [&.active]:drop-shadow-[0_0_20px_rgba(37,99,235,0.5)] text-[clamp(18px,2.8vh,32px)] py-[clamp(0.2rem,0.8vh,0.75rem)]"
           data-page="page-leaderboard"
           data-i18n="main.leaderboard"
         ></button>
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/client/components/MobileNavBar.ts` around lines 113 - 116, In the
MobileNavBar component, the leaderboard button (the element with class
"nav-menu-item" and data-page="page-leaderboard") is missing the no-crazygames
class; update that button's class list to include "no-crazygames" so it follows
the same CrazyGames gating as the clans item and hides correctly on CrazyGames
builds.
src/client/components/DesktopNavBar.ts (1)

122-125: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Add no-crazygames to leaderboard button too.

This layer’s goal looks only partially implemented in this file: clans has no-crazygames, but leaderboard does not, so it can still appear on CrazyGames.

Suggested fix
-        <button
-          class="nav-menu-item text-white/70 hover:text-malibu-blue  font-medium tracking-wider uppercase cursor-pointer transition-colors [&.active]:text-malibu-blue "
+        <button
+          class="no-crazygames nav-menu-item text-white/70 hover:text-malibu-blue  font-medium tracking-wider uppercase cursor-pointer transition-colors [&.active]:text-malibu-blue "
           data-page="page-leaderboard"
           data-i18n="main.leaderboard"
         ></button>
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/client/components/DesktopNavBar.ts` around lines 122 - 125, The
leaderboard button in DesktopNavBar (the element with
data-page="page-leaderboard" and data-i18n="main.leaderboard") is missing the
no-crazygames class; update that button's class attribute to include
"no-crazygames" alongside the existing classes (matching how the clans button is
implemented) so the leaderboard is also hidden on CrazyGames.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In `@resources/privacy-policy.html`:
- Around line 55-70: Add a horizontal-scroll wrapper for long tables to prevent
overflow on small screens by wrapping each table element in a responsive
container (e.g., a div with a class like "table-responsive") and/or adding CSS
rules that target tables directly; update the HTML where tables are rendered
(the table elements referenced in the diff) to be wrapped in that container and
add CSS for .table-responsive { overflow-x: auto; -webkit-overflow-scrolling:
touch; } and ensure the table itself has max-width: 100% and display: table;
keep the existing th, td rules intact but add word-break: break-word; or
white-space: normal; to th, td to allow long legal text to wrap.

In `@resources/terms-of-service.html`:
- Around line 271-279: Replace plain-text email addresses with mailto: anchor
links wherever they appear (e.g., the "support@openfront.io" occurrence inside
the "6.9 Appeals" section and the other two occurrences noted). Find the <h3>6.9
Appeals</h3> paragraph and the other paragraphs containing the literal
"support@openfront.io" and wrap the email text in an <a
href="mailto:support@openfront.io">...</a> anchor so users can click to open
their mail client; ensure the visible text remains the email address and do the
same for any other plain-text emails at the other referenced locations.

In `@src/client/components/CosmeticButton.ts`:
- Around line 91-99: The bonus ribbon rendered when pack.bonusAmount > 0 in
CosmeticButton is being clipped by the parent container's overflow-hidden;
update the parent container (the wrapper element around the preview/ribbon in
the CosmeticButton component) to use overflow-visible instead of overflow-hidden
or apply overflow-visible conditionally when the ribbon will be rendered (i.e.,
when pack.bonusAmount > 0) so the absolutely-positioned ribbon (-right-8) is not
clipped; locate the wrapper in CosmeticButton and change the CSS class logic to
toggle overflow-visible when rendering the bonus ribbon.

In `@src/core/CosmeticSchemas.ts`:
- Line 86: Add unit tests for the new bonusAmount field on PackSchema in
CosmeticSchemas: create or update a test that imports PackSchema (from
CosmeticSchemas) and verifies PackSchema.safeParse/parse accepts valid integer
nonnegative values (e.g., 0 and positive ints) and rejects negative numbers,
non-integers (floats), and non-number types; also include a test for required
behavior (ensure omission fails if field is required, or succeeds if optional).
Use the existing test conventions for core schemas (safeParse assertions and
expectation of error messages) and place the test alongside other core/schema
tests so the test runner detects it.

---

Outside diff comments:
In `@src/client/components/DesktopNavBar.ts`:
- Around line 122-125: The leaderboard button in DesktopNavBar (the element with
data-page="page-leaderboard" and data-i18n="main.leaderboard") is missing the
no-crazygames class; update that button's class attribute to include
"no-crazygames" alongside the existing classes (matching how the clans button is
implemented) so the leaderboard is also hidden on CrazyGames.

In `@src/client/components/MobileNavBar.ts`:
- Around line 113-116: In the MobileNavBar component, the leaderboard button
(the element with class "nav-menu-item" and data-page="page-leaderboard") is
missing the no-crazygames class; update that button's class list to include
"no-crazygames" so it follows the same CrazyGames gating as the clans item and
hides correctly on CrazyGames builds.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

Run ID: 0b6ee07f-4a1b-4b2f-aeac-0f74c265ddd9

📥 Commits

Reviewing files that changed from the base of the PR and between 9e39a7f and bfb9032.

📒 Files selected for processing (8)
  • resources/lang/en.json
  • resources/privacy-policy.html
  • resources/terms-of-service.html
  • src/client/GameModeSelector.ts
  • src/client/components/CosmeticButton.ts
  • src/client/components/DesktopNavBar.ts
  • src/client/components/MobileNavBar.ts
  • src/core/CosmeticSchemas.ts

Comment on lines +55 to +70
table {
border-collapse: collapse;
width: 100%;
margin: 15px 0;
}
th,
td {
border: 1px solid #ddd;
padding: 8px 12px;
text-align: left;
vertical-align: top;
}
th {
background-color: #f4f4f4;
color: #2980b9;
}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Improve table readability on small screens.

Line 55 and the table blocks at Line 248 and Line 474 can overflow on mobile because cells contain long legal text. Add a horizontal-scroll wrapper for tables.

Proposed fix
       th {
         background-color: `#f4f4f4`;
         color: `#2980b9`;
       }
+      .table-scroll {
+        width: 100%;
+        overflow-x: auto;
+        -webkit-overflow-scrolling: touch;
+      }
+      .table-scroll table {
+        min-width: 640px;
+      }
-    <table>
+    <div class="table-scroll">
+      <table>
       <thead>
         <tr>
           <th>Purpose</th>
           <th>Legal basis</th>
         </tr>
       </thead>
       <tbody>
         ...
       </tbody>
-    </table>
+      </table>
+    </div>
-    <table>
+    <div class="table-scroll">
+      <table>
       <thead>
         <tr>
           <th>Category of data</th>
           <th>Typical retention period</th>
         </tr>
       </thead>
       <tbody>
         ...
       </tbody>
-    </table>
+      </table>
+    </div>

Also applies to: 248-337, 474-534

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@resources/privacy-policy.html` around lines 55 - 70, Add a horizontal-scroll
wrapper for long tables to prevent overflow on small screens by wrapping each
table element in a responsive container (e.g., a div with a class like
"table-responsive") and/or adding CSS rules that target tables directly; update
the HTML where tables are rendered (the table elements referenced in the diff)
to be wrapped in that container and add CSS for .table-responsive { overflow-x:
auto; -webkit-overflow-scrolling: touch; } and ensure the table itself has
max-width: 100% and display: table; keep the existing th, td rules intact but
add word-break: break-word; or white-space: normal; to th, td to allow long
legal text to wrap.

Comment on lines +271 to +279
<h3>6.9 Appeals</h3>
<p>
If you believe an enforcement action against your account was made in
error, you may contact us at support@openfront.io within 30 days of the
action. We will review appeals in good faith but reserve the right to
maintain or modify any enforcement action at our sole discretion. We do
not commit to a specific response timeframe and our decision on an appeal
is final.
</p>
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟡 Minor | ⚡ Quick win

Make support/legal emails clickable.

Line 274, Line 475, and Line 479 use plain text emails. Use mailto: links so users can contact faster, especially for appeals.

Proposed fix
-      error, you may contact us at support@openfront.io within 30 days of the
+      error, you may contact us at
+      <a href="mailto:support@openfront.io">support@openfront.io</a>
+      within 30 days of the
-      legal@openfront.io
+      <a href="mailto:legal@openfront.io">legal@openfront.io</a>
       <br /><br />
       To appeal an enforcement action, please contact:
       <br />
-      support@openfront.io
+      <a href="mailto:support@openfront.io">support@openfront.io</a>

Also applies to: 475-479

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@resources/terms-of-service.html` around lines 271 - 279, Replace plain-text
email addresses with mailto: anchor links wherever they appear (e.g., the
"support@openfront.io" occurrence inside the "6.9 Appeals" section and the other
two occurrences noted). Find the <h3>6.9 Appeals</h3> paragraph and the other
paragraphs containing the literal "support@openfront.io" and wrap the email text
in an <a href="mailto:support@openfront.io">...</a> anchor so users can click to
open their mail client; ensure the visible text remains the email address and do
the same for any other plain-text emails at the other referenced locations.

Comment on lines +91 to +99
${pack.bonusAmount > 0
? html`<div
class="absolute top-3 -right-8 bg-green-500 text-white text-[10px] font-black px-8 py-0.5 rotate-45 shadow-md uppercase tracking-wide pointer-events-none"
>
${translateText("cosmetics.free", {
numFree: pack.bonusAmount.toLocaleString(),
})}
</div>`
: nothing}
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🟠 Major | ⚡ Quick win

The bonus ribbon will be clipped by overflow-hidden.

The ribbon is positioned with -right-8 (extends outside its container), but the parent div at line 163 has overflow-hidden, which will clip the ribbon. The bonus indicator won't be visible as intended.

🎨 Proposed fix

Change line 163 from overflow-hidden to overflow-visible:

           <div
-            class="w-full aspect-square flex items-center justify-center bg-white/5 rounded-lg p-2 border border-white/10 group-hover:border-white/20 transition-colors duration-200 overflow-hidden"
+            class="w-full aspect-square flex items-center justify-center bg-white/5 rounded-lg p-2 border border-white/10 group-hover:border-white/20 transition-colors duration-200 overflow-visible"
           >

Or, if overflow control is needed for other preview types (flags), you could conditionally apply it:

           <div
-            class="w-full aspect-square flex items-center justify-center bg-white/5 rounded-lg p-2 border border-white/10 group-hover:border-white/20 transition-colors duration-200 overflow-hidden"
+            class="w-full aspect-square flex items-center justify-center bg-white/5 rounded-lg p-2 border border-white/10 group-hover:border-white/20 transition-colors duration-200 ${this.resolved.type === 'pack' ? 'overflow-visible' : 'overflow-hidden'}"
           >
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/client/components/CosmeticButton.ts` around lines 91 - 99, The bonus
ribbon rendered when pack.bonusAmount > 0 in CosmeticButton is being clipped by
the parent container's overflow-hidden; update the parent container (the wrapper
element around the preview/ribbon in the CosmeticButton component) to use
overflow-visible instead of overflow-hidden or apply overflow-visible
conditionally when the ribbon will be rendered (i.e., when pack.bonusAmount > 0)
so the absolutely-positioned ribbon (-right-8) is not clipped; locate the
wrapper in CosmeticButton and change the CSS class logic to toggle
overflow-visible when rendering the bonus ribbon.

displayName: z.string(),
currency: z.enum(["hard", "soft"]),
amount: z.number().int().positive(),
bonusAmount: z.number().int().nonnegative(),
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

⚠️ Potential issue | 🔴 Critical | ⚡ Quick win

Add tests for the schema change.

The coding guidelines require that all changes to src/core/ must include tests. Please add test coverage for the new bonusAmount field in PackSchema.

Run the following script to check for existing test coverage:

#!/bin/bash
# Description: Search for test files covering PackSchema or CosmeticSchemas

# Search for test files that might cover this schema
rg -l 'PackSchema|CosmeticSchemas' --glob '*test*' --glob '*spec*'

# Search for any tests in the core directory
fd -e test.ts -e spec.ts . src/core/

As per coding guidelines: "All changes to src/core/ must include tests"

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@src/core/CosmeticSchemas.ts` at line 86, Add unit tests for the new
bonusAmount field on PackSchema in CosmeticSchemas: create or update a test that
imports PackSchema (from CosmeticSchemas) and verifies
PackSchema.safeParse/parse accepts valid integer nonnegative values (e.g., 0 and
positive ints) and rejects negative numbers, non-integers (floats), and
non-number types; also include a test for required behavior (ensure omission
fails if field is required, or succeeds if optional). Use the existing test
conventions for core schemas (safeParse assertions and expectation of error
messages) and place the test alongside other core/schema tests so the test
runner detects it.

@github-project-automation github-project-automation Bot moved this from Complete to Development in OpenFront Release Management May 13, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

Status: Development

Development

Successfully merging this pull request may close these issues.

2 participants