Skip to content

Changelog

[2026.02.28-9c4e2d1] - Scoped versioning for services and extensions

Added

  • Add scoped version release APIs:
    • GET /v1/versions/releases
    • POST /v1/versions/releases
    • GET /v1/versions/releases/{releaseId}
    • PATCH /v1/versions/releases/{releaseId}
    • DELETE /v1/versions/releases/{releaseId}
  • Add active-channel management for scoped releases:
    • GET /v1/versions/channels/active
    • POST /v1/versions/channels/active
  • Add public version resolve endpoint for clients:
    • GET /v1/public/versions/resolve
  • Add version event ingestion and listing:
    • POST /v1/public/versions/events
    • GET /v1/versions/events
  • Add persisted version collections with indexes:
    • version_releases
    • version_channels
    • version_events
  • Add permission seed nodes for version operations:
    • versions:read
    • versions:write
    • versions:publish
    • versions:track

Changed

  • Enforce scope-aware version workflows via scope.type + scope.id with validation for service and extension scopes.
  • Make channel activation explicitly assign the active release pointer per scope+channel, enabling roll-forward/rollback by pointer update.

[2026.02.20-4ac6f3d] - Add profile UI style settings payload

Added

  • Extend profile settings request payload with uiStyle support (syncEnabled, source, payload) for cross-app style sync.

Changed

  • Extend GET /v1/profile/settings response with uiStyle metadata and payload.
  • Extend PATCH /v1/profile/settings to persist uiStyle updates with updatedAt tracking and default source handling.

Fixed

  • Validate uiStyle payload shape and size before storing to prevent invalid or oversized style documents.

[2026.02.20-7d61ce0] - News polls and chat legacy compatibility

Added

  • Add poll support to news entries with question, options, vote state, and duration (durationMs) including computed expiry (expiresAt) and total vote counts.
  • Add POST /v1/news/{newsId}/poll/vote so authenticated users can vote on published, released news polls.

Changed

  • Extend GET /v1/news, GET /v1/news/feed, and GET /v1/public/news responses with a poll payload including per-option vote counts and viewer selection state.
  • Extend POST /v1/news and PATCH /v1/news/{newsId} to accept an optional poll definition with validated options and bounded duration.

Fixed

  • Load social chat conversations for users across legacy participant id encodings (UUID binary, generic binary, and string UUID values).
  • Prevent malformed legacy conversation rows from failing the full conversation list by skipping invalid entries instead of aborting the request.
  • Add compatibility parsing for find_conversation so message/thread endpoints can resolve older conversation documents.

[2026.02.20-605c1541] - Add social chat polls and voting

Added

  • Add poll fields to social chat message payloads for live and archived messages (poll.question, poll.options, selection state, total votes, expiry, closed state).
  • Add POST /v1/social/chat/conversations/{conversationId}/messages/{messageId}/poll/vote to submit poll votes for chat participants.

Changed

  • Allow POST /v1/social/chat/conversations/{conversationId}/messages to create poll-only messages (without text content).
  • Validate poll input on message creation (required question, unique option labels, option count limits, optional future expiry).
  • Set conversation preview text for poll and attachment-only messages so conversation list updates stay informative.

[2026.02.19-af23f8b] - Friend accept write conflict fix

Fixed

  • Fix POST /v1/social/friends/requests/{id}/accept failing with Freundschaft konnte nicht erstellt werden. in mobile and launcher.
  • Remove conflicting userId/friendId updates from the friend-link upsert ($set + $setOnInsert on same fields), which caused MongoDB write error code 40.

[2026.02.19-8275ba4] - Friends listing legacy UUID compatibility

Fixed

  • Load friendships, outgoing requests, and friend-related user summaries with UUID-compatible queries (Uuid + legacy binary formats) so existing relations are visible again.
  • Make friend metadata updates/removal and relationship cleanup work with legacy UUID-encoded rows.
  • Normalize both friendship directions to canonical userId/friendId fields during upsert to self-heal stale rows over time.

[2026.02.19-8f420f1] - Friendship self-healing on request/accept

Fixed

  • Heal asymmetric friendship rows automatically during friend request creation and request acceptance.
  • If one friendship direction already exists, the API now upserts the missing reverse direction so both users see the same friendship.
  • Prevent Ihr seid bereits befreundet. without a visible friend entry by reconciling stale data before returning the validation error.

