privacy/terms/support/docs

This commit is contained in:
SowinskiBraeden committed 2026-06-27 13:14:13 -07:00
1 parent 2e1cc10dc7
commit e9d4392b8c
7 files changed
+783 -5

No files matched your search

+1 -1
View File
@@ -9,7 +9,7 @@ DATA_PATH = BASE_DIR / "data" / "entries.csv"
DEFAULT_DATABASE_URL = f"sqlite:///{BASE_DIR / 'data' / 'boker-dev.sqlite3'}" DEFAULT_DATABASE_URL = f"sqlite:///{BASE_DIR / 'data' / 'boker-dev.sqlite3'}"
ELIGIBLE_MIN_SESSIONS = 3 ELIGIBLE_MIN_SESSIONS = 3
APP_VERSION = "2.5.16" APP_VERSION = "2.5.17"
def load_local_env(env_path: Path) -> None: def load_local_env(env_path: Path) -> None:
+11 -1
View File
@@ -25,7 +25,17 @@ def home():
@public_bp.get("/help") @public_bp.get("/help")
def help(): def help():
return render_template("docs.html") return render_template("support.html")
@public_bp.get("/privacy")
def privacy():
return render_template("privacy.html")
@public_bp.get("/terms")
def terms():
return render_template("terms.html")
@public_bp.get("/explore") @public_bp.get("/explore")
+198
View File
@@ -5824,3 +5824,201 @@ select.control { cursor: pointer; }
background: rgba(10,9,18,.9); background: rgba(10,9,18,.9);
padding: 11px 16px; padding: 11px 16px;
} }
/* ================================================================
LEGAL DOCUMENT PAGES (privacy, terms)
================================================================ */
.legal-doc {
max-width: 740px;
margin: 0 auto;
padding: clamp(40px, 5vw, 72px) 0 clamp(48px, 6vw, 80px);
}
.legal-doc__header {
margin-bottom: clamp(32px, 4vw, 52px);
padding-bottom: clamp(24px, 3vw, 36px);
border-bottom: 1px solid var(--divider);
}
.legal-doc__title {
font-size: clamp(26px, 3.5vw, 40px);
font-weight: 800;
color: var(--text-strong);
letter-spacing: -.04em;
line-height: 1.1;
margin: 10px 0 12px;
}
.legal-doc__meta {
font-size: .8125rem;
color: var(--text-muted);
margin: 0;
}
.legal-doc__meta strong { color: var(--faint-2); font-weight: 500; }
.legal-doc__body { font-size: .9375rem; line-height: 1.8; color: var(--text-2); }
.legal-doc__body h2 {
font-size: 1rem;
font-weight: 700;
color: var(--text-strong);
letter-spacing: -.015em;
margin: clamp(32px, 4vw, 48px) 0 12px;
padding-bottom: 8px;
border-bottom: 1px solid var(--divider);
}
.legal-doc__body h3 {
font-size: .875rem;
font-weight: 600;
color: var(--text);
margin: 20px 0 8px;
}
.legal-doc__body p { margin: 0 0 14px; }
.legal-doc__body ul {
margin: 0 0 14px;
padding-left: 20px;
display: grid;
gap: 6px;
}
.legal-doc__body ul li { color: var(--text-2); }
.legal-doc__body a {
color: var(--accent);
text-decoration: none;
transition: opacity .13s;
}
.legal-doc__body a:hover { opacity: .75; }
.legal-doc__body code {
font-family: var(--font-mono);
font-size: .8125rem;
background: var(--surface-raised);
border: 1px solid var(--border);
border-radius: 4px;
padding: 1px 6px;
color: var(--text);
}
.legal-doc__body em { color: var(--text); font-style: italic; }
.legal-doc__body strong { color: var(--text-strong); font-weight: 600; }
/* ================================================================
SUPPORT / HELP PAGE
================================================================ */
.support-pg {
max-width: 820px;
margin: 0 auto;
padding: clamp(40px, 5vw, 72px) 0 0;
}
.support-pg__header {
margin-bottom: clamp(36px, 5vw, 60px);
}
.support-pg__title {
font-size: clamp(26px, 3.5vw, 40px);
font-weight: 800;
color: var(--text-strong);
letter-spacing: -.04em;
line-height: 1.1;
margin: 10px 0 12px;
}
.support-pg__sub {
font-size: .9375rem;
color: var(--text-muted);
margin: 0;
max-width: 540px;
}
.support-pg__body { display: grid; gap: clamp(28px, 4vw, 48px); }
/* FAQ section grouping */
.faq-section {}
.faq-section__title {
font-size: .6875rem;
font-family: var(--font-mono);
letter-spacing: .13em;
text-transform: uppercase;
color: var(--accent);
margin: 0 0 14px;
padding-bottom: 10px;
border-bottom: 1px solid var(--divider);
}
/* FAQ accordion item */
.faq-item {
border-bottom: 1px solid var(--divider);
}
.faq-item__q {
display: flex;
align-items: center;
justify-content: space-between;
gap: 16px;
padding: 14px 0;
font-size: .9375rem;
font-weight: 600;
color: var(--text);
cursor: pointer;
list-style: none;
user-select: none;
transition: color .13s;
}
.faq-item__q::-webkit-details-marker { display: none; }
.faq-item__q::after {
content: "+";
font-size: 1.125rem;
font-weight: 400;
color: var(--text-muted);
flex-shrink: 0;
transition: transform .2s, color .13s;
}
.faq-item[open] > .faq-item__q { color: var(--text-strong); }
.faq-item[open] > .faq-item__q::after {
content: "";
color: var(--accent);
}
.faq-item__q:hover { color: var(--text-strong); }
.faq-item__a {
padding: 0 0 18px;
font-size: .9rem;
line-height: 1.78;
color: var(--text-2);
}
.faq-item__a p { margin: 0 0 10px; }
.faq-item__a p:last-child { margin-bottom: 0; }
.faq-item__a ul {
margin: 8px 0 10px;
padding-left: 20px;
display: grid;
gap: 5px;
}
.faq-item__a a {
color: var(--accent);
text-decoration: none;
transition: opacity .13s;
}
.faq-item__a a:hover { opacity: .75; }
.faq-item__a strong { color: var(--text-strong); font-weight: 600; }
.faq-item__a em { font-style: italic; color: var(--text); }
/* Contact section */
.support-contact {
margin-top: clamp(48px, 6vw, 80px);
border-top: 1px solid var(--divider);
padding: clamp(36px, 5vw, 60px) 0 clamp(48px, 6vw, 72px);
}
.support-contact__inner {
display: flex;
align-items: center;
justify-content: space-between;
gap: 32px;
flex-wrap: wrap;
}
.support-contact__title {
font-size: clamp(18px, 2.2vw, 26px);
font-weight: 800;
color: var(--text-strong);
letter-spacing: -.03em;
margin: 0 0 8px;
}
.support-contact__body {
font-size: .875rem;
color: var(--text-muted);
line-height: 1.65;
margin: 0;
max-width: 480px;
}
.support-contact__btn { flex-shrink: 0; }
@media (max-width: 580px) {
.support-contact__inner { flex-direction: column; align-items: flex-start; }
.support-contact__btn { width: 100%; text-align: center; }
}
+3 -3
View File
@@ -74,9 +74,9 @@
</div> </div>
<nav class="site-footer__links" aria-label="Footer links"> <nav class="site-footer__links" aria-label="Footer links">
<a href="{{ url_for('public.help') }}">Help</a> <a href="{{ url_for('public.help') }}">Help</a>
<a href="#">Contact</a> <a href="{{ url_for('public.help') }}#contact">Contact</a>
<a href="#">Privacy</a> <a href="{{ url_for('public.privacy') }}">Privacy</a>
<a href="#">Terms</a> <a href="{{ url_for('public.terms') }}">Terms</a>
</nav> </nav>
<div class="site-footer__brand"> <div class="site-footer__brand">
<a href="https://cedarline.digital" target="_blank" rel="noopener">cedarline.digital</a> <a href="https://cedarline.digital" target="_blank" rel="noopener">cedarline.digital</a>
+115
View File
@@ -0,0 +1,115 @@
{% extends "base.html" %}
{% block title %}Privacy Policy - myboker.org{% endblock %}
{% block page_class %}page--public{% endblock %}
{% block content %}
<div class="legal-doc">
<header class="legal-doc__header">
<p class="lp-kicker">Legal</p>
<h1 class="legal-doc__title">Privacy Policy</h1>
<p class="legal-doc__meta">Effective June 27, 2026. Operated by <strong>cedarline.digital</strong>, British Columbia, Canada.</p>
</header>
<div class="legal-doc__body">
<h2>1. Who we are</h2>
<p>myboker.org is operated by <strong>cedarline.digital</strong>, a sole proprietorship registered in British Columbia, Canada. "We," "us," and "our" refer to cedarline.digital. By using myboker.org, you agree to the collection and use of information as described in this policy.</p>
<p>This policy is governed by the <em>Personal Information Protection and Electronic Documents Act</em> (PIPEDA) and the BC <em>Personal Information Protection Act</em> (PIPA).</p>
<h2>2. Information we collect</h2>
<h3>Account information</h3>
<ul>
<li>Your <strong>email address</strong>, required to create and verify your account.</li>
<li>Your <strong>password</strong>, stored exclusively as a one-way bcrypt hash. We never store or have access to your plaintext password.</li>
<li>Timestamps for account creation, email verification, and most recent login.</li>
</ul>
<h3>League and gameplay data</h3>
<ul>
<li>League names, descriptions, visibility settings (private or public), and configuration you create.</li>
<li>Player display names and optional notes within your leagues.</li>
<li>Session records: dates, labels, open/close timestamps, and session notes.</li>
<li>Ledger events: buy-ins, cash-outs, fronts, payouts, rollovers, debt repayments, and write-offs. All amounts are recorded in cents with a full append-only audit trail.</li>
<li>The account that created or voided each ledger event.</li>
</ul>
<h3>Membership data</h3>
<ul>
<li>Your role within each league you belong to (owner, manager, or viewer).</li>
<li>Which account invited you and when.</li>
</ul>
<h2>3. What we do not collect</h2>
<ul>
<li><strong>Real names.</strong> Player display names are arbitrary labels chosen by league managers and are not required to correspond to real legal identities.</li>
<li><strong>Payment information.</strong> We do not process, hold, or transfer money of any kind.</li>
<li>Location or GPS data.</li>
<li>Browser fingerprints or device identifiers.</li>
<li>Advertising IDs or third-party tracking identifiers.</li>
<li>Analytics data. There are no third-party analytics scripts (no Google Analytics, Mixpanel, or similar) on myboker.org.</li>
</ul>
<h2>4. Cookies and transient data</h2>
<p>We set <strong>one cookie</strong>: <code>poker_portal_session</code>. This is a functional authentication cookie that keeps you signed in. It contains only an encrypted reference to your session. We do not use advertising cookies, tracking cookies, or any third-party cookies.</p>
<p>Our rate-limiting system temporarily processes your IP address in memory to prevent abuse. IP addresses are not written to disk or retained once the request completes.</p>
<p>Password-reset and league-invitation links are cryptographically signed tokens that expire automatically (1 hour for resets, 7 days for invitations). They are stateless and not stored in our database.</p>
<h2>5. How we use your information</h2>
<ul>
<li>To authenticate you and maintain a secure session.</li>
<li>To store and display your league, session, and player data to you and the members of your leagues.</li>
<li>To send transactional emails: account verification, password reset, and league invitations.</li>
<li>To enforce rate limits and protect the service from abuse.</li>
</ul>
<p>We do not sell, rent, share, or otherwise disclose your personal information to third parties for advertising or marketing purposes.</p>
<h2>6. Third-party services</h2>
<p>We use a third-party SMTP provider to deliver transactional emails. This provider receives only the recipient email address and the message content required to deliver your email. No other personal data is shared with this provider.</p>
<p>We have no other third-party integrations, analytics platforms, or data processors.</p>
<p>Servers hosting myboker.org are located in <strong>North America</strong> (primarily Canada; potentially the United States). Data is not intentionally transferred to the European Union, though no geographic restriction is technically enforced at the network level.</p>
<h2>7. Player display names</h2>
<p>Player profiles in a league use display names set by the league manager. These names do not need to be real legal names; they are arbitrary labels for tracking purposes. All leagues are <strong>private by default</strong>, meaning player data is only visible to members of that specific league.</p>
<p>If you are a league manager adding players, you are responsible for ensuring that players whose results you track have agreed to participate in your league and have their results recorded.</p>
<h2>8. Data retention and deletion</h2>
<p>We retain your data for as long as your account is active. You have two options for removing your data:</p>
<ul>
<li><strong>Account deletion:</strong> available in account settings. This is immediate and permanent. Your account, all leagues you own, and all associated session history are irreversibly removed.</li>
<li><strong>League deletion:</strong> league owners can permanently delete a league, which removes all its sessions, players, and ledger events. Archiving a league preserves data while hiding the league from active views.</li>
</ul>
<p>We do not have automated data expiry periods. Data remains until you delete it. As the user base grows, we may introduce formal retention policies and will update this policy accordingly.</p>
<h2>9. Your rights</h2>
<p>Under PIPEDA and BC PIPA, you have the right to:</p>
<ul>
<li>Know what personal information we hold about you.</li>
<li>Request corrections to inaccurate information.</li>
<li>Request deletion of your personal information (fulfilled via in-app hard delete or by emailing us).</li>
<li>Withdraw consent, subject to legal or contractual limitations.</li>
</ul>
<p>To exercise any of these rights, contact us at <a href="mailto:support@cedarline.digital">support@cedarline.digital</a>. We will respond within 30 days.</p>
<p>If you are a resident of the European Union, additional rights may apply under the GDPR. myboker.org is not specifically directed at EU residents, but we will honour GDPR deletion and access requests made in writing.</p>
<h2>10. Age requirement</h2>
<p>You must be <strong>at least 18 years old</strong> to create an account on myboker.org. By registering, you confirm you meet this requirement. If we become aware that an account was created by someone under 18, we will permanently delete that account.</p>
<h2>11. Security</h2>
<p>We apply standard security measures including encrypted connections (TLS in transit), bcrypt password hashing, CSRF protection, and rate limiting. No method of data transmission or storage is 100% secure. We cannot guarantee absolute security but take reasonable precautions to protect your information.</p>
<h2>12. Changes to this policy</h2>
<p>We may update this Privacy Policy from time to time. When we do, we will update the effective date at the top of this page. Continued use of myboker.org after changes are posted constitutes your acceptance of the revised policy.</p>
<h2>13. Contact</h2>
<p>Questions or requests regarding this policy:</p>
<p>
<strong>cedarline.digital</strong><br>
British Columbia, Canada<br>
<a href="mailto:support@cedarline.digital">support@cedarline.digital</a>
</p>
</div><!-- /.legal-doc__body -->
</div><!-- /.legal-doc -->
{% endblock %}
+351
View File
@@ -0,0 +1,351 @@
{% extends "base.html" %}
{% block title %}Help - myboker.org{% endblock %}
{% block content %}
<div class="hero" style="padding-bottom:12px;">
<p class="hero__kicker">Documentation</p>
<h1 class="hero__title">How myboker works</h1>
<p class="hero__sub">Everything you need to run a home poker league: sessions, ledgers, leaderboards, and settlement.</p>
</div>
<div class="docs-grid">
<nav class="docs-nav">
<p class="kicker">Contents</p>
<a href="#leagues">Leagues</a>
<a href="#members">Members &amp; roles</a>
<a href="#players">Players</a>
<a href="#seasons">Seasons</a>
<a href="#sessions">Sessions</a>
<a href="#events">Ledger events</a>
<a href="#settlement">Settlement</a>
<a href="#leaderboard">Leaderboard &amp; stats</a>
<a href="#visibility">Public vs private</a>
<a href="#account">Account &amp; login</a>
<a href="#privacy">Privacy &amp; data</a>
<a href="#contact">Contact</a>
</nav>
<div class="docs-body">
<section class="docs-section" id="leagues">
<h2 class="docs-h2">Leagues</h2>
<p>A <strong>league</strong> is the top-level container for your home game. It holds all your members, players, sessions, and ledger events in one place. One account can manage multiple leagues, which is useful if you run separate games (a Thursday game and a weekend game, for example).</p>
<p>When you create a league you give it a name and optional description. A unique public key is generated automatically so you can share a link if you make the league public. All leagues start as <strong>private</strong> by default.</p>
<div class="docs-callout">
<strong>Tip:</strong> Leagues are long-lived. You don't need to create a new league every season. Use <em>sessions</em> for individual nights and <em>seasons</em> to group them into periods.
</div>
</section>
<section class="docs-section" id="members">
<h2 class="docs-h2">Members &amp; roles</h2>
<p><strong>Members</strong> are myboker.org account holders who have been granted access to a league. They are distinct from players: a member manages or observes the league, while a player is just a tracked name in the ledger.</p>
<p>Invite members from league settings. They'll receive an email with a unique link that expires after 7 days. Each member is assigned one of three roles:</p>
<div class="docs-term-grid">
<div class="docs-term">
<strong>Owner</strong>
<span>Full control. Can manage settings, invite and remove members, create and close sessions, add players, and permanently delete the league.</span>
</div>
<div class="docs-term">
<strong>Manager</strong>
<span>Can run sessions, record ledger events, manage players, and view all data. Cannot change league settings or manage member roles.</span>
</div>
<div class="docs-term">
<strong>Viewer</strong>
<span>Read-only. Can view sessions, the leaderboard, and player history. Cannot record events or change anything.</span>
</div>
</div>
<div class="docs-callout">
<strong>Removing a member:</strong> Disabling a member removes their access but preserves all their historical contributions. Past session data recorded by them remains intact.
</div>
</section>
<section class="docs-section" id="players">
<h2 class="docs-h2">Players</h2>
<p>Players are the people tracked in your league's ledger. They <strong>do not need a myboker.org account</strong>. A player is just a display name added by a manager or owner. Their results, stats, and history are tied to that name.</p>
<p>Display names don't have to be legal names. They can be nicknames or aliases. Player data is only visible to league members.</p>
<p>You can optionally <strong>link a player profile to a member account</strong>. This lets a real account "claim" their stats, but it is never required.</p>
<div class="docs-term-grid">
<div class="docs-term">
<strong>Active</strong>
<span>Shows on the roster and is available to record events against.</span>
</div>
<div class="docs-term">
<strong>Archived</strong>
<span>Hidden from the active roster. History and stats are fully preserved. Can be reactivated at any time.</span>
</div>
</div>
</section>
<section class="docs-section" id="seasons">
<h2 class="docs-h2">Seasons</h2>
<p>Seasons let you group sessions into defined time periods, for example <em>Season 1</em> or <em>Spring 2026</em>. They are entirely optional. Sessions can exist without belonging to any season.</p>
<p>When viewing the leaderboard, you can filter by season to see rankings for just that period. Seasons have optional start and end dates for reference but these do not restrict which sessions can be assigned to them.</p>
<div class="docs-term-grid">
<div class="docs-term">
<strong>Active</strong>
<span>Visible in the league and available to assign sessions to.</span>
</div>
<div class="docs-term">
<strong>Archived</strong>
<span>Hidden from the active list. Sessions assigned to it are preserved and remain filterable.</span>
</div>
</div>
</section>
<section class="docs-section" id="sessions">
<h2 class="docs-h2">Sessions</h2>
<p>A <strong>session</strong> is a single night of poker. Sessions are date-stamped and sequenced automatically. If you play twice on the same day, they become S1 and S2 for that date.</p>
<p>Sessions have two states: <strong>open</strong> and <strong>closed</strong>. While open, you record buy-ins, cashouts, and all other ledger events. When everyone has settled, close the session. Closing doesn't delete anything and the session can always be reopened.</p>
<div class="docs-term-grid">
<div class="docs-term">
<strong>Date</strong>
<span>The calendar date the game was played. Used to order sessions and group same-day games.</span>
</div>
<div class="docs-term">
<strong>Label</strong>
<span>Optional short name for this session (e.g. "Main table", "Side game"). Shown in lists.</span>
</div>
<div class="docs-term">
<strong>Season</strong>
<span>Optional. Assigns the session to a season so it appears in that season's leaderboard filter.</span>
</div>
<div class="docs-term">
<strong>Notes</strong>
<span>Optional freeform context (e.g. "Holiday game", "Marcus's place").</span>
</div>
<div class="docs-term">
<strong>Open</strong>
<span>Session is live. Events can be added and settlement is still in progress.</span>
</div>
<div class="docs-term">
<strong>Closed</strong>
<span>Session is settled. Books are considered final. Can be reopened if needed.</span>
</div>
</div>
</section>
<section class="docs-section" id="events">
<h2 class="docs-h2">Ledger events</h2>
<p>All activity in a session is recorded as <strong>ledger events</strong>. The ledger is <strong>append-only</strong>. Events are never deleted. This keeps the record auditable even when corrections are needed. To fix a mistake, void the incorrect event and add the correct one.</p>
<div class="docs-events">
<div class="docs-event">
<span class="pill pill-buyin">buy-in</span>
<div>
<strong>A player buys chips with cash.</strong>
<p>Cash comes into the pot. Records how much the player has invested. Record one every time someone puts money on the table.</p>
</div>
</div>
<div class="docs-event">
<span class="pill pill-front">front</span>
<div>
<strong>The house covers a player's buy-in.</strong>
<p>When a player doesn't have cash, the house can front them chips. This creates a debt. The player owes that amount back to the house. Track fronts carefully so you know who owes what at the end of the night.</p>
</div>
</div>
<div class="docs-event">
<span class="pill pill-cashout">cashout</span>
<div>
<strong>A player exchanges their chips for their cash value.</strong>
<p>Records the chip count a player walks away with. This is the "owed X" event. It doesn't mean cash has left the house yet. Use <em>paid out</em> to record the actual handover.</p>
</div>
</div>
<div class="docs-event">
<span class="pill pill-paid_out">paid out</span>
<div>
<strong>Cash physically leaves the house to the player.</strong>
<p>Closes the loop on a cashout. Once paid out, the player's balance goes to $0. Record this separately from cashout because payments may happen at different times.</p>
</div>
</div>
<div class="docs-event">
<span class="pill pill-rollover_in">rollover in</span>
<div>
<strong>Chips or a balance carried in from a previous session.</strong>
<p>Record a rollover in when a player carries an unpaid winning forward from a prior session. Always paired with a rollover out on the source session.</p>
</div>
</div>
<div class="docs-event">
<span class="pill pill-rollover_out">rollover out</span>
<div>
<strong>An unpaid winning deferred to a future session.</strong>
<p>Recorded when a player's payout isn't settled immediately and will be carried to the next game. Paired with a rollover in on the receiving session.</p>
</div>
</div>
<div class="docs-event">
<span class="pill pill-payout_carry_in">payout carry-in</span>
<div>
<strong>An outstanding winning from a prior session honoured here.</strong>
<p>Similar to rollover in but used when the balance isn't tied to a specific session's rollover out. Adds to the player's total payout due in this session.</p>
</div>
</div>
<div class="docs-event">
<span class="pill pill-debt_repayment">debt repayment</span>
<div>
<strong>A player repays an outstanding front.</strong>
<p>When a player who was fronted chips pays the house back, record a debt repayment. This reduces their outstanding balance with the house.</p>
</div>
</div>
<div class="docs-event">
<span class="pill pill-writeoff">write-off</span>
<div>
<strong>The house forgives a debt.</strong>
<p>If a front won't be collected (player left, debt forgiven), write it off. The debt is cleared from the open balance without cash changing hands. Add a note explaining why.</p>
</div>
</div>
</div>
</section>
<section class="docs-section" id="settlement">
<h2 class="docs-h2">Settlement</h2>
<p>The ledger tracks two types of open balance at all times:</p>
<div class="docs-term-grid">
<div class="docs-term">
<strong>Due to players</strong>
<span>Cash the house owes to players who have cashed out but haven't been paid yet. Record a paid out event to clear each balance.</span>
</div>
<div class="docs-term">
<strong>Due to house</strong>
<span>Cash players owe from unpaid fronts. Collect debt repayments or write off to clear the balance.</span>
</div>
<div class="docs-term">
<strong>Cash in</strong>
<span>Total real cash that has entered the pot: buy-ins and repaid fronts only. Fronts themselves don't count because no cash entered.</span>
</div>
<div class="docs-term">
<strong>Cash paid out</strong>
<span>Total real cash that has left the house to players. Should approach cash in over time once all balances are settled.</span>
</div>
</div>
<div class="docs-callout">
<strong>Fronts vs buy-ins:</strong> A front doesn't add to "cash in" because no cash actually entered the pot. The house covered it. Cash in only counts money physically on the table.
</div>
</section>
<section class="docs-section" id="leaderboard">
<h2 class="docs-h2">Leaderboard &amp; stats</h2>
<p>The leaderboard ranks players by their all-time performance within a league. Stats are computed directly from ledger events and are never manually entered.</p>
<p>Players must meet the <strong>minimum sessions threshold</strong> set in league settings (default: 3) before appearing in the ranked leaderboard. Players below the threshold are shown in a provisional section.</p>
<div class="docs-term-grid">
<div class="docs-term">
<strong>Net</strong>
<span>Total cash out minus total invested across all sessions. Positive means up, negative means down.</span>
</div>
<div class="docs-term">
<strong>ROI</strong>
<span>Net divided by total invested, as a percentage. Compares performance independent of how much someone plays.</span>
</div>
<div class="docs-term">
<strong>Win rate</strong>
<span>Percentage of sessions where the player finished with a positive net. Breaking exactly even counts as a loss.</span>
</div>
<div class="docs-term">
<strong>Sessions played</strong>
<span>Number of sessions with at least one ledger event for this player.</span>
</div>
<div class="docs-term">
<strong>Biggest win</strong>
<span>The single session where the player netted the most profit.</span>
</div>
<div class="docs-term">
<strong>Biggest loss</strong>
<span>The single session where the player lost the most money.</span>
</div>
</div>
</section>
<section class="docs-section" id="visibility">
<h2 class="docs-h2">Public vs private</h2>
<p>Each league has a <strong>visibility</strong> setting you can change in league settings at any time.</p>
<div class="docs-term-grid">
<div class="docs-term">
<strong>Private</strong>
<span>Only invited members can see this league. It will not appear on the Explore page. This is the default for all new leagues.</span>
</div>
<div class="docs-term">
<strong>Public</strong>
<span>Anyone on the Explore page can view the leaderboard and session results. No account required to view. Members still need an account to manage it.</span>
</div>
</div>
<div class="docs-callout">
<strong>Note:</strong> Making a league public shares leaderboard rankings and session results, but not private financial details like individual debt balances or member email addresses.
</div>
</section>
<!-- ── Account & Login (FAQ dropdowns) ─────────────────────── -->
<section class="docs-section" id="account">
<h2 class="docs-h2">Account &amp; login</h2>
<details class="faq-item">
<summary class="faq-item__q">I didn't receive a verification email.</summary>
<div class="faq-item__a">
<p>Check your spam or junk folder first. Verification emails are sent from <strong>noreply@myboker.org</strong>. If you still can't find it, sign in and use the <em>Resend verification email</em> option on your account page.</p>
<p>If you continue to have trouble, contact us at <a href="mailto:support@cedarline.digital">support@cedarline.digital</a>.</p>
</div>
</details>
<details class="faq-item">
<summary class="faq-item__q">How do I reset my password?</summary>
<div class="faq-item__a">
<p>On the sign-in page, click <strong>Forgot password?</strong> and enter your email address. You will receive a reset link that expires after <strong>1 hour</strong>. Follow the link and choose a new password.</p>
<p>If you don't receive the email, check your spam folder or contact support.</p>
</div>
</details>
<details class="faq-item">
<summary class="faq-item__q">How do I accept a league invitation?</summary>
<div class="faq-item__a">
<p>When a league owner invites you, you will receive an email with a unique invitation link. Clicking it will either sign you in directly (if you already have an account with that email) or guide you through creating an account first.</p>
<p>Invitation links expire after <strong>7 days</strong>. If yours has expired, ask the league owner to send a new one.</p>
</div>
</details>
<details class="faq-item">
<summary class="faq-item__q">How do I delete my account?</summary>
<div class="faq-item__a">
<p>Account deletion is available in your account settings. <strong>This is permanent and cannot be undone.</strong> Deleting your account removes your login credentials, all leagues you own and their complete session history, and your membership records in any leagues you belong to.</p>
<p>If you own leagues with other active members, consider notifying them before deleting your account as they will lose access to that league's data.</p>
</div>
</details>
</section>
<!-- ── Privacy & Data (FAQ dropdowns) ──────────────────────── -->
<section class="docs-section" id="privacy">
<h2 class="docs-h2">Privacy &amp; your data</h2>
<details class="faq-item">
<summary class="faq-item__q">Who can see my league data?</summary>
<div class="faq-item__a">
<p>For private leagues (the default): only invited members with active access. No one outside your league can see sessions, players, or financials.</p>
<p>For public leagues: the leaderboard is visible to any signed-in user on the Explore page. Full session detail and financials are still restricted to invited members.</p>
</div>
</details>
<details class="faq-item">
<summary class="faq-item__q">Does myboker.org track me or use analytics?</summary>
<div class="faq-item__a">
<p>No. There are no third-party analytics scripts on myboker.org. We set one functional session cookie to keep you signed in and nothing else. We do not sell or share your data. See the full <a href="{{ url_for('public.privacy') }}">Privacy Policy</a> for details.</p>
</div>
</details>
<details class="faq-item">
<summary class="faq-item__q">How do I request a copy of my data or have it deleted?</summary>
<div class="faq-item__a">
<p>You can permanently delete your account and all associated data directly from account settings at any time. To request an export or to have data deleted on your behalf, email <a href="mailto:support@cedarline.digital">support@cedarline.digital</a> from the address associated with your account. We respond within 30 days.</p>
</div>
</details>
</section>
<!-- ── Contact ──────────────────────────────────────────────── -->
<section class="docs-section" id="contact">
<h2 class="docs-h2">Contact</h2>
<p>myboker.org is operated by <strong>cedarline.digital</strong>, a sole proprietorship based in British Columbia, Canada.</p>
<p>For support, data requests, or anything else: <a href="mailto:support@cedarline.digital">support@cedarline.digital</a>. Please allow a few days for a response.</p>
<div class="docs-callout">
<strong>Legal:</strong> See the <a href="{{ url_for('public.privacy') }}">Privacy Policy</a> and <a href="{{ url_for('public.terms') }}">Terms of Service</a> for details on how your data is handled and the rules governing use of the service.
</div>
</section>
</div>
</div>
{% endblock %}
+104
View File
@@ -0,0 +1,104 @@
{% extends "base.html" %}
{% block title %}Terms of Service - myboker.org{% endblock %}
{% block page_class %}page--public{% endblock %}
{% block content %}
<div class="legal-doc">
<header class="legal-doc__header">
<p class="lp-kicker">Legal</p>
<h1 class="legal-doc__title">Terms of Service</h1>
<p class="legal-doc__meta">Effective June 27, 2026. Operated by <strong>cedarline.digital</strong>, British Columbia, Canada.</p>
</header>
<div class="legal-doc__body">
<h2>1. Acceptance of terms</h2>
<p>By accessing or using myboker.org ("the Service"), you agree to be bound by these Terms of Service ("Terms"). If you do not agree to these Terms, do not use the Service.</p>
<h2>2. Who operates this Service</h2>
<p>myboker.org is operated by <strong>cedarline.digital</strong>, a sole proprietorship registered in British Columbia, Canada ("we," "us," "our"). The Service is a personal side project offered free of charge.</p>
<h2>3. Age requirement</h2>
<p>You must be <strong>at least 18 years old</strong> to use myboker.org. By creating an account, you confirm you are 18 or older and legally permitted to engage in or track recreational poker play in your jurisdiction. If we learn that an account was created by someone under 18, we reserve the right to permanently delete that account without notice.</p>
<h2>4. What myboker.org is and is not</h2>
<p>myboker.org is a <strong>statistical record-keeping tool</strong> for private home poker leagues. It allows league organizers to log buy-ins, cash-outs, and settlements for informational and tracking purposes.</p>
<p><strong>We are not:</strong></p>
<ul>
<li>An online casino or gambling platform</li>
<li>A payment processor. We do not hold, transfer, or facilitate the movement of money</li>
<li>A financial institution or licensed financial services provider</li>
<li>A legal or financial advisor</li>
</ul>
<p>All real-money transactions occur directly between players, entirely outside of this platform. We bear no responsibility for any debts, payments, disputes, or financial losses that arise between players in your league.</p>
<h2>5. Your account</h2>
<p>You are responsible for:</p>
<ul>
<li>Keeping your login credentials secure and confidential</li>
<li>All activity that occurs under your account</li>
<li>Providing a valid, working email address</li>
<li>Ensuring your use of the Service complies with these Terms and all applicable laws</li>
</ul>
<p>You may not create multiple accounts to circumvent a suspension, share your account credentials with others, or use the Service for automated data scraping.</p>
<h2>6. League owners and data responsibility</h2>
<p>If you create a league, you are the league owner and are solely responsible for:</p>
<ul>
<li>Ensuring that players whose data you enter are participants in your poker league and have agreed to have their results tracked</li>
<li>The accuracy of the data you enter into the Service</li>
<li>Managing member roles and access appropriately</li>
<li>Keeping your league set to <strong>Private</strong> (the default) unless you intend for it to be publicly discoverable</li>
</ul>
<p>Player display names are arbitrary labels and are not required to be real legal names. However, you must not enter data in a way intended to harm, harass, defame, or identify individuals who have not consented to being tracked.</p>
<h2>7. Acceptable use</h2>
<p>You agree not to use myboker.org to:</p>
<ul>
<li>Violate any applicable local, provincial, federal, or international law</li>
<li>Attempt to gain unauthorized access to another user's account or league data</li>
<li>Interfere with, disrupt, or degrade the performance of the Service or its infrastructure</li>
<li>Reverse engineer, decompile, or attempt to extract proprietary source code from the Service</li>
<li>Track individuals without their knowledge or consent</li>
<li>Upload or transmit malicious code, viruses, or other harmful content</li>
</ul>
<h2>8. Financial data disclaimer</h2>
<p>Amounts recorded in myboker.org are for <strong>reference and tracking purposes only</strong>. We make no representations about the accuracy, completeness, or legal weight of any financial data entered by users.</p>
<p>We are not responsible for any disputes, non-payment, or financial losses arising from information tracked in the Service. Home poker games may be subject to local laws. It is your responsibility to ensure your activities comply with the laws of your jurisdiction.</p>
<h2>9. Account and data deletion</h2>
<p>You may permanently delete your account at any time through account settings. <strong>Deletion is immediate and irreversible.</strong> All personal data associated with your account, all leagues you own, and all associated session and player history will be removed. Members of leagues you own will permanently lose access to that league's data.</p>
<p>League owners may also permanently delete individual leagues without deleting their account. This removes all sessions, players, and ledger events for that league. We strongly recommend reviewing your data before deletion, as this action cannot be undone.</p>
<h2>10. Service availability</h2>
<p>myboker.org is provided <strong>as-is</strong> and <strong>free of charge</strong>. We do not guarantee continuous availability, uptime, error-free operation, or data preservation. We may perform maintenance, push updates, or experience outages at any time. We will make reasonable efforts to notify users of planned downtime when possible.</p>
<h2>11. Intellectual property</h2>
<p>The myboker.org software, design, and branding are owned by cedarline.digital. You retain ownership of all data you enter into the Service (league names, player names, session data). You grant us a limited licence to store and display that data for the purpose of providing the Service to you.</p>
<h2>12. Limitation of liability</h2>
<p>To the fullest extent permitted by applicable law, cedarline.digital shall not be liable for any indirect, incidental, special, consequential, or punitive damages arising out of or related to your use of, or inability to use, the Service, including but not limited to loss of data, revenue, or goodwill.</p>
<p>Our total aggregate liability to you for any claim arising from these Terms shall not exceed the total amount you have paid us in the twelve months preceding the claim. As the Service is currently free of charge, this limit is <strong>$0 CAD</strong>.</p>
<h2>13. Suspension and termination</h2>
<p>We reserve the right to suspend or permanently terminate any account, at our discretion, for violations of these Terms, abusive behaviour, or any activity that we reasonably believe poses a risk to the Service or other users. We will make reasonable efforts to notify affected users unless doing so would compromise security or is prohibited by law.</p>
<h2>14. Changes to these Terms</h2>
<p>We may update these Terms at any time. When we do, we will update the effective date at the top of this page. Continued use of myboker.org after changes are posted constitutes your acceptance of the revised Terms. If changes are material, we will make reasonable efforts to inform users.</p>
<h2>15. Governing law</h2>
<p>These Terms are governed by and construed in accordance with the laws of the Province of British Columbia and the federal laws of Canada applicable therein, without regard to conflict of law principles. You agree that any dispute arising under these Terms shall be subject to the exclusive jurisdiction of the courts of British Columbia.</p>
<h2>16. Contact</h2>
<p>Questions about these Terms:</p>
<p>
<strong>cedarline.digital</strong><br>
British Columbia, Canada<br>
<a href="mailto:support@cedarline.digital">support@cedarline.digital</a>
</p>
</div><!-- /.legal-doc__body -->
</div><!-- /.legal-doc -->
{% endblock %}