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.
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 guideOr use the hosted beta
Dashboard and Postgres included. Free while in beta. Email me and I'll set you up.
Request access