Introduction

Junjo

Game-domain primitives for groups, ranks, and permissions. A drop-in social-organization layer for any multiplayer game.

Junjo gives your game the building blocks it would otherwise spend a quarter writing from scratch: groups (guilds, parties, factions), ranks (with priority and color), permissions (with per-member overrides), invitations (direct or shareable code), real-time events (over SSE or webhooks), and native SDKs for five surfaces: TypeScript (typed, Node and the browser), React, Roblox, C++, and Unreal Engine.

What it is, in one sentence

Junjo is the same layer Stripe is for payments, Auth0 is for auth, or Pusher is for real-time: an HTTP API plus a thin native SDK. You bring your game; Junjo handles the social graph.

How it fits together

What it gives you

  • Groups with kinds you define ("guild", "party", "faction"), visibility levels, metadata, and soft-delete with a 7-day undo window.
  • Members with statuses (active, invited, left, kicked, banned), per-member metadata, public and private notes, optional passcode-gated public-join, and bulk-invite via CSV.
  • Roles with priorities, colors, and a permission catalog that auto-registers as you grant.
  • Permissions with role-derived defaults and explicit per-member overrides. junjo.can(userId, groupId, permission) answers in one call.
  • Invitations by direct user id or shareable code, with optional expiry and a public preview endpoint your invite-acceptance UI can call without an API key.
  • Group relationships (allied, hostile, asymmetric) and a parent-child hierarchy with cycle detection.
  • Bans at two scopes: per-group (mirror of kick that blocks rejoin) and game-wide (covers every group in the game), each with optional expiry, append-only history, and webhook events.
  • Friends graph: requests, blocks, friend tags, per-user list visibility, mutual-friend suggestions, and a single-pair relationship probe for profile views.
  • Real-time events through Server-Sent Events (junjo.groups.subscribe) and outbound webhooks (with HMAC signing, exponential-backoff retries, and per-endpoint Discord and Slack output formats).
  • Auth adapters for Clerk, Supabase, raw JWT, and bring-your-own.
  • React hooks in @junjo.io/react: useGroup, useMembers, useInvitations, useAuditLog, useCan, useMutation, plus per-list optimistic-update helpers.

What it is not

Junjo intentionally does not handle:

  • In-app chat (use Discord, Twilio, or your own).
  • Authentication itself (only adapters that verify tokens issued by your auth provider).
  • Game-state sync, matchmaking, leaderboards, achievements, or game-specific systems.
  • DMs or message transport. Junjo gives you the Friends graph (requests, blocks, visibility) but not the message bus; build that on your own backend keyed off the friend rows.

Get going

  • Getting started - install the SDK and make your first call in under a minute.
  • Tutorial - a five-minute walkthrough that creates a group, invites a user, redeems the invitation, assigns a role, and checks a permission.
  • Self-hosting - run the open-source server yourself: Docker recipes, env vars, migrations, API-key issuance, and reverse-proxy notes.

Reference

  • SDK - per-namespace reference for @junjo.io/sdk (junjo.groups, junjo.members, junjo.roles, junjo.invitations, junjo.audit, junjo.webhooks, junjo.friends, junjo.bans, plus the top-level can / check).
  • React - hooks and provider in @junjo.io/react.
  • Roblox - the Luau SDK for Roblox game servers.
  • C++ - the C++20 SDK for game servers and backends.
  • Unreal Engine - the source plugin over the C++ core: subsystem, Blueprint async nodes, live event streams.
  • Feature matrix - what each of the five SDKs covers, operation by operation.
  • API - the HTTP API the SDKs wrap. Use raw HTTP from any language outside the TypeScript, React, Roblox, C++, and Unreal Engine set.
  • Auth - adapter setup for Clerk, Supabase, and JWT.