[2026.02.18-6dcb5a3] - Friend acceptance duplicate safety

Fixed

  • Prevent Freundschaft konnte nicht erstellt werden. on friend request acceptance when historic/region-shifted friend link rows already exist.
  • Make friend-link creation idempotent by upserting both friendship directions instead of inserting hard-fail duplicates.
  • Use a global friendship existence check before creation to avoid region-filter false negatives.

[2026.02.18-c0d1388] - Friends region fallback for reads

Fixed

  • Prevent empty Friends and incoming-request lists caused by stale homeRegion filtering.
  • Add a fallback path for social reads: if region-scoped friend links or incoming requests are empty, the API now retries with an unscoped user query.

[2026.02.18-e38bc69] - Presence fields in self profile

Changed

  • Extend GET /v1/profile/self to return online, status, and lastSeenAt from the profile document so clients can render self presence without extra public-user lookups.

Changed

  • Extend GET/PUT/DELETE /v1/admin/discord/role-links with optional guildId selection so role mapping can target a linked Discord server without requiring DISCORD_ROLE_SYNC_GUILD_ID.
  • Return linked Discord guild candidates in role-link responses and auto-fallback to the first manageable linked guild when no guild is preconfigured.
  • Keep role-link status read-only with clear reasons instead of hard failing when guild selection or bot token configuration is missing.

[2026.02.18-a653582] - Network Discord server linking

Added

  • Add Connect network Discord endpoints:
    • GET /v1/connect/networks/{networkId}/discord
    • PUT /v1/connect/networks/{networkId}/discord
    • DELETE /v1/connect/networks/{networkId}/discord
  • Persist Discord guild link metadata directly on connect networks (discord.guildId, name/icon fields, linked/update timestamps).

Changed

  • Extend Discord OAuth linking payloads with a guild snapshot list (settings.discord.guilds) including administrator capability flags.
  • Enforce network Discord linking rules in the API:
    • linked Discord account is required,
    • user must have Administrator on the selected guild,
    • configured bot must already be present in the selected guild.

Added

  • Add admin endpoints to manage Discord role links for permission roles:
    • GET /v1/admin/discord/role-links
    • PUT /v1/admin/discord/role-links/{roleId}
    • DELETE /v1/admin/discord/role-links/{roleId}
  • Add persistence for Discord role links (discord_role_links collection) with dedicated Mongo indexes.
  • Add permission seed nodes for Discord role link administration: admin:discord-role-link:view and admin:discord-role-link:manage.

Changed

  • Add Discord server rights enforcement for role linking: API now requires Discord Manage Roles (or Administrator) for the current linked account plus bot-side role-management capability.
  • Extend API runtime config with Discord role-sync settings:
    • DISCORD_ROLE_SYNC_GUILD_ID (fallback to supporter guild)
    • DISCORD_ROLE_SYNC_BOT_TOKEN (fallback to catalog bot token)
  • Add permission catalog descriptions for the new Discord role link admin nodes.

[2026.02.18-1a47aa0] - Discord account linking for profile settings

Added

  • Add Discord OAuth profile linking endpoints: POST /v1/profile/settings/discord/link, DELETE /v1/profile/settings/discord/link, and callback GET /v1/auth/discord/callback.
  • Extend profile settings payloads with a discord section that includes linked account metadata and optional guild sync state (inGuild, boosting, role-based rank labels).
  • Add Discord OAuth runtime configuration keys: DISCORD_OAUTH_CLIENT_ID, DISCORD_OAUTH_CLIENT_SECRET, DISCORD_OAUTH_REDIRECT_URI, DISCORD_OAUTH_SCOPES, DISCORD_OAUTH_DASH_REDIRECT, DISCORD_SUPPORTER_GUILD_ID, and DISCORD_SUPPORTER_ROLE_MAP.

Changed

  • GET /v1/profile/settings now returns both patreon and discord provider sections in one response model.
  • Add public-api stack env support for Discord OAuth settings so the flow can be configured in production without code changes.

[2026.02.18-a653582] - Supporter listing preferences

