diff --git a/htdocs/index.html b/htdocs/index.html index e86ba43..9289206 100644 --- a/htdocs/index.html +++ b/htdocs/index.html @@ -13,6 +13,7 @@ Explore the projects Join the conversation Create an eom.dev account + Browse community services

Independent software, open-source projects, music, and games—made in Raleigh, North Carolina.

@@ -94,6 +95,65 @@ +
+
+

One account, a community of services

+

Find your place on eom.dev

+

A free account includes forums, chat, Git hosting and hosted games. Gold (Level 3) and above add Mastodon and PeerTube account access. Public posts and videos can still be browsed without a paid membership.

+
+
+
+

Free · Level 0 and above

+

Discourse · Forums

+

Ask questions, share projects and join longer conversations. Bronze and above also get exclusive member content.

+ Visit Discourse +
+
+

Free · Level 0 and above

+

Matrix · Chat

+

Keep in touch in community rooms through Element. Bronze and above also get exclusive member content.

+ Open Matrix chat +
+
+

Free · Level 0 and above

+

Gitea · Git hosting

+

Host code, collaborate on repositories and explore the projects behind the lab.

+ Explore Gitea +
+
+

Free · Level 0 and above

+

Hosted games

+

Join community games, including Luanti, and try The Button. No paid membership is needed; exclusive higher-tier servers are not currently offered.

+ +
+
+

Gold · Levels 3–5

+

Mastodon · Social networking

+

Participate with an eom.dev Mastodon account and connect with the wider fediverse.

+ Visit Mastodon +
+
+

Gold · Levels 3–5

+

PeerTube · Video sharing

+

Use an eom.dev PeerTube account to take part in the video community. Public recordings remain available to watch.

+ Visit PeerTube +
+
+

Included with your free account

+

Dex · Shared sign-in

+

Use the same eom.dev identity across compatible services. Dex handles sign-in; start from the service you want to use.

+ Create your account +
+
+

Public live channel

+

Owncast · Live streams

+

Watch live performances, experiments and work in progress when the channel is on air.

+ Watch Owncast +
+
+

Compare membership benefits and included services

+
+

Built in public

