.build/codex/skills/community-platform-patterns/SKILL.md
Build community platforms with user profiles, discussion forums, event management, and moderation tools. Covers real-time features, content moderation, and community engagement patterns. Triggers on community platform development, forum design, or social feature requests.
npx skillsauth add organvm-iv-taxis/a-i--skills community-platform-patternsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Build engaging community platforms with sustainable moderation and meaningful interaction design.
from datetime import datetime
from enum import Enum
class MemberRole(str, Enum):
MEMBER = "member"
MODERATOR = "moderator"
ADMIN = "admin"
class ContentStatus(str, Enum):
DRAFT = "draft"
PUBLISHED = "published"
HIDDEN = "hidden" # Soft-removed by mod
ARCHIVED = "archived"
# Core entities
class Member:
id: str
display_name: str
bio: str
joined_at: datetime
role: MemberRole
reputation: int = 0
class Discussion:
id: str
title: str
body: str
author_id: str
category: str
status: ContentStatus
created_at: datetime
reply_count: int = 0
view_count: int = 0
pinned: bool = False
locked: bool = False
class Reply:
id: str
discussion_id: str
author_id: str
body: str
parent_id: str | None = None # Threaded replies
status: ContentStatus
created_at: datetime
upvotes: int = 0
Flat (chronological): Best for announcements and linear conversations.
Threaded (nested): Best for technical discussions where tangents are valuable.
Hybrid (flat with quoted replies): Best for general discussion.
async def get_discussion_with_replies(discussion_id: str, sort: str = "chronological"):
discussion = await db.get_discussion(discussion_id)
replies = await db.get_replies(discussion_id)
if sort == "chronological":
return sorted(replies, key=lambda r: r.created_at)
elif sort == "threaded":
return build_thread_tree(replies)
elif sort == "popular":
return sorted(replies, key=lambda r: r.upvotes, reverse=True)
CATEGORIES = {
"reading-group": {"description": "Book discussions and study groups", "color": "#4A90D9"},
"announcements": {"description": "Official updates", "color": "#E74C3C", "mod_only": True},
"help": {"description": "Questions and support", "color": "#2ECC71"},
"showcase": {"description": "Share your work", "color": "#F39C12"},
"meta": {"description": "About the community itself", "color": "#9B59B6"},
}
| Action | Points | Rationale | |--------|--------|-----------| | Post discussion | +2 | Encourages contribution | | Reply to discussion | +1 | Encourages engagement | | Receive upvote | +5 | Community validation | | Give upvote | +1 | Encourages voting | | Marked as answer | +15 | High-value contribution | | Post hidden by mod | -10 | Discourages violations |
PRIVILEGE_TIERS = {
0: ["read", "reply"],
10: ["create_discussion", "upvote"],
50: ["edit_own_posts", "flag_content"],
100: ["create_events", "add_tags"],
500: ["edit_wiki_posts"],
1000: ["nominate_moderator"],
}
def get_privileges(reputation: int) -> list[str]:
privileges = []
for threshold, perms in PRIVILEGE_TIERS.items():
if reputation >= threshold:
privileges.extend(perms)
return privileges
class ModerationAction(str, Enum):
APPROVE = "approve"
HIDE = "hide"
WARN = "warn"
BAN_TEMPORARY = "ban_temporary"
BAN_PERMANENT = "ban_permanent"
async def flag_content(content_id: str, reason: str, reporter_id: str):
flag = await db.create_flag(
content_id=content_id,
reason=reason,
reporter_id=reporter_id,
)
# Auto-hide if threshold reached
flag_count = await db.count_flags(content_id)
if flag_count >= 3:
await db.update_content_status(content_id, ContentStatus.HIDDEN)
await notify_moderators(content_id, flag_count)
GUIDELINES = {
"be_respectful": "Treat others as you'd want to be treated",
"stay_on_topic": "Keep discussions relevant to the community focus",
"no_spam": "No promotional content without context",
"cite_sources": "Back up claims with references when possible",
"no_personal_attacks": "Criticize ideas, not people",
}
async def moderate(content_id: str, action: ModerationAction, reason: str, mod_id: str):
await db.record_mod_action(content_id, action, reason, mod_id)
if action == ModerationAction.HIDE:
await db.update_content_status(content_id, ContentStatus.HIDDEN)
await notify_author(content_id, reason)
elif action == ModerationAction.WARN:
await send_warning(content_id, reason)
class Event:
id: str
title: str
description: str
organizer_id: str
event_type: str # "reading-group", "salon", "workshop", "office-hours"
starts_at: datetime
ends_at: datetime
location: str # URL for virtual, address for physical
capacity: int | None
rsvp_count: int = 0
recurring: str | None = None # "weekly", "biweekly", "monthly"
async def create_recurring_events(template: Event, count: int):
events = []
for i in range(count):
event = template.copy()
if template.recurring == "weekly":
event.starts_at += timedelta(weeks=i)
event.ends_at += timedelta(weeks=i)
events.append(await db.create_event(event))
return events
class NotificationType(str, Enum):
REPLY = "reply"
MENTION = "mention"
UPVOTE = "upvote"
EVENT_REMINDER = "event_reminder"
MOD_ACTION = "mod_action"
async def send_notification(user_id: str, notification_type: NotificationType, data: dict):
prefs = await db.get_notification_preferences(user_id)
if notification_type.value not in prefs.get("muted", []):
await db.create_notification(user_id, notification_type, data)
if prefs.get("email_enabled") and notification_type in prefs.get("email_types", []):
await send_email_notification(user_id, notification_type, data)
development
Dry-run audit + targeted cleanup for shell command history. Currently wraps atuin (stats today, prune, dedup with dated preview artifacts); extensible to zsh/bash/mcfly backends. Always previews before applying — apply commands are echoed for the human to run, never auto-executed. Triggers on "/shell-history-hygiene", "audit atuin", "audit shell history", "clean shell history", "atuin prune", "atuin dedup", "shell history hygiene", "history cleanup". Replaces ad-hoc one-liners (e.g. `... | tee cmd > file.txt` which wrote two files, swallowed dedup output, and left a junk `cmd` file).
tools
Guided Cowork setup — install role-matched plugins, connect your tools, try a skill.
development
Manage AI agent session lifecycles with structured phases (FRAME, SHAPE, BUILD, PROVE), context preservation across sessions, handoff protocols, and session metadata tracking. Triggers on session management, agent lifecycle, or multi-session workflow requests.
tools
Parse a session transcript into a structured Session Governance Index — an annotated bibliography of every file modified and commit made, internal-energy accounting (tool uses, estimated tokens), shipped-vs-tasked atom tally, and classification of missing items as Gaps or Vacuums. Triggers on "visibility-schema-substrate-sweep", "session cascade audit", "session governance audit", or any request to summarize what a session actually produced versus what it was asked to produce.