Added

  • Extend profile settings payloads with a supporter section to store supporter listing flags (listed, showTier) and optional supporter card customizations (customMessage, designPreset, designAccent).
  • Add a public supporters endpoint GET /v1/public/supporters that returns all opted-in active supporters for launcher/dashboard use.

Changed

  • GET /v1/profile/settings now returns supporter capability metadata (canUseCustomMessage, canUseCustomDesign) and minimum supporter amounts for gated customization features.
  • PATCH /v1/profile/settings now validates supporter customization by supporter tier amount and rejects custom message/design updates below required thresholds.

[2026.02.17-f7eee82] - Friend acceptance sender notification

Added

  • Create a notification for the original sender when a friend request is accepted.

Changed

  • POST /v1/social/friends/requests/{id}/accept now upserts a friend_accepted notification entry for the request sender with a direct Friends deeplink.

[2026.02.17-a653582] - Social profile moderation APIs

Added

  • Add GET/POST/DELETE /v1/social/friends/blocks endpoints to list, create, and remove user blocks.
  • Add POST /v1/social/friends/reports to report user profiles with optional reason text.

Changed

  • Prevent friend requests/acceptance between blocked users.
  • Blocking a user now removes existing friendship links and pending requests in both directions.

[2026.02.17-a653582] - Public user profile lookup

Added

  • Add a public user lookup endpoint GET /v1/public/users/{identifier} that resolves by username or UUID.
  • Return normalized profile metadata (userId, name, regions, created/seen timestamps, and allowFriendRequests) for dashboard/public profile views.

[2026.02.17-a653582] - Profile settings auth baseline

Fixed

  • Allow authenticated users to access profile settings endpoints without explicit profile:read permission checks (GET/PUT /v1/profile/settings, POST/DELETE /v1/profile/settings/patreon/link, GET/PUT /v1/profile/minecraft-options).
  • Prevent false Patreon "not configured" behavior for users blocked by permission gating.

[2026.02.17-a653582] - Patreon profile linking

Changed

  • Extend GET /v1/profile/settings with a patreon object that reports availability, link status, and linked Patreon profile/membership data.

Added

  • Add profile Patreon OAuth routes for linking and unlinking: POST /v1/profile/settings/patreon/link, DELETE /v1/profile/settings/patreon/link, and callback GET /v1/auth/patreon/callback.
  • Add Patreon OAuth runtime configuration via env vars: PATREON_CLIENT_ID, PATREON_CLIENT_SECRET, PATREON_REDIRECT_URI, PATREON_SCOPES, and PATREON_DASH_REDIRECT.

[2026.02.17-a653582] - Personalized news feed follows

Added

  • Add authenticated news feed routes for profile-based follow preferences: GET /v1/news/feed, GET /v1/news/follows, and PUT /v1/news/follows.
  • Persist followed project feeds per user in settings.newsFollowProjects and auto-create missing user docs before writes.

Changed

  • GET /v1/news/feed now combines global news with published service news for the user's followed project list.
  • Apply release-date filtering (releaseDate <= now) directly in the feed query and return follow metadata (projects, configured) with the feed response.
  • Add feed cache metadata (lastChangedAtMs) and lightweight delta checks via sinceMs query param. Unchanged feed responses now return notModified=true with an empty items array.

[2026.02.17-a653582] - Service deletion endpoint

Added

  • Add DELETE /v1/services/{serviceId} so service owners (or super admins) can remove services.

Changed

  • Remove related service consent grants when a service is deleted.
  • Remove deleted service references from catalog service scopes (catalogScopes[type=service]).

[2026.02.17-a653582] - Catalog scopes and scoped random routing

Added

  • Add catalogScopes on catalog payloads (GET/POST/PUT /v1/catalogs) with scope support for global, service, extension, network, and server.
  • Validate catalog scopes against existing entities (service/extension/network/server) when catalogs are created or updated.
  • Add a catalog scope index (catalog_scope_enabled_idx) to speed up enabled scoped catalog lookups.

Changed

  • Extend random catalog endpoints with optional scope filters: scope and scopeId (/v1/public/catalogs/{catalogSlug}/random, /v1/head/random, /v1/banner/random).
  • Resolve random catalog responses scope-aware with fallback order: exact scope match, then global catalog, then newest enabled fallback.

