113 lines
11 KiB
HTML
Executable File
113 lines
11 KiB
HTML
Executable File
<!doctype html>
|
||
<html lang="en">
|
||
<head>
|
||
<meta charset="utf-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||
<meta name="robots" content="noindex">
|
||
<title>{% if title %}{{ title }}{% else %}Membership{% endif %} · eom.dev</title>
|
||
<link rel="stylesheet" href="/static/home.css">
|
||
<link rel="stylesheet" href="/static/membership.css">
|
||
<link rel="icon" href="/static/favicon.svg" type="image/svg+xml">
|
||
</head>
|
||
<body>
|
||
<header class="member-nav">
|
||
<a class="brand" href="/">eom.dev</a>
|
||
<nav aria-label="Membership navigation"><a href="/">Home</a><a href="{% url 'members:home' %}">Membership</a></nav>
|
||
</header>
|
||
<main id="main-content" class="member-main">
|
||
{% if title %}
|
||
<section class="member-panel form-panel">
|
||
<p class="eyebrow">One account. An independent community.</p>
|
||
<h1>{{ title }}</h1>
|
||
{% if message %}<p>{{ message }}</p>{% endif %}
|
||
{% if registration %}
|
||
<p>Your eom.dev account gives you a shared sign-in for the community services included at your membership level. Free accounts include forums, chat, Git hosting, and games; some additional services require a paid tier.</p>
|
||
<ol>
|
||
<li>Choose a username and enter your email address below.</li>
|
||
<li>Check your inbox and follow the confirmation link.</li>
|
||
<li>Choose a password, then sign in and start exploring.</li>
|
||
</ol>
|
||
<p>Creating an account is free. Paid memberships are optional and unlock additional benefits.</p>
|
||
{% endif %}
|
||
{% if form %}
|
||
<form method="post">
|
||
{% csrf_token %}
|
||
{{ form.as_p }}
|
||
<button class="button button-primary" type="submit">{{ submit }}</button>
|
||
</form>
|
||
{% endif %}
|
||
<p><a href="{% url 'members:home' %}">Back to membership</a></p>
|
||
<form action="{% url 'members:login' %}" method="post">{% csrf_token %}<button class="button button-secondary" type="submit">Sign in to eom.dev</button></form>
|
||
</section>
|
||
{% else %}
|
||
<section class="member-hero">
|
||
<p class="eyebrow">Music, films, projects & shared worlds</p>
|
||
<h1>Support the work.<br>Get closer to what’s next.</h1>
|
||
<p class="member-intro">Membership supports my music, films, writing, open-source projects, and game servers. Join the community for free, or choose a paid tier to support the work and receive the benefits listed below.</p>
|
||
{% if account %}
|
||
<div class="member-panel account-panel">
|
||
<div><p class="eyebrow">Your eom.dev account · Membership level {{ account.membership_level }}</p><h2>{{ account.uid }}</h2><p>{{ account.email }}</p></div>
|
||
<div class="member-actions">
|
||
<a class="button button-secondary" href="{% url 'members:profile' %}">Edit profile</a>
|
||
{% if account.stripe_customer %}<form action="{% url 'members:portal' %}" method="post">{% csrf_token %}<button class="button button-primary" type="submit">Manage billing</button></form>{% endif %}
|
||
<form action="{% url 'members:logout' %}" method="post">{% csrf_token %}<button class="button button-secondary" type="submit">Sign out</button></form>
|
||
</div>
|
||
</div>
|
||
{% if request.GET.checkout %}<p role="status" class="member-notice">Thanks for supporting the work. Your membership benefits become available once Stripe confirms payment and your account access updates.</p>{% endif %}
|
||
{% for subscription in subscriptions %}
|
||
<p class="member-notice">{% for key, tier in tiers.items %}{% if key == subscription.tier %}{{ tier.label }}{% endif %}{% empty %}Membership{% endfor %} · {{ subscription.status }}{% if subscription.paid_until > now %} · Paid access through {{ subscription.paid_until|date:"M j, Y H:i T" }}{% else %} · No current paid access{% endif %}{% if subscription.cancel_at_period_end %} · Does not renew{% endif %}</p>
|
||
{% endfor %}
|
||
{% for invoice in crypto_invoices %}
|
||
<p class="member-notice">SHKeeper · {% for key, tier in tiers.items %}{% if key == invoice.tier %}{{ tier.label }}{% endif %}{% empty %}Membership{% endfor %} · {{ invoice.status }}{% if invoice.access_end > now %} · Prepaid term {{ invoice.access_start|date:"M j, Y" }}–{{ invoice.access_end|date:"M j, Y" }}{% endif %} · <a href="{% url 'members:crypto_invoice' invoice.id %}">View crypto invoice</a></p>
|
||
{% endfor %}
|
||
<p class="member-small">Membership access updates automatically, usually within a few minutes. Signing out here does not sign you out of other eom.dev services.</p>
|
||
{% else %}
|
||
<div class="member-actions">
|
||
<a class="button button-primary" href="{% url 'members:register' %}">Create a free account</a>
|
||
<form action="{% url 'members:login' %}" method="post">{% csrf_token %}<button class="button button-secondary" type="submit">Sign in to eom.dev</button></form>
|
||
</div>
|
||
{% endif %}
|
||
</section>
|
||
<section aria-labelledby="tiers-heading">
|
||
<div class="section-heading"><p class="eyebrow">Your support, your choice</p><h2 id="tiers-heading">Choose how to take part</h2><p>Public recordings, writing, and source code remain available without a paid membership. Your support helps fund creative time, recording, travel, and independent publishing.</p><p>Paid benefits build by level: Bronze adds exclusive Discourse and Matrix content; Silver adds previews when available; Gold adds project-topic polls and occasional feedback sessions. Compare the full benefits below.</p></div>
|
||
<div class="member-grid">
|
||
<article class="member-panel tier-card free-tier">
|
||
<p class="card-kicker">Level 0 · The starting point</p><h3>Open Lab</h3><p class="tier-price">Free <span>/ always</span></p>
|
||
<p>Join the community without a subscription.</p>
|
||
<ul><li>Games hosted on eom.dev</li><li>Open Lab-tier giveaways</li></ul>
|
||
{% if not account %}<a class="button button-secondary" href="{% url 'members:register' %}">Join the community</a>{% else %}<p class="tier-footnote">Your free account is ready.</p>{% endif %}
|
||
</article>
|
||
{% for key, tier in tiers.items %}
|
||
<article class="member-panel tier-card">
|
||
<p class="card-kicker">Level {{ tier.level }}</p><h3>{{ tier.label }}</h3><p class="tier-price">{{ tier.price_label }}</p>
|
||
<p>{{ tier.description|default:"Support the independent work and community." }}</p>
|
||
<ul>{% for benefit in tier.benefits %}<li>{{ benefit }}</li>{% empty %}<li>Support independent projects and the community</li>{% endfor %}<li>Plus all previous benefits</li></ul>
|
||
{% if account %}<div class="tier-payment-actions"><form action="{% url 'members:checkout' key %}" method="post">{% csrf_token %}<button class="button button-primary" type="submit">Subscribe with Stripe</button></form>
|
||
{% if shkeeper_enabled and tier.usd_amount %}<a class="button button-secondary" href="{% url 'members:crypto_checkout' key %}">Pay with crypto</a>{% endif %}</div>{% else %}<a class="button button-primary" href="{% url 'members:register' %}">Create an account to join</a>{% endif %}
|
||
</article>
|
||
{% empty %}<div class="member-panel"><h3>Paid memberships are coming soon.</h3><p>You can create your free account now. Paid tiers will appear when their prices and groups are configured.</p></div>{% endfor %}
|
||
</div>
|
||
<div class="member-panel service-access-panel">
|
||
<h3>Community services by level</h3>
|
||
<p>Watching public videos and reading public posts is separate from having an account on those services. This list shows access by level, including channels that are open to everyone.</p>
|
||
{% if services %}<ul class="service-access-list">{% for service in services %}<li><div class="service-access-identity">{% if service.url %}<a class="service-access-link" href="{{ service.url }}"><img src="{{ service.favicon }}" alt="" width="32" height="32" loading="lazy" decoding="async"><strong>{{ service.name }}</strong></a>{% else %}<strong>{{ service.name }}</strong>{% endif %}</div><span>{{ service.access }}</span></li>{% endfor %}</ul>{% else %}<p>No additional service access is currently configured.</p>{% endif %}
|
||
</div>
|
||
<p class="member-small">Service access updates with your membership. You may need to sign in again to a service after it changes. Each service's own rules still apply.</p>
|
||
<p class="member-small">Previews are shared when available, and playtests, listening sessions and feedback gatherings are occasional. There is no fixed release schedule. Membership does not include storage quotas, personal consulting, managed hosting, guaranteed support or promised feature development. Recognition is always optional.</p>
|
||
</section>
|
||
<section class="member-faq" aria-labelledby="membership-faq">
|
||
<h2 id="membership-faq">Before you join</h2>
|
||
<details><summary>Do I need a paid membership to watch, read, or play?</summary><p>No. Public videos, writing, and source code can be explored without a paid membership. A free Open Lab (Level 0) account includes access to games hosted on eom.dev, and paid members can play too. No paid-exclusive game servers are currently included.</p></details>
|
||
<details><summary>How do membership giveaways work?</summary><p>Giveaways are associated with a membership tier. Higher tiers include giveaway benefits from lower tiers, including Open Lab. Each giveaway's rules will list its availability, dates, prizes and any eligibility restrictions. Membership does not guarantee a prize.</p></details>
|
||
<details><summary>What do membership polls influence?</summary><p>Gold (Level 3) and above can share preferences about future project topics and experiments. Platinum (Level 4) and Diamond (Level 5) also receive separate polls about the direction of eom.dev itself. Results inform my decisions; they are not binding commitments or guarantees of particular features.</p></details>
|
||
<details><summary>What happens when a membership ends?</summary><p>Your free eom.dev account stays. Member-only access ends when your paid membership expires. An immediate cancellation removes that access once your membership status updates.</p></details>
|
||
<details><summary>Where do members connect?</summary><p>On Discourse and Matrix. Ordinary community access is free; Bronze and above also receive exclusive content in those services.</p></details>
|
||
<details><summary>Can I change or cancel a plan?</summary><p>Use Manage billing after signing in. The billing portal offers the changes enabled for your plan. Cancellation at period end keeps access through the paid expiry date.</p></details>
|
||
{% if shkeeper_enabled %}<details><summary>How do crypto memberships renew?</summary><p>SHKeeper payments prepay one calendar month, without automatic charges. Create a new invoice for each renewal. Confirmed payment on the same tier extends its prepaid term. Partial or unconfirmed payments do not grant access. Do not send renewal funds to an old invoice address.</p></details>{% endif %}
|
||
</section>
|
||
{% endif %}
|
||
</main>
|
||
<footer class="member-footer">Made independently. Supported by the community. <a href="mailto:eric@eom.dev">Questions? Get in touch.</a></footer>
|
||
</body>
|
||
</html>
|