Skip to content

chore: merge Modrinth's released server play and make it work in Amberite - #115

Merged
ilaigibb merged 44 commits into
mainfrom
chore/sync-upstream-relaxed-play
Nov 5, 2026
Merged

ilaigibb merged 44 commits into
mainfrom
chore/sync-upstream-relaxed-play

Conversation

@ilaigibb

@ilaigibb ilaigibb commented Nov 4, 2026 •

Copy link
Copy Markdown

Modrinth merged server play (modrinth#6968) after force-pushing the branch, so our earlier snapshot of it (#93) was missing 21 play commits and about 28 other modrinth/main commits. This merges modrinth/main at fcd4fe1fa and makes what upstream added work in Amberite, instead of only resolving conflicts.

New features

  • Icon editor icons for shares and Core servers (feat: shared icon structs for content managament modrinth/code#8205). You pick a symbol over a color or gradient. A share made this way is sent as its settings only (PUT /instances/:id/icon/generated, about 60 bytes of JSON), and each member's App draws it locally: in invite toasts, invite links, the Library, and the installed instance, which keeps an editable copy. Copal keeps its own settings per server, as upstream's server icon API does, because Minecraft needs a real server-icon.png.
  • Share icons no longer live in D1. Uploaded images were stored as base64 in the share's row, so most share routes read the image with the row. They now go to R2 at icons/{share}/{upload}, are served with a public immutable cache header without touching D1, and are deleted when replaced or when the share goes.
  • Library shows shares you joined but haven't installed, and you can hide instances (feat: show all shared instances not installed in library page modrinth/code#8120). The backend's GET /instances lists your own shares, and with include_joined every share you can play.
  • Play follow-ups: the Browse page starts members on client mods; a Play member who loses access gets that server removed from their list; accepting an invite works when you can already read the share; a modpack update keeps an icon you set; new modpack upload progress.

Removed or kept dormant

  • The "Share servers with friends" popup is removed. It advertised Modrinth Hosting from Modrinth billing data. Its files and the Slack build notification are added to upstream.json ignore.
  • The owned-share cap is dormant. The backend has no cap and no /instances/limits, so the App never asks. Whether we add a cap is for later.
  • The server migration flow only shows for a Modrinth Hosting tag Copal never sets.
  • The hostname availability check is skipped on Cores.

Ported to our side

Conflicts

I re-merged the 176 conflicted files against our earlier snapshot (e1906997c), which left 33 real ones. Where both sides solved the same thing, ours stayed: the owner's restore keeps what they added since their last push, client.rs goes through sharing-client, and Library cards share one process list and one shift listener (now in upstream's useInstanceActions). Upstream took a migration timestamp we used, so our applied-files migration moves to 20261103120000.

Verification

  • cargo check for theseus, copal, bedrock and sharing-client, plus the App with the dev runner's features.
  • App typecheck and lint pass.
  • Copal icon and backup tests pass, and the backend sharing contract test passes. I added checks to both for icon settings and the share list.
  • Real App, through the bridge, two accounts: the owner's icon editor change went up as settings only (icon: null in the row). The member opened an invite link, saw the icon drawn from those settings, and installed with it plus an editable copy. A custom image went to R2 and was served in 5 ms.

Copal's test data in the primary checkout records a migration that was folded into 001_init.sql, so Copal won't start on it, even on main. This worktree used a fresh Copal database.

Merge with a merge commit. Never squash or rebase: the sync needs both parents.

Created with Claude Opus 5.5 in Claude Code (T3 Code).

IMB11 and others added 30 commits November 2, 2026 12:19
…th#8120)

* feat: show all shared instances not installed in library page

* feat: pass over design + hidden instances feature

* fix: hidden instances not exclusive to shared ones

* chore: polish hidden instances flows

* fix: instance hiding issue

* chore: cleanup

* fix: report + external files not needed if owner of instance reinstalling on new device

* fix: networkMode

* fix: p1

* fix: standards

* fix: rev

* fix: impl limit empty state

* fix: qa

* fix: qa

* fix: qa
fix(labrinth): bound Redis timeouts and add local-only healthz probe

Redis commands and connection checkouts had no upper bound, so during a
Valkey cluster failover requests to the vanished primary hung. The rate
limiter runs on every route, including the one used by Kubernetes
probes, which caused readiness failures and liveness kills.

Cap every Redis command and connection checkout at 2s, set pool
create/recycle timeouts, and set TCP_USER_TIMEOUT on the multiplexed
cluster client so dead nodes trigger a slot refresh. Add a /healthz
endpoint that touches no backing services, skips rate limiting and only
answers requests from loopback, private or link-local peers.
* fix(ci): slow app builds

* fix tombi
…age (modrinth#7750)

* fix notification card

* chore: retrigger CI
* fix(web): broken validation on frontend for file upload

* fix(web): skip jar-only loader check for modpacks

* fix: fabric validation
* delete loader fields migration

* integrate minecraft-meta db into labrinth

* wip: new schema and component type for version meta

* wip: adapt queries and types for new ModVersion component

* wip: remove all loader field references in database module

* remove loader fields from models too

* use MinecraftMeta instead of fetching daedalus

* update dummy fixtures

* remove unused games tbls

* fix tombi

* impl version component fetching

* fix how we look up loader during edit

* update sqlx prepare

* fmt + prepare

* fix ci

* split migration into 2

* comment out migrations to apply manually

* extract out helper for refreshed/cache-stampede-avoidant data

* ensure all versions valid

* refresh minecraft meta in background

* switch to slimmed-down MinecraftVersionEntry type

* dedup metadata before storing in cache

* fmt

* address pr comments
* fix: force tech review pass query to use pg index

* sqlx prepare
* feat: shared icon structs for content managament

* feat: server icon management

* fix: bug
* feat: add more status badges and add user status badges in user page, tech rev cards and report cards

* small change

* small fix

* pnpm prepr
* centralize file size upload limits in backend

* make frontend use upload limits from backend

* prepr
…losure issue (modrinth#8210)

* fix: mark addressed is disabled when remove disclosure for ModifyDisclosure issue

* pnpm prepr
Co-authored-by: François-X. T. <fetch@ferrous.ch>
* feat: server play blog

* fix: update images vids and grammar
…odrinth#8213)

* fix(content-management): make `minecraft` and `datapacks` loaders universally compatible when normal match by loader yields nothing

* chore: tests

* fix: centralize file upload limits in backend (modrinth#8204)

* centralize file size upload limits in backend

* make frontend use upload limits from backend

* prepr

* fix: mark addressed is disabled when remove disclosure for ModifyDisclosure issue (modrinth#8210)

* fix: mark addressed is disabled when remove disclosure for ModifyDisclosure issue

* pnpm prepr

* feat: server play frontend (modrinth#6968)

Co-authored-by: François-X. T. <fetch@ferrous.ch>

* chore: changleog 0.23.0 (modrinth#8219)

chore: changleog 0.23.0

---------

Co-authored-by: aecsocket <43144841+aecsocket@users.noreply.github.com>
Co-authored-by: Truman Gao <106889354+tdgao@users.noreply.github.com>
Co-authored-by: Calum H. <calum@modrinth.com>
Merged against our earlier snapshot of the play branch (e190699) so only real differences conflicted. Our design wins where both solved the same thing: the owner's restore keeps what they added, client.rs goes through sharing-client, and Library cards share one process list and one shift listener.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ilaigibb and others added 10 commits November 4, 2026 12:56
It advertised Modrinth Hosting from Modrinth billing data and a Modrinth video. Its files are
ignored in upstream.json so later syncs leave them out.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Takes upstream's sqlx cache for the queries it changed, passes the new icon config through a restore, and keeps our owner restore rule for which files an update replaces.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Upstream's icon editor saves the settings an icon was made from next to the image. Shares now keep them on the backend (PUT /instances/:id/icon/generated, icon_config on the share and its invites), and Copal keeps them per server with the hash of the icon they made (GET /icon/metadata, PUT /icon/generated), so an icon replaced through the files routes drops them.

The Library's share list follows upstream: GET /instances lists the caller's own shares, and with include_joined every share they can play.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Upstream's backups page reads manual_count and auto_count from the server instead of counting itself.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The edit profile modal now disables the avatar upload without max_user_icon_size.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The backend has no owned-share cap and no /instances/limits, so the App never asks.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
From modrinth#8181. Moves the clone's upstream commit to the merged modrinth/main.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Restores our revoke-link modal (rename detection had swapped in another file), drops a duplicated type, adds the latest-version call the Library uses, and keys icon thumbnails on a modified time an uninstalled share does not have.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Nov 4, 2026 •

Copy link
Copy Markdown

Important

Review skipped

Too many files!

This PR contains 355 files, which is 255 over the limit of 100.

To get a review, reduce the PR to 100 files or fewer by splitting it into smaller PRs or changing its base branch.

Upgrade to a paid plan to raise the limit.

Usage-priced reviews support at most 300 files.

Run configuration
  • Source mode: Auto
  • Repository: Unavailable
  • Branch: Unavailable
  • File: No configuration file from this repository applied
  • Commit: Unavailable
  • Layers: Repository UI
  • Review profile: CHILL
  • Plan: Advanced
  • Run ID: 5287c477-e99e-4116-a13c-88919668f64b
Commits

Reviewing files that changed from the base of the PR and between 0fac039 and 895c7e7.

Files ignored due to path filters: 10
  • Cargo.lock is excluded by !**/*.lock
  • packages/assets/icons/square-arrow-out-up-right.svg is excluded by !**/*.svg
  • packages/assets/icons/user-lock.svg is excluded by !**/*.svg
  • packages/assets/icons/user-round-x.svg is excluded by !**/*.svg
  • packages/assets/illustrations/server-sharing/server-play-demo.webm is excluded by !**/*.webm
  • packages/blog/public/server-play/enabled-for.webm is excluded by !**/*.webm
  • packages/blog/public/server-play/migration.webm is excluded by !**/*.webm
  • packages/blog/public/server-play/player-content.webm is excluded by !**/*.webm
  • packages/blog/public/server-play/share-link.webm is excluded by !**/*.webm
  • pnpm-lock.yaml is excluded by !**/pnpm-lock.yaml
Files selected for processing: 355
  • apps/app-frontend/AGENTS.md
  • apps/app-frontend/src/App.vue
  • apps/app-frontend/src/components/ui/QuickInstanceSwitcher.vue
  • apps/app-frontend/src/components/ui/WelcomeScreen.vue
  • apps/app-frontend/src/components/ui/download-manager/download-manager-job.vue
  • apps/app-frontend/src/components/ui/instance_settings/InstanceIconEditorModal.vue
  • apps/app-frontend/src/components/ui/library/LibrarySelectionActionBar.vue
  • apps/app-frontend/src/components/ui/library/index.vue
  • apps/app-frontend/src/components/ui/library/instance-group/index.vue
  • apps/app-frontend/src/components/ui/library/instance-group/instance-card-view.vue
  • apps/app-frontend/src/components/ui/library/instance-group/instance-card.vue
  • apps/app-frontend/src/components/ui/library/instance-group/instance-selection-button.vue
  • apps/app-frontend/src/components/ui/library/instance-group/instance-shared-badge.vue
  • apps/app-frontend/src/components/ui/library/instance-group/uninstalled-shared-instance-card.vue
  • apps/app-frontend/src/components/ui/library/library-toolbar/filter-menu.vue
  • apps/app-frontend/src/components/ui/library/running-processes.ts
  • apps/app-frontend/src/components/ui/library/use-library.ts
  • apps/app-frontend/src/components/ui/screenshots-page/index.vue
  • apps/app-frontend/src/components/ui/shared-instances/SharedInstanceUpdateModal.vue
  • apps/app-frontend/src/components/ui/shared-instances/shared-instance-install-modal/index.vue
  • apps/app-frontend/src/components/ui/shared-instances/shared-instance-install-modal/shared-instance-install-summary.vue
  • apps/app-frontend/src/components/ui/shared-instances/shared-instance-invite-handler/shared-instance-invite-parser.ts
  • apps/app-frontend/src/components/ui/shared-instances/shared-instance-invite-handler/shared-instance-invite-types.ts
  • apps/app-frontend/src/components/ui/shared-instances/shared-instance-invite-handler/use-shared-instance-invite-handler.ts
  • apps/app-frontend/src/components/ui/world/RecentWorldsList.vue
  • apps/app-frontend/src/components/ui/world/queries.ts
  • apps/app-frontend/src/composables/instances/use-synced-pack-actions.ts
  • apps/app-frontend/src/composables/use-app-settings.ts
  • apps/app-frontend/src/composables/users/use-user-query.ts
  • apps/app-frontend/src/features/hosting/prefetch.ts
  • apps/app-frontend/src/features/hosting/use-server-play.ts
  • apps/app-frontend/src/features/instances/instance-actions/context.ts
  • apps/app-frontend/src/features/instances/instance-actions/instance-action-modals.vue
  • apps/app-frontend/src/features/instances/settings-modal/behavior-settings.vue
  • apps/app-frontend/src/features/instances/settings-modal/general-settings.vue
  • apps/app-frontend/src/features/instances/settings-modal/index.vue
  • apps/app-frontend/src/features/instances/settings-modal/installation-settings.vue
  • apps/app-frontend/src/features/instances/settings-modal/sharing-settings/index.vue
  • apps/app-frontend/src/features/instances/settings-modal/sharing-settings/use-sharing-settings.ts
  • apps/app-frontend/src/features/instances/settings-modal/synced-options-settings.vue
  • apps/app-frontend/src/features/instances/use-instance-actions.ts
  • apps/app-frontend/src/features/instances/use-instance-menu.ts
  • apps/app-frontend/src/features/library/hidden-instances/queries.ts
  • apps/app-frontend/src/features/library/hidden-instances/use-hidden-instances.ts
  • apps/app-frontend/src/features/library/hidden-instances/use-hidden-library-instances.ts
  • apps/app-frontend/src/features/library/library-instance.ts
  • apps/app-frontend/src/features/library/messages.ts
  • apps/app-frontend/src/features/library/shared-instances/actions-context.ts
  • apps/app-frontend/src/features/library/shared-instances/queries.ts
  • apps/app-frontend/src/features/library/shared-instances/removal.ts
  • apps/app-frontend/src/features/library/shared-instances/remove-shared-instances-modal.vue
  • apps/app-frontend/src/features/library/shared-instances/shared-instance-modals.vue
  • apps/app-frontend/src/features/library/shared-instances/types.ts
  • apps/app-frontend/src/features/library/shared-instances/use-owned-shared-instance-limit.ts
  • apps/app-frontend/src/features/library/shared-instances/use-shared-instance-library-sync.ts
  • apps/app-frontend/src/features/library/shared-instances/use-shared-instance-menu.ts
  • apps/app-frontend/src/features/library/shared-instances/use-shared-instance-owners.ts
  • apps/app-frontend/src/features/library/shared-instances/use-uninstalled-shared-instances.ts
  • apps/app-frontend/src/features/settings/app-settings-modal/index.vue
  • apps/app-frontend/src/features/settings/display/behavior-settings.vue
  • apps/app-frontend/src/features/settings/display/hidden-instances-settings/index.vue
  • apps/app-frontend/src/features/settings/display/hidden-instances-settings/installed-row.vue
  • apps/app-frontend/src/features/settings/display/hidden-instances-settings/row.vue
  • apps/app-frontend/src/features/settings/display/hidden-instances-settings/shared-row.vue
  • apps/app-frontend/src/features/settings/instance-defaults/use-default-instance-settings.ts
  • apps/app-frontend/src/features/settings/syncing/command-history-modal.vue
  • apps/app-frontend/src/features/settings/syncing/game-settings-modal/use-editor.ts
  • apps/app-frontend/src/features/settings/syncing/servers-modal.vue
  • apps/app-frontend/src/features/settings/syncing/synced-packs-modal.vue
  • apps/app-frontend/src/features/settings/syncing/syncing-settings.vue
  • apps/app-frontend/src/features/settings/system/resource-management-settings/content-storage.vue
  • apps/app-frontend/src/features/settings/system/troubleshooting-settings.vue
  • apps/app-frontend/src/features/updates/new-update-modal/index.vue
  • apps/app-frontend/src/features/updates/new-update-modal/show-notification.ts
  • apps/app-frontend/src/features/updates/new-update-modal/use-notification.ts
  • apps/app-frontend/src/helpers/game-options.ts
  • apps/app-frontend/src/helpers/install.ts
  • apps/app-frontend/src/helpers/instance.ts
  • apps/app-frontend/src/helpers/jre.js
  • apps/app-frontend/src/helpers/settings.ts
  • apps/app-frontend/src/helpers/shared-instance-errors.ts
  • apps/app-frontend/src/helpers/synced-options.ts
  • apps/app-frontend/src/helpers/synced-packs.ts
  • apps/app-frontend/src/helpers/types.d.ts
  • apps/app-frontend/src/locales/ar-SA/index.json
  • apps/app-frontend/src/locales/cs-CZ/index.json
  • apps/app-frontend/src/locales/en-US/index.json
  • apps/app-frontend/src/locales/es-ES/index.json
  • apps/app-frontend/src/locales/fr-FR/index.json
  • apps/app-frontend/src/locales/hu-HU/index.json
  • apps/app-frontend/src/locales/it-IT/index.json
  • apps/app-frontend/src/locales/ko-KR/index.json
  • apps/app-frontend/src/locales/nl-NL/index.json
  • apps/app-frontend/src/locales/no-NO/index.json
  • apps/app-frontend/src/locales/pl-PL/index.json
  • apps/app-frontend/src/locales/ru-RU/index.json
  • apps/app-frontend/src/locales/sr-CS/index.json
  • apps/app-frontend/src/locales/tr-TR/index.json
  • apps/app-frontend/src/locales/uk-UA/index.json
  • apps/app-frontend/src/locales/zh-TW/index.json
  • apps/app-frontend/src/pages/Index.vue
  • apps/app-frontend/src/pages/instance/components/admonitions/index.vue
  • apps/app-frontend/src/pages/instance/components/admonitions/messages.ts
  • apps/app-frontend/src/pages/instance/components/admonitions/shared-instance-owner-update.vue
  • apps/app-frontend/src/pages/instance/components/admonitions/shared-instance-restored.vue
  • apps/app-frontend/src/pages/instance/components/admonitions/types.ts
  • apps/app-frontend/src/pages/instance/components/page-header/index.vue
  • apps/app-frontend/src/pages/instance/content/index.vue
  • apps/app-frontend/src/pages/instance/files/index.vue
  • apps/app-frontend/src/pages/instance/layout.vue
  • apps/app-frontend/src/pages/instance/logs/index.vue
  • apps/app-frontend/src/pages/instance/query-options.ts
  • apps/app-frontend/src/pages/instance/share/index.vue
  • apps/app-frontend/src/platform/adapters/browse/browse-page.vue
  • apps/app-frontend/src/platform/adapters/hosting/manage/layout.vue
  • apps/app-frontend/src/platform/app-lib/hidden-instances/commands.ts
  • apps/app-frontend/src/platform/app-lib/onboarding-checklist/commands.ts
  • apps/app-frontend/src/platform/app-lib/shared-instances/commands.ts
  • apps/app-frontend/src/providers/setup.ts
  • apps/app-frontend/src/providers/setup/creation-modal.ts
  • apps/app-frontend/src/shared/composables/use-cached-server-icon.ts
  • apps/app/build.rs
  • apps/app/src/api/install.rs
  • apps/app/src/api/instance.rs
  • apps/app/src/api/onboarding_checklist.rs
  • apps/backend/migrations/0016_shared_icon_config.sql
  • apps/backend/src/accounts/index.ts
  • apps/backend/src/sharing/index.ts
  • apps/backend/src/social/index.ts
  • apps/backend/tests/sharing.contract.test.mjs
  • apps/core/migrations/001_init.sql
  • apps/core/src/api/backups.rs
  • apps/core/src/api/icon.rs
  • apps/core/src/api/mod.rs
  • apps/core/src/api/tests.rs
  • apps/core/src/state/servers/adapters/sqlite/server_rows.rs
  • docs/internals/sharing-api.md
  • packages/api-client/src/modules/archon/icons/v1.ts
  • packages/api-client/src/modules/archon/index.ts
  • packages/api-client/src/modules/archon/types.ts
  • packages/api-client/src/modules/labrinth/types.ts
  • packages/api-client/src/modules/shared-instances/instances/v1.ts
  • packages/api-client/src/modules/shared-instances/types.ts
  • packages/api-client/src/types/icons.ts
  • packages/api-client/src/types/index.ts
  • packages/app-lib/.sqlx/query-0f485627f6034aab753518d587a90a13ea88d9f536f57dd38030e83fcf287ee5.json
  • packages/app-lib/.sqlx/query-4edd038365d501087843f34c79268fc14339ee18b118d6b1da9c685a67729704.json
  • packages/app-lib/.sqlx/query-594d467502949a7c157cdcc55fd025a839f7843f912e0ba4a4142884b23b6bfe.json
  • packages/app-lib/.sqlx/query-8bf8354c825539f5e2ed5cc4d4d75f72bda2f1d71a626b43c791c37fbe051ca8.json
  • packages/app-lib/.sqlx/query-9a3b5f5c749607d832e9003b95be72ad643acec7e51aa0f8acdd9695a73468cc.json
  • packages/app-lib/.sqlx/query-9fb4bf0fc6222c2afbba12fe8523615d948a7b1685690731f0f38886def82c6d.json
  • packages/app-lib/.sqlx/query-b9ce6ff27e3b4d62ff0ae2bed0d00cae0b4b758c0674ac81659ee9d86667f19c.json
  • packages/app-lib/.sqlx/query-ce0a8e4adf23e64a8d478516369b08abb61f683ad056b9f10eed635b4ef88bf6.json
  • packages/app-lib/.sqlx/query-d3cf6211a6ad1948b89fb1a8dc367f843a53a15db6dabcb354ff44fa2b784651.json
  • packages/app-lib/.sqlx/query-d3eb2565e0481fecb0f8bc1dd4b5ac8216f8eed85d775bb89707362c709a15bd.json
  • packages/app-lib/.sqlx/query-dcd47a2ca922a0d42f0096eb7d90ecb5cce2a56e715f264d20d10f8d0bd57f9e.json
  • packages/app-lib/AGENTS.md
  • packages/app-lib/migrations/20261026120000_shared-instance-restored-from-remote.sql
  • packages/app-lib/migrations/20261027140000_hidden-instances.sql
  • packages/app-lib/migrations/20261102120000_shared-instance-backtrack-version.sql
  • packages/app-lib/migrations/20261103120000_shared-instance-applied-files.sql
  • packages/app-lib/src/api/debug_info.rs
  • packages/app-lib/src/api/instance.rs
  • packages/app-lib/src/api/instance/hidden.rs
  • packages/app-lib/src/api/instance/icon.rs
  • packages/app-lib/src/api/instance/lifecycle.rs
  • packages/app-lib/src/api/instance/shared/client.rs
  • packages/app-lib/src/api/instance/shared/diff.rs
  • packages/app-lib/src/api/instance/shared/history.rs
  • packages/app-lib/src/api/instance/shared/install.rs
  • packages/app-lib/src/api/instance/shared/invites.rs
  • packages/app-lib/src/api/instance/shared/library.rs
  • packages/app-lib/src/api/instance/shared/mod.rs
  • packages/app-lib/src/api/instance/shared/publish.rs
  • packages/app-lib/src/api/instance/shared/types.rs
  • packages/app-lib/src/api/instance/synced_servers/mod.rs
  • packages/app-lib/src/api/instance/synced_servers/operations.rs
  • packages/app-lib/src/api/mod.rs
  • packages/app-lib/src/api/onboarding_checklist.rs
  • packages/app-lib/src/api/pack/import/mod.rs
  • packages/app-lib/src/error.rs
  • packages/app-lib/src/install/model.rs
  • packages/app-lib/src/install/recovery.rs
  • packages/app-lib/src/install/runner.rs
  • packages/app-lib/src/install/shared_instance.rs
  • packages/app-lib/src/state/cache.rs
  • packages/app-lib/src/state/content_store/adapters/sqlite/instance_storage_rows.rs
  • packages/app-lib/src/state/content_store/mod.rs
  • packages/app-lib/src/state/db_backup.rs
  • packages/app-lib/src/state/hidden_instances.rs
  • packages/app-lib/src/state/instances/adapters/sqlite/instance_rows.rs
  • packages/app-lib/src/state/instances/commands/create_instance.rs
  • packages/app-lib/src/state/instances/commands/edit_instance.rs
  • packages/app-lib/src/state/instances/commands/get_instance.rs
  • packages/app-lib/src/state/instances/commands/mod.rs
  • packages/app-lib/src/state/instances/commands/shared_instance.rs
  • packages/app-lib/src/state/instances/commands/sync_content_files.rs
  • packages/app-lib/src/state/instances/mod.rs
  • packages/app-lib/src/state/instances/model/instance.rs
  • packages/app-lib/src/state/instances/model/link.rs
  • packages/app-lib/src/state/mod.rs
  • packages/app-lib/src/state/mr_auth.rs
  • packages/app-lib/src/util/fetch.rs
  • packages/assets/generated-icons.ts
  • packages/assets/illustrations/server-sharing/server-play-demo.webp
  • packages/bedrock/.sqlx/query-d3cf6211a6ad1948b89fb1a8dc367f843a53a15db6dabcb354ff44fa2b784651.json
  • packages/bedrock/ports.toml
  • packages/bedrock/src/upstream/store/adapters/sqlite/instance_storage_rows.rs
  • packages/bedrock/src/upstream/store/mod.rs
  • packages/blog/articles/server-play.md
  • packages/blog/changelog.ts
  • packages/blog/compiled/index.ts
  • packages/blog/compiled/server_play.content.ts
  • packages/blog/compiled/server_play.ts
  • packages/blog/public/server-play/play-tab.webp
  • packages/blog/public/server-play/thumbnail.webp
  • packages/moderation/src/data/settings.ts
  • packages/moderation/src/locales/cs-CZ/index.json
  • packages/moderation/src/locales/de-CH/index.json
  • packages/moderation/src/locales/de-DE/index.json
  • packages/moderation/src/locales/fr-FR/index.json
  • packages/moderation/src/locales/hu-HU/index.json
  • packages/moderation/src/locales/it-IT/index.json
  • packages/moderation/src/locales/ko-KR/index.json
  • packages/moderation/src/locales/pl-PL/index.json
  • packages/moderation/src/locales/pt-BR/index.json
  • packages/moderation/src/locales/ru-RU/index.json
  • packages/moderation/src/locales/tr-TR/index.json
  • packages/moderation/src/locales/uk-UA/index.json
  • packages/moderation/src/locales/zh-CN/index.json
  • packages/moderation/src/locales/zh-TW/index.json
  • packages/modrinth-content-management/Cargo.toml
  • packages/modrinth-content-management/src/icons/mod.rs
  • packages/modrinth-content-management/src/install/mod.rs
  • packages/modrinth-content-management/src/lib.rs
  • packages/sharing-client/src/backend/mod.rs
  • packages/ui/src/components/base/Admonition.vue
  • packages/ui/src/components/base/Avatar.vue
  • packages/ui/src/components/base/BigOptionButton.vue
  • packages/ui/src/components/base/CollapsibleAdmonition.vue
  • packages/ui/src/components/base/icon-editor-modal/GeneratedIcon.vue
  • packages/ui/src/components/base/icon-editor-modal/generated-icon.ts
  • packages/ui/src/components/base/icon-editor-modal/index.ts
  • packages/ui/src/components/base/icon-editor-modal/index.vue
  • packages/ui/src/components/base/icon-editor-modal/types.ts
  • packages/ui/src/components/base/inputs/Input.vue
  • packages/ui/src/components/floating/Tooltip.vue
  • packages/ui/src/components/floating/TooltipDirective.vue
  • packages/ui/src/components/flows/creation-flow-modal/components/FinalConfigStage.vue
  • packages/ui/src/components/flows/creation-flow-modal/components/ModpackUploadProgress.vue
  • packages/ui/src/components/flows/creation-flow-modal/components/UploadingStage.vue
  • packages/ui/src/components/flows/creation-flow-modal/components/curseforge-stage/archive-input.vue
  • packages/ui/src/components/flows/creation-flow-modal/components/curseforge-stage/modpack-picker.vue
  • packages/ui/src/components/flows/creation-flow-modal/stages/final-config-stage.ts
  • packages/ui/src/components/flows/creation-flow-modal/stages/uploading-stage.ts
  • packages/ui/src/components/modal/UploadProgressModal.vue
  • packages/ui/src/components/modal/index.ts
  • packages/ui/src/components/search/SearchSidebarFilter.vue
  • packages/ui/src/components/servers/ServerListing.vue
  • packages/ui/src/components/servers/ServerModpackUploadModal.vue
  • packages/ui/src/components/servers/ServerSetupModal.vue
  • packages/ui/src/components/servers/access/events/EventEntityList.vue
  • packages/ui/src/components/servers/admonitions/BackupAdmonition.vue
  • packages/ui/src/components/servers/admonitions/ServerPanelAdmonitions.vue
  • packages/ui/src/components/servers/edit-server-icon/EditServerIcon.vue
  • packages/ui/src/components/servers/icons/ServerIcon.vue
  • packages/ui/src/components/servers/play-migration/ServerPlayMigrationCurseForgeStage.vue
  • packages/ui/src/components/servers/play-migration/ServerPlayMigrationFlow.vue
  • packages/ui/src/components/servers/play-migration/ServerPlayMigrationModal.vue
  • packages/ui/src/components/servers/play-migration/ServerPlayMigrationMrpackStage.vue
  • packages/ui/src/components/sharing/index.ts
  • packages/ui/src/components/sharing/invited-players-table/index.vue
  • packages/ui/src/components/sharing/invited-players-table/use-invited-players-table.ts
  • packages/ui/src/components/sharing/server-sharing-update/ServerSharingUpdateModal.vue
  • packages/ui/src/components/sharing/server-sharing-update/handoff.ts
  • packages/ui/src/components/sharing/server-sharing-update/use-video-player.ts
  • packages/ui/src/components/user/UserPageHeader.vue
  • packages/ui/src/composables/globals.ts
  • packages/ui/src/composables/index.ts
  • packages/ui/src/composables/server-panel-sync.ts
  • packages/ui/src/composables/server-queries.ts
  • packages/ui/src/composables/use-cached-icon.ts
  • packages/ui/src/composables/use-generated-icon-src.ts
  • packages/ui/src/composables/use-server-icon.ts
  • packages/ui/src/layouts/shared/browse-tab/composables/index.ts
  • packages/ui/src/layouts/shared/browse-tab/composables/use-server-environment-filter.ts
  • packages/ui/src/layouts/shared/browse-tab/header.vue
  • packages/ui/src/layouts/shared/browse-tab/layout.vue
  • packages/ui/src/layouts/shared/browse-tab/sidebar.vue
  • packages/ui/src/layouts/shared/content-tab/components/ContentCardTable.vue
  • packages/ui/src/layouts/shared/content-tab/components/managed-content-card/index.vue
  • packages/ui/src/layouts/shared/content-tab/components/managed-content-card/managed-content-card-footer.vue
  • packages/ui/src/layouts/shared/content-tab/components/managed-content-card/managed-content-card-summary.vue
  • packages/ui/src/layouts/shared/content-tab/components/managed-content-modal/index.vue
  • packages/ui/src/layouts/shared/content-tab/layout.vue
  • packages/ui/src/layouts/shared/files-tab/components/FileTableHeader.vue
  • packages/ui/src/layouts/shared/files-tab/components/FileTableRow.vue
  • packages/ui/src/layouts/shared/installation-settings/layout.vue
  • packages/ui/src/layouts/shared/server-settings/pages/advanced.vue
  • packages/ui/src/layouts/shared/server-settings/pages/general.vue
  • packages/ui/src/layouts/shared/server-settings/pages/installation.vue
  • packages/ui/src/layouts/shared/sharing-settings/components/active-invites.vue
  • packages/ui/src/layouts/shared/user-profile/components/edit-user-modal.vue
  • packages/ui/src/layouts/shared/user-profile/components/lock-user-modal.vue
  • packages/ui/src/layouts/shared/user-profile/components/restrict-user-modal.vue
  • packages/ui/src/layouts/shared/user-profile/layout.vue
  • packages/ui/src/layouts/wrapped/hosting/manage/[id]/play/play.vue
  • packages/ui/src/layouts/wrapped/hosting/manage/backups/index.vue
  • packages/ui/src/layouts/wrapped/hosting/manage/composables/use-server-play-migration-flow.ts
  • packages/ui/src/layouts/wrapped/hosting/manage/composables/use-server-play-migration.ts
  • packages/ui/src/layouts/wrapped/hosting/manage/index.vue
  • packages/ui/src/layouts/wrapped/hosting/manage/providers/server-play-migration.ts
  • packages/ui/src/layouts/wrapped/hosting/manage/root.vue
  • packages/ui/src/layouts/wrapped/settings/AccountProfileSettings.vue
  • packages/ui/src/locales/ar-SA/index.json
  • packages/ui/src/locales/ar-SA/meta.json
  • packages/ui/src/locales/cs-CZ/index.json
  • packages/ui/src/locales/da-DK/index.json
  • packages/ui/src/locales/de-CH/index.json
  • packages/ui/src/locales/de-DE/index.json
  • packages/ui/src/locales/en-US/index.json
  • packages/ui/src/locales/es-419/index.json
  • packages/ui/src/locales/es-ES/index.json
  • packages/ui/src/locales/fi-FI/index.json
  • packages/ui/src/locales/fi-FI/meta.json
  • packages/ui/src/locales/fil-PH/index.json
  • packages/ui/src/locales/fr-FR/index.json
  • packages/ui/src/locales/hu-HU/index.json
  • packages/ui/src/locales/id-ID/index.json
  • packages/ui/src/locales/it-IT/index.json
  • packages/ui/src/locales/ja-JP/index.json
  • packages/ui/src/locales/ko-KR/index.json
  • packages/ui/src/locales/ms-MY/index.json
  • packages/ui/src/locales/nl-NL/index.json
  • packages/ui/src/locales/no-NO/index.json
  • packages/ui/src/locales/pl-PL/index.json
  • packages/ui/src/locales/pt-BR/index.json
  • packages/ui/src/locales/pt-PT/index.json
  • packages/ui/src/locales/ro-RO/index.json
  • packages/ui/src/locales/ru-RU/index.json
  • packages/ui/src/locales/sr-CS/index.json
  • packages/ui/src/locales/sv-SE/index.json
  • packages/ui/src/locales/th-TH/index.json
  • packages/ui/src/locales/tr-TR/index.json
  • packages/ui/src/locales/uk-UA/index.json
  • packages/ui/src/locales/vi-VN/index.json
  • packages/ui/src/locales/zh-CN/index.json
  • packages/ui/src/locales/zh-TW/index.json
  • packages/ui/src/providers/icon-cache.ts
  • packages/ui/src/providers/tooltip.ts
  • packages/ui/src/stories/modal/UploadProgressModal.stories.ts
  • packages/ui/src/stories/servers/AuditLogTable.stories.ts
  • packages/ui/src/stories/servers/ServerPlayMigrationModal.stories.ts
  • standards/frontend/app-frontend/APP_FRONTEND_FETCHING_DATA.md
  • upstream.json

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

Share

ilaigibb and others added 4 commits November 4, 2026 18:43
…ttings only

D1 rows held each share's icon as base64, so most share routes read the image
along with the row. Uploaded images now live in R2 under the share and are
served from there; an icon editor icon is only its settings, which clients
draw themselves. Invite notifications carry the settings too.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The owner's App sends an icon editor icon as its settings alone. A member's App
draws it, cached by content, wherever a share's icon first arrives: invite
toasts, invite links, and the Library.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The backend serves an uploaded icon with the type it was sent with, and every
upload said application/octet-stream.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@ilaigibb
ilaigibb merged commit 7b30e82 into main Nov 5, 2026
6 checks passed
@ilaigibb
ilaigibb deleted the chore/sync-upstream-relaxed-play branch November 5, 2026 15:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

8 participants