[2026.02.16-a653582] - API usage metrics per service

Added

  • Expose Prometheus metrics at GET /metrics in the public API runtime.
  • Add per-service API usage metrics: request rate (public_api_service_requests_total) and latency histogram (public_api_service_request_duration_seconds).

Changed

  • Track API usage labels from service auth context (serviceSlug/serviceId) so Grafana can break down traffic by service.
  • Extend observability with a dedicated Prometheus scrape job for all public API regions (eu, us, ap).
  • Add Grafana panels for API usage by service, p95 latency by service, 5xx error rate by service, and request rate by status.

[2026.02.16-a653582] - Dynamic service domains and catalogs

Changed

  • Make CORS origin validation dynamic: browser origins are now matched against verified service allowedDomains entries instead of static one-off code paths.
  • Keep /v1/head/random and /v1/banner/random, but resolve them through enabled catalog aliases (head/banner) at runtime.
  • Replace Discord command sync endpoint with /v1/discord/catalog/commands and resolve head data from the configured catalog source.
  • Extend service payloads (GET/POST/PUT /v1/services) with allowedDomains.

Added

  • Add catalog management endpoints: GET/POST /v1/catalogs, GET/PUT/DELETE /v1/catalogs/{catalogId}.
  • Add public random endpoint for custom catalogs: GET /v1/public/catalogs/{catalogSlug}/random.
  • Add Mongo indexes for catalogs and service allowedDomains.

Removed

  • Remove hardcoded brand-specific API paths/config bindings from the runtime implementation.

[2026.02.16-a653582] - Gateway DNS automation

Added

  • Add automatic Cloudflare DNS sync for gateway endpoints under CONNECT_GATEWAY_DNS_BASE_DOMAIN (for example gateway.uebliche.net and <gatewayId>.gateway.uebliche.net) on gateway heartbeat/admin updates.
  • Add optional gateway DNS env config (CONNECT_GATEWAY_DNS_BASE_DOMAIN, CONNECT_GATEWAY_CLOUDFLARE_ZONE_ID, CONNECT_GATEWAY_CLOUDFLARE_API_TOKEN).

Changed

  • POST /v1/connect/networks/{networkId}/domains now returns gateway CNAME instructions (<domain> -> gateway.uebliche.net) and auto-manages the record when Cloudflare DNS automation is configured for the same zone.
  • PUT /v1/connect/networks/{networkId}/dns/cloudflare now attempts to sync gateway CNAME records for already claimed domains in that network.

[2026.02.16-a653582] - Connect gateway control APIs

Changed

  • Seed new Connect gateway admin permission nodes (admin:connect:gateway:view, admin:connect:gateway:manage).

Added

  • Add gateway control-plane endpoints for register + heartbeat (POST /v1/connect/gateways/register, POST /v1/connect/gateways/{gatewayId}/heartbeat).
  • Add Connect-server gateway endpoints to list targets and publish/remove active route ownership (GET /v1/connect/servers/{serverId}/gateways, PUT/DELETE /v1/connect/servers/{serverId}/gateway-route).
  • Add admin Connect gateway endpoints for Dash inventory and control (GET /v1/admin/connect/gateways, GET /v1/admin/connect/gateway-routes, PATCH /v1/admin/connect/gateways/{gatewayId}).
  • Add persisted gateway metadata and route collections with indexes/TTL cleanup for stale route entries.
  • Add Connect network Cloudflare DNS config endpoints (GET/PUT/DELETE /v1/connect/networks/{networkId}/dns/cloudflare) for token+zone managed automation.

Changed

  • GET /v1/connect/servers/{serverId}/gateways now includes a preferred routeHost hint (verified network domain when available, fallback to <serverId>.connect.gateway).
  • PUT /v1/connect/servers/{serverId}/gateway-route now defaults routeHost to the network's verified domain (if present) before falling back to <serverId>.connect.gateway.
  • POST /v1/connect/networks/{networkId}/domains now auto-upserts _uebliche.<domain> TXT records via Cloudflare when configured.
  • PUT /v1/connect/servers/{serverId}/gateway-route now auto-upserts Cloudflare A records for route hosts within the configured zone.
  • Cloudflare API tokens configured via Connect DNS automation are now encrypted at rest, with legacy plaintext values migrated on read.

