Changelog
[2026.02.28-9c4e2d1] - Scoped versioning for services and extensions
Added
- Add scoped version release APIs:
GET /v1/versions/releasesPOST /v1/versions/releasesGET /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/activePOST /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/eventsGET /v1/versions/events
- Add persisted version collections with indexes:
version_releasesversion_channelsversion_events
- Add permission seed nodes for version operations:
versions:readversions:writeversions:publishversions:track
Changed
- Enforce scope-aware version workflows via
scope.type+scope.idwith validation forserviceandextensionscopes. - 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
uiStylesupport (syncEnabled,source,payload) for cross-app style sync.
Changed
- Extend
GET /v1/profile/settingsresponse withuiStylemetadata and payload. - Extend
PATCH /v1/profile/settingsto persistuiStyleupdates withupdatedAttracking and default source handling.
Fixed
- Validate
uiStylepayload 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/voteso authenticated users can vote on published, released news polls.
Changed
- Extend
GET /v1/news,GET /v1/news/feed, andGET /v1/public/newsresponses with apollpayload including per-option vote counts and viewer selection state. - Extend
POST /v1/newsandPATCH /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_conversationso 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/voteto submit poll votes for chat participants.
Changed
- Allow
POST /v1/social/chat/conversations/{conversationId}/messagesto 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}/acceptfailing withFreundschaft konnte nicht erstellt werden.in mobile and launcher. - Remove conflicting
userId/friendIdupdates from the friend-link upsert ($set+$setOnInserton same fields), which caused MongoDB write error code40.
[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/friendIdfields 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
homeRegionfiltering. - 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/selfto returnonline,status, andlastSeenAtfrom the profile document so clients can render self presence without extra public-user lookups.
[2026.02.18-a653582] - Discord role links guild selection fallback
Changed
- Extend
GET/PUT/DELETE /v1/admin/discord/role-linkswith optionalguildIdselection so role mapping can target a linked Discord server without requiringDISCORD_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}/discordPUT /v1/connect/networks/{networkId}/discordDELETE /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
Administratoron the selected guild, - configured bot must already be present in the selected guild.
[2026.02.18-c0a3a1b] - Discord role links for permission roles
Added
- Add admin endpoints to manage Discord role links for permission roles:
GET /v1/admin/discord/role-linksPUT /v1/admin/discord/role-links/{roleId}DELETE /v1/admin/discord/role-links/{roleId}
- Add persistence for Discord role links (
discord_role_linkscollection) with dedicated Mongo indexes. - Add permission seed nodes for Discord role link administration:
admin:discord-role-link:viewandadmin:discord-role-link:manage.
Changed
- Add Discord server rights enforcement for role linking: API now requires Discord
Manage Roles(orAdministrator) 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 callbackGET /v1/auth/discord/callback. - Extend profile settings payloads with a
discordsection 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, andDISCORD_SUPPORTER_ROLE_MAP.
Changed
GET /v1/profile/settingsnow returns bothpatreonanddiscordprovider 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
supportersection to store supporter listing flags (listed,showTier) and optional supporter card customizations (customMessage,designPreset,designAccent). - Add a public supporters endpoint
GET /v1/public/supportersthat returns all opted-in active supporters for launcher/dashboard use.
Changed
GET /v1/profile/settingsnow returns supporter capability metadata (canUseCustomMessage,canUseCustomDesign) and minimum supporter amounts for gated customization features.PATCH /v1/profile/settingsnow 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}/acceptnow upserts afriend_acceptednotification 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/blocksendpoints to list, create, and remove user blocks. - Add
POST /v1/social/friends/reportsto 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, andallowFriendRequests) 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:readpermission 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/settingswith apatreonobject 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 callbackGET /v1/auth/patreon/callback. - Add Patreon OAuth runtime configuration via env vars:
PATREON_CLIENT_ID,PATREON_CLIENT_SECRET,PATREON_REDIRECT_URI,PATREON_SCOPES, andPATREON_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, andPUT /v1/news/follows. - Persist followed project feeds per user in
settings.newsFollowProjectsand auto-create missing user docs before writes.
Changed
GET /v1/news/feednow 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 viasinceMsquery param. Unchanged feed responses now returnnotModified=truewith an emptyitemsarray.
[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
catalogScopeson catalog payloads (GET/POST/PUT /v1/catalogs) with scope support forglobal,service,extension,network, andserver. - 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:
scopeandscopeId(/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 /metricsin 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
allowedDomainsentries instead of static one-off code paths. - Keep
/v1/head/randomand/v1/banner/random, but resolve them through enabled catalog aliases (head/banner) at runtime. - Replace Discord command sync endpoint with
/v1/discord/catalog/commandsand resolve head data from the configured catalog source. - Extend service payloads (
GET/POST/PUT /v1/services) withallowedDomains.
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 examplegateway.uebliche.netand<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}/domainsnow 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/cloudflarenow 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}/gatewaysnow includes a preferredrouteHosthint (verified network domain when available, fallback to<serverId>.connect.gateway).PUT /v1/connect/servers/{serverId}/gateway-routenow defaultsrouteHostto the network's verified domain (if present) before falling back to<serverId>.connect.gateway.POST /v1/connect/networks/{networkId}/domainsnow auto-upserts_uebliche.<domain>TXT records via Cloudflare when configured.PUT /v1/connect/servers/{serverId}/gateway-routenow auto-upserts CloudflareArecords 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 (permissionadmin:skin-builder-parts:delete). - Add the
admin:skin-builder-parts:deletepermission node to the permission catalog/seed.
[2026.02.13-1b988dd] - Role permission grants
Added
- Expose
permissionGrantson role payloads so permissions can carry numeric/amount values (e.g. power or quotas).
Fixed
- Mark
.powerpermission 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/serverIdfor 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
ownershipVerifiedByas 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_serversdocuments 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
releaseDatevalues 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
minefilter 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.
[2026.01.27-13e39e6] - Dash consent fixes
Fixed
- Accept legacy service grant user IDs when loading service consent.
- Allow Sentry
baggageandsentry-traceheaders in CORS for dash requests. - Allow build.moe health checks to send
X-Uebliche-User-Agentin CORS preflight.
[2026.01.27-a678514] - Health DB status
Added
- Include MongoDB ping status and latency in
/healthresponses.
[2026.01.27-40665b8] - Service token verify
Fixed
- Accept service JWTs in
/v1/auth/verifyfor build.moe sign-in flows.
[2026.01.27-afe1246] - Build.moe random endpoints
Added
- Add
/v1/head/randomand/v1/banner/randomfor build.moe random picks. - Add
BUILD_MOE_BANNERS_COLLECTIONto 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/verifyand/v1/auth/verifyto 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/exchangerequests. - 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/exchangeto start service consent flows from a redirect URL. - Add
/v1/auth/service/tokento issue service-scoped JWTs after consent.
Fixed
- Include legacy string
ownerIdvalues 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
ureqdependency 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
/headlookups against the local MongoDB heads collection instead of build.moe HTTP requests. - Split
/headinto search-only and/randomheadfor random results.
Added
- Add
/v1/discord/build-moe/commandsto 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/interactionto process Discord slash-command payloads (including/headand/docs).
[2026.01.25-e0e2ee8] - Connect extensions
Added
- Add Connect extension catalog endpoints plus per-server extension registrations and actions.
- Add
sourcescoping 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-optionsto sync launcher Minecraft options via the public API.
[2026.01.24-89bacaf] - Profile share admin listing
Added
- Add
/v1/admin/profile-sharesto 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/livewebsocket 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/joinendpoint. (api 07cd76c) - Add
/v1/connect/hostsfor 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/ipto return the caller IP as plain text. - Include
uptimeSecondsin/healthresponses.
[2026.01.21-0000000] - User last-seen tracking
Fixed
- Update
lastSeenAtfor 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/settingsendpoints 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/joinand/v1/auth/session/minecraft/verifyfor Mojang join-based auth. - Add
/v1/profile/auth/sessionsso users can inspect recent auth sessions.
Removed
- Remove
/v1/auth/session/minecraft/accessfrom 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-keyso 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/apiand store tokens in local storage.
[2026.01.15] - 2026-01-15
Added
- Add
/v1/auth/session/exchangeto mint API tokens from theuebliche_tokencookie (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_DSNis 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/gallerypayloads. - Include
itemModelUrlon gallery items so clients can preview each model without extra roundtrips. - Remove
cdn.baseUrlfrom 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 whenPERSONAL_TOTEM_PUBLIC_APIis enabled so each totem entry renders its own preview in the mod gallery. - Normalize
itemModelPublicUrlso it no longer exposes thetotem-models/storage prefix and instead uses cleanhttps://totem.uebliche.net/{modelId}.jsonURLs. - New uploads store
itemModelobjects without thetotem-models/prefix, so Mongo and the public URL share a simple{modelId}.jsonpath. - 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/serversresponses (includingtag=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
/healthprobes. - 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 unlessLOG_ANSIis 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/selfand/v1/profile/serversfor dashboard profile metadata and owned server lists. - Add admin permission endpoints to list and edit user permission grants.
- Add
/v1/connect/servers/registerfor automatic server registration and network grouping.
Removed
- Remove legacy
user_idfallbacks 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
/healthto 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.