Social infrastructure for multiplayer games

Guilds, clans, parties, ranks, permissions, friends, bans, invitations, and live events. Native SDKs for TypeScript, React, Roblox, C++, and Unreal Engine.

guilds.ts
import { Junjo } from "@junjo.io/sdk";

const guild = await junjo.groups.create({
  kind: "guild",
  name: "Crimson Dawn",
});

await junjo.groups
  .inviteByUserId(guild.id, "user_123");

const allowed = await junjo.can(
  "user_123", guild.id, "invite_member"
);

// state after running guilds.ts

Crimson Dawn

guild - 4/25
  • ariaLeader
  • brambleOfficer
  • kestrelMember
  • user_123joined via inviteMember

can("user_123", "invite_member") -> true

The client surface

Same shape in the HTTP API, the SDK, and the React hooks.

junjo.groups

Guilds, clans, parties, and sub-groups with capacity and visibility rules.

junjo.roles

Multi-tier ranks with per-group permission overrides.

junjo.members

Rosters, joins, kicks, and promotions.

junjo.invitations

Direct and bulk invites with expiry and revocation.

junjo.friends

Requests, tags, suggestions, and blocklists.

junjo.bans

Group-level and game-level bans with full history.

junjo.webhooks

Signed delivery with automatic endpoint disabling.

junjo.audit

Every mutation recorded and queryable.

Plus server-sent events for live roster updates.

Works with your existing auth

Junjo never touches your login flow. It takes a user id from the auth you already run and manages the group data under it. Clerk, Supabase, and plain JWT adapters are built in.

import { clerkAdapter } from "@junjo.io/sdk/adapters";

const junjo = new Junjo({
  apiKey: process.env.JUNJO_API_KEY,
  authAdapter: clerkAdapter(clerk),
});

Self-host it

Source-available (ELv2), free to run for your own game. One Docker image, one Postgres, same API as hosted.

Self-hosting guide

Or use the hosted beta

Dashboard and Postgres included. Free while in beta. Email me and I'll set you up.

Request access