[2026.02.14-0aff02c] - Skin builder part deletion

Added

  • Add DELETE /v1/admin/skin-builder/parts/{id} to remove skin builder community parts (permission admin:skin-builder-parts:delete).
  • Add the admin:skin-builder-parts:delete permission node to the permission catalog/seed.

[2026.02.13-1b988dd] - Role permission grants

Added

  • Expose permissionGrants on role payloads so permissions can carry numeric/amount values (e.g. power or quotas).

Fixed

  • Mark .power permission nodes as numeric schemas for admin editors.

[2026.02.09-1adac7e] - Validation hardening

Fixed

  • Validate role slugs/names and enforce scopeId existence for network/server/service/extension scoped roles.
  • Validate shop catalog scopes against existing Connect/Service/Extension entities.
  • Validate shop permission grants against the permission catalog (known nodes + correct value schema) and reject invalid durations/intervals.

[2026.02.09-7a174d8] - Connect scope ID normalization

Fixed

  • Normalize admin Connect network/server scope IDs (trim + UUID-only) before de-duping to avoid duplicated UUID entries.

[2026.02.09-45a63e1] - Connect server scope filtering

Fixed

  • Exclude Connect agents and templates from the admin Connect server list used by dash scope pickers to avoid duplicate-looking entries.

[2026.02.09-f92d0fa] - Connect scope dedupe

Fixed

  • Dedupe admin Connect network/server lists by networkId/serverId for dash pickers.

[2026.02.09-781a334] - Admin connect scope lists

Added

  • Add admin endpoints to list Connect networks and servers for scoped role/content editors.

[2026.02.09-e5e7548] - Permission list access

Fixed

  • Allow role admins to list permission nodes for role editors.

[2026.02.09-ccef819] - Shop currency fixed

Changed

  • Restrict shop item variant currency to EUR (validated on write and enforced during Polar sync).

[2026.02.09-a56b25b] - Shop variant keys

Changed

  • Generate shop variant keys server-side when missing and preserve Polar mappings by key.

[2026.02.09-cb8be7b] - Permission schemas

Added

  • Expose permission value schemas (flag vs numeric vs unit-based) for dash/admin editors.

[2026.02.09-933eff8] - Shop catalog scopes

Added

  • Allow shop catalog items to be scoped (global/server/network/service/extension) and filterable via query params.

[2026.02.09-6dfc4f8] - Polar shop

Added

  • Add a Polar-backed shop with catalog, checkout, purchases, and webhook endpoints.
  • Add admin endpoints to manage shop items and sync variants to Polar (sandbox/production).
  • Allow shop purchases to grant quota/limit permissions (numeric or {value,unit}) during permission evaluation.

Changed

  • Public API deployment now expects Polar secrets (access token + webhook secret) to be provided via Docker secrets.

[2026.02.08-92236b6] - Permission quotas

Added

  • Add count-based quota permissions for friends and profile share creation.

[2026.02.08-f40c97d] - Permission values

Added

  • Allow permissions to carry quantitative values (numbers or {value,unit}) for quotas and limits.

[2026.02.07-2eaa880] - Service redirect schemes

Changed

  • Allow non-HTTP service redirect schemes when they are explicitly whitelisted.
  • Allow custom scheme redirect URLs during service creation/update.

[2026.02.06-411e2d1] - Connect public server ownership

Fixed

  • Store ownershipVerifiedBy as a BSON UUID binary when publishing Connect networks as public servers.

[2026.02.06-0110858] - Public server UUID compatibility

Fixed

  • Tolerate legacy/extended-JSON UUID shapes in public_servers documents to avoid 500s when loading or updating Connect public servers.

[2026.02.06-ebbf696] - Connect public servers

Added

  • Add endpoints to publish Connect networks as public server listings for the launcher.

[2026.02.05-2443b77] - News date flexibility

Changed

  • Accept date-only releaseDate values for news items (time optional).

[2026.02.05-70f3484] - News feed

Added

  • Add scoped news endpoints with draft-aware access controls.
  • Add a public news feed for launcher consumption.

[2026.02.05-4672e15] - Feedback mine filter

Added

  • Add a mine filter to list feedback submitted by the authenticated user.