diff --git a/membership/members/tests/test_service_groups.py b/membership/members/tests/test_service_groups.py index e2eaa4a..5a28bfb 100755 --- a/membership/members/tests/test_service_groups.py +++ b/membership/members/tests/test_service_groups.py @@ -81,6 +81,59 @@ class ServiceGroupLDAPIntegrationTests(TestCase): @override_settings(MEMBERSHIP_TIERS=TIERS) class ServiceDisplayTests(TestCase): + def test_published_tier_copy_matches_role_defaults(self): + root = Path(__file__).absolute().parents[3] + tiers = json.loads((root / "membership/tiers.eom.json").read_text(encoding="utf-8")) + role = root.parent / "ansible-role-www/defaults/main.yml" + if not role.exists(): + self.skipTest("Role checkout is not present in the application test image") + import yaml + + deployed = yaml.safe_load(role.read_text(encoding="utf-8"))["www_membership_tiers"] + for key, tier in tiers.items(): + self.assertEqual(tier["description"], deployed[key]["description"]) + self.assertEqual(tier["benefits"], deployed[key]["benefits"]) + + def test_homepage_lists_services_with_clear_access_labels(self): + root = Path(__file__).absolute().parents[3] + homepage = root / "htdocs/index.html" + if not homepage.exists(): + self.skipTest("Static website checkout is not present in the application test image") + from html.parser import HTMLParser + + class DirectoryParser(HTMLParser): + def __init__(self): + super().__init__() + self.active = False + self.text = [] + self.links = [] + + def handle_starttag(self, tag, attrs): + attributes = dict(attrs) + if tag == "section" and attributes.get("id") == "services": + self.active = True + if self.active and tag == "a": + self.links.append(attributes.get("href")) + + def handle_endtag(self, tag): + if tag == "section": + self.active = False + + def handle_data(self, data): + if self.active: + self.text.append(data) + + parser = DirectoryParser() + parser.feed(homepage.read_text(encoding="utf-8")) + text = " ".join(parser.text) + for name in ("Dex", "Discourse", "Matrix", "Gitea", "Mastodon", "PeerTube", "Hosted games", "Owncast"): + self.assertIn(name, text) + self.assertIn("Free · Level 0 and above", text) + self.assertIn("Gold · Levels 3–5", text) + self.assertIn("not currently offered", text) + self.assertIn("/members/", parser.links) + self.assertIn("https://element.eom.dev/", parser.links) + @override_settings(MEMBERSHIP_SERVICE_GROUPS={ "0": ["cn=Dex Users," + BASE, "cn=Matrix Users," + BASE], "1": ["cn=Gitea Users," + BASE], diff --git a/membership/templates/members.html b/membership/templates/members.html index 3ce7478..fcb113a 100755 --- a/membership/templates/members.html +++ b/membership/templates/members.html @@ -43,7 +43,7 @@

Keep your own corner of the internet alive

A place to belong.
A way to give back.

-

A private place to connect, a closer look at what is being made, and opportunities to help shape it. Start with a free eom.dev account, then choose an optional membership to support the independent work.

+

Join free for community services and games. Choose a paid tier for exclusive content, previews and a closer say in what comes next.

{% if account %}
diff --git a/membership/tiers.eom.json b/membership/tiers.eom.json index 0c0a730..bc9865b 100755 --- a/membership/tiers.eom.json +++ b/membership/tiers.eom.json @@ -6,10 +6,9 @@ "price_label": "$4 USD / month", "usd_amount": "4.00", "group_dn": "cn=Level 1,ou=Members,dc=eom,dc=dev", - "description": "Kick off the experiment with a private place to connect and a closer look at what is being made.", + "description": "Go beyond the public feed.", "benefits": [ - "Exclusive members-only content on Discourse and Matrix", - "Behind-the-scenes notes and work-in-progress updates", + "Exclusive Discourse and Matrix content, including work-in-progress updates", "Giveaways exclusive to Bronze members", "Optional credit on the community supporters page" ] @@ -21,12 +20,11 @@ "price_label": "$8 USD / month", "usd_amount": "8.00", "group_dn": "cn=Level 2,ou=Members,dc=eom,dc=dev", - "description": "Venture behind the scenes and explore new experiments before their public release.", + "description": "Try new work before release.", "benefits": [ "Bronze content and community benefits", "Giveaways exclusive to Silver members", - "Early previews of music, games, videos and experiments when available", - "Invitations to member playtests and listening sessions" + "Early previews, playtests and listening sessions when available" ] }, "level-3": { @@ -36,7 +34,7 @@ "price_label": "$16 USD / month", "usd_amount": "16.00", "group_dn": "cn=Level 3,ou=Members,dc=eom,dc=dev", - "description": "Bring your perspective and help shape the next community experiment.", + "description": "Help shape the next experiment.", "benefits": [ "Silver content and community benefits", "Giveaways exclusive to Gold members", @@ -51,13 +49,11 @@ "price_label": "$32 USD / month", "usd_amount": "32.00", "group_dn": "cn=Level 4,ou=Members,dc=eom,dc=dev", - "description": "Support the platform and help guide its direction through exclusive polls.", + "description": "Have a voice in the platform's direction.", "benefits": [ "Gold content and community benefits", "Giveaways exclusive to Platinum members", - "Exclusive polls on the direction of the platform", - "A larger contribution toward servers and public projects", - "Choose this level if you would like to give more" + "Exclusive platform-direction polls" ] }, "level-5": { @@ -67,13 +63,11 @@ "price_label": "$64 USD / month", "usd_amount": "64.00", "group_dn": "cn=Level 5,ou=Members,dc=eom,dc=dev", - "description": "Help underwrite the public work and the community around it.", + "description": "Give the independent work its biggest boost.", "benefits": [ - "Gold content and community benefits", + "Platinum content and platform-direction polls", "Giveaways exclusive to Diamond members", - "Exclusive polls on the direction of the platform", - "Optional Diamond credit on the supporters page", - "Your biggest boost for independent public projects" + "Optional Diamond credit on the supporters page" ] } }