[2026.02.05-fc43404] - MOTDs

Added

  • Add scoped MOTD endpoints with scheduling and recurrence support.
  • Add a public MOTD listing endpoint for launcher consumption.

[2026.01.27-13e39e6] - Feedback scopes

Added

  • Add scoped feedback endpoints with role-based permissions.
  • Allow roles scoped to services and extensions.

Fixed

  • Accept legacy service grant user IDs when loading service consent.
  • Allow Sentry baggage and sentry-trace headers in CORS for dash requests.
  • Allow build.moe health checks to send X-Uebliche-User-Agent in CORS preflight.

[2026.01.27-a678514] - Health DB status

Added

  • Include MongoDB ping status and latency in /health responses.

[2026.01.27-40665b8] - Service token verify

Fixed

  • Accept service JWTs in /v1/auth/verify for build.moe sign-in flows.

[2026.01.27-afe1246] - Build.moe random endpoints

Added

  • Add /v1/head/random and /v1/banner/random for build.moe random picks.
  • Add BUILD_MOE_BANNERS_COLLECTION to configure the banner collection name.

[2026.01.26-6c4c161] - Discord docs build fix

Fixed

  • Escape Discord command placeholders in the docs to avoid VitePress parsing errors.

[2026.01.26-b353eb3] - Auth token verify

Added

  • Add /auth/verify and /v1/auth/verify to validate API JWTs and return minimal claims for build.moe.

[2026.01.26-19110a4] - Service exchange errors

Changed

  • Allow super admins to list all services instead of only owned ones.

Fixed

  • Show a friendly HTML error page for failed /v1/auth/service/exchange requests.
  • Fix service consent upserts to avoid duplicate key errors.
  • Fix service token issuance when consent documents store legacy user IDs.

[2026.01.26-872cb3b] - Service auth exchange

Added

  • Add /v1/auth/service/exchange to start service consent flows from a redirect URL.
  • Add /v1/auth/service/token to issue service-scoped JWTs after consent.

Fixed

  • Include legacy string ownerId values when listing services.

[2026.01.25-872cb3b] - Public API deploy cleanup

Removed

  • Remove the "Deploy public API (current context)" action from the Public API project.

[2026.01.25-872cb3b] - Build.moe command startup

Added

  • Auto-update Build.moe Discord commands on Public API startup for the EU region and report failures to Sentry.

[2026.01.25-872cb3b] - Build.moe command auth

Fixed

  • Require a Public API admin JWT when running the Build.moe Discord command update action.

[2026.01.25-872cb3b] - Public API command action fixes

Fixed

  • Add the missing ureq dependency for Build.moe command registration and allow a dedicated Public API base URL in the action.

[2026.01.25-872cb3b] - Build.moe command update action

Added

  • Add a Uebliche.dev action for the Public API project to update Build.moe Discord commands.

[2026.01.25-0000000] - Discord heads lookup

Changed

  • Resolve Discord /head lookups against the local MongoDB heads collection instead of build.moe HTTP requests.
  • Split /head into search-only and /randomhead for random results.

Added

  • Add /v1/discord/build-moe/commands to register build.moe bot slash commands globally.

Added

  • Allow overriding the Mongo database and collection used for head lookups.

[2026.01.25-00f7712] - Discord interactions

Added

  • Add /v1/discord/interaction to process Discord slash-command payloads (including /head and /docs).

[2026.01.25-e0e2ee8] - Connect extensions

Added

  • Add Connect extension catalog endpoints plus per-server extension registrations and actions.
  • Add source scoping for Connect settings and settings history endpoints.
  • Add server template and temporary instance metadata for Connect servers.

[2026.01.25-819be00] - Connect settings schema

Added

  • Store optional settings schemas for Connect servers and return them with settings payloads.

[2026.01.24-89bacaf] - Launcher options sync

Added

  • Add /v1/profile/minecraft-options to sync launcher Minecraft options via the public API.

[2026.01.24-89bacaf] - Profile share admin listing

Added

  • Add /v1/admin/profile-shares to list launcher profile shares with author info.

[2026.01.24-a3a67a6] - Games templates and catalog

Added

  • Add template management endpoints (/v1/games/templates, /v1/games/templates/{id}).
  • Add collaborator updates for templates (/v1/games/templates/{id}/collaborators).
  • Add public games catalog endpoint (/v1/games/catalog).
  • Add minigame network binding and publish endpoints (/v1/games/minigames/{id}, /v1/games/minigames/{id}/publish).
  • Add leaderboard creation + delete endpoints (/v1/games/leaderboards, /v1/games/leaderboards/{id}).

[2026.01.24-5e01e97] - Games live stream

Added

  • Add /v1/games/live websocket stream for games dashboard snapshots.

[2026.01.22-36711c3] - Default roles

Changed

  • Apply default roles automatically during permission checks (without assigning user roles).

[2026.01.22-07cd76c] - Connect host join

Added

  • Add connect network join tokens plus the /v1/connect/networks/join endpoint. (api 07cd76c)
  • Add /v1/connect/hosts for listing agent hosts. (api 07cd76c)

[2026.01.22-01f0640] - Dash user administration

Added

  • Add admin user lookup and detail endpoints (/v1/admin/users/lookup, /v1/admin/users/{userId}).
  • Add a dashboard user management view with scope filtering, role assignment, and explicit permission edits.

[2026.01.22-0000000] - Sanitize internal errors

Fixed

  • Stop returning raw database error messages in API responses; errors are logged server-side.
  • Allow user role lookups to decode legacy UUID shapes when loading admin role assignments.
  • Prefer Cloudflare client IP headers so public API logs and requests use real user IPs.

Added

  • Add /v1/ip to return the caller IP as plain text.
  • Include uptimeSeconds in /health responses.

[2026.01.21-0000000] - User last-seen tracking

Fixed

  • Update lastSeenAt for authenticated users on every API request, including region tracking.

[2026.01.19-6725742] - 2026-01-19 - Auth user bootstrap

Changed

  • Create missing user records during Minecraft join verification and Microsoft sign-in.

Fixed

  • Repair public API builds by correcting startup module wiring and tracing layer typing.

[2026.01.19] - 2026-01-19

Added

  • Add /v1/profile/settings endpoints so users can read and update profile settings (including friend request privacy).

Changed

  • Block friend request creation when the recipient has disabled allowFriendRequests.

[2026.01.18] - 2026-01-18

Changed

  • Switch Minecraft session auth to a join/hasJoined handshake with short-lived join tokens so clients keep Minecraft access tokens local.

Added

  • Add /v1/auth/session/minecraft/join and /v1/auth/session/minecraft/verify for Mojang join-based auth.
  • Add /v1/profile/auth/sessions so users can inspect recent auth sessions.

Removed

  • Remove /v1/auth/session/minecraft/access from the public API.

Fixed

  • Populate personal totem upload authors from the authenticated user when missing.

[2026.01.17] - 2026-01-17

Added

  • Add /v1/connect/servers/{serverId}/claim-key so Connect servers can request fresh claim keys.

[2026.01.16] - 2026-01-16

Changed

  • Rename the docs path from /public-api/ to /api/ and update section links.
  • Point the live tryout at https://uebliche.info/api and store tokens in local storage.

[2026.01.15] - 2026-01-15

Added

  • Add /v1/auth/session/exchange to mint API tokens from the uebliche_token cookie (SSO for build.moe/dash).
  • Add build.moe redirect support for Microsoft sign-in via MICROSOFT_BUILD_MOE_REDIRECT.
  • Seed the permissions catalog on startup so service consent can reference known nodes.
  • Add role CRUD and user role assignment endpoints under /v1/admin/roles.
  • Add connect network endpoints (/v1/connect/networks) so users can create and list Connect networks.
  • Add Connect server claim and assignment endpoints (/v1/connect/servers, /v1/connect/servers/claim, /v1/connect/servers/{serverId}).
  • Add network domain claim/verification endpoints (/v1/connect/networks/{networkId}/domains).

Changed

  • Replace Connect network shared keys with single-use server claim keys returned by server registration.
  • Remove Connect network claiming; servers are claimed first and assigned to networks in Dash.

[2026.01.13] - 2026-01-13

Added

  • Mirror the personal totem endpoints under /v1/api/profile/... so legacy clients (like TotemMod) can still select and fetch models.
  • Capture 5xx errors and panics in Sentry when SENTRY_DSN is set, tagging each report with the active build and region metadata.

Changed

  • Omit empty gallery item fields (for example rating, author, timestamps, and zero counts) to shrink /v1/profile/personal-totem/gallery payloads.
  • Include itemModelUrl on gallery items so clients can preview each model without extra roundtrips.
  • Remove cdn.baseUrl from gallery responses to avoid leaking public entrypoints.
  • Trim the model endpoint response to the minimal fields needed for model fetches (no duplicate URLs or filenames).
  • Return public CDN URLs from the model endpoint (no presigned links).
  • Extend issued auth JWTs to a 30-day lifetime.
  • Ensure personal totem selection can upsert a minimal user record when none exists to avoid 500s.
  • Avoid deserialization errors when selecting gallery models with legacy author id formats.

Fixed

  • Let /v1/profile/personal-totem/model/{itemModelId} return gallery models when PERSONAL_TOTEM_PUBLIC_API is enabled so each totem entry renders its own preview in the mod gallery.
  • Normalize itemModelPublicUrl so it no longer exposes the totem-models/ storage prefix and instead uses clean https://totem.uebliche.net/{modelId}.json URLs.
  • New uploads store itemModel objects without the totem-models/ prefix, so Mongo and the public URL share a simple {modelId}.json path.
  • Ensure personal totem uploads set public-read ACLs when the public API or public endpoint is enabled, so CDN fetches do not 403.

[2026.01.12] - 2026-01-12

Fixed

  • Serialize connect command/settings payload data to BSON for MongoDB updates.
  • Send connect settings WebSocket payloads using UTF-8 text frames.
  • Include Connect-managed servers in /v1/profile/servers responses (including tag=uebliche).

[2026.01.11] - 2026-01-11

Changed

  • Drop user UUIDs from personal totem S3 storage keys (now totem-models/<modelId>.<ext>).
  • Allow duplicate personal totem uploads while reusing existing storage objects.
  • Skip request logging for /health probes.
  • Default Microsoft OAuth scopes to XboxLive.signin offline_access.
  • Make ANSI log coloring configurable via LOG_ANSI / LOG_NO_COLOR / NO_COLOR (off by default unless LOG_ANSI is set).
  • Allow Microsoft dashboard logins to request a custom redirect URL (limited to localhost/uebliche.net).
  • Allow connect settings WebSocket clients to pass the dash JWT via ?token=.

Added

  • Add optional per-model ratings (rating.content, rating.age) and author metadata (author.id, author.name, author.description) to personal totem uploads and responses.
  • Add a personal totem gallery endpoint with limit/sort ordering and selection counts.
  • Add Microsoft OAuth login endpoints for dashboard sessions.
  • Add /v1/profile/self and /v1/profile/servers for dashboard profile metadata and owned server lists.
  • Add admin permission endpoints to list and edit user permission grants.
  • Add /v1/connect/servers/register for automatic server registration and network grouping.

Removed

  • Remove legacy user_id fallbacks for personal totem history and uploads.

[2026.01.10] - 2026-01-10

Added

  • Add request/response logging for every public API call via an HTTP trace layer.
  • Add a local deploy helper script for the public API.

Changed

  • Require Minecraft access tokens for /v1/auth/session/minecraft/access (remove dev auth fallback).
  • Document public API deploys against the unauthenticated registry.

Fixed

  • Create missing user records on first personal totem upload when using Minecraft tokens.
  • Match compact (no-hyphen) userId formats when loading personal totem history.
  • Reuse existing personal totem storage objects to avoid 1:1 duplicate uploads.
  • Block duplicate personal totem uploads per user with a dedupe key.

[2026.01.09] - 2026-01-09

Added

  • Added /health to expose region and build metadata.
  • Added an auth page for /v1/auth/session/minecraft/access.

Removed

  • Removed the regions and MongoDB pages from the API docs.

[2026.01.08] - 2026-01-08

Changed

  • Track homeRegion for users and tag friends/favorites for shard-friendly routing.

Added

  • Documented region deployment and home region tracking.
  • Added MongoDB sharding deployment notes.

[2026.01.07] - 2026-01-07

Added

  • Documented the friends API endpoints.