* feat: paginator go to button
- Added a way in the paginator to select the page number you want to go to instead of clicking the arrow's.
* localization
---------
Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
* fix: fixed height on modal
* fix: conditional auto padding being applied on user avatars
* feat: allow ungrouped to be dragged
* feat: add drag handle to resize num items in jump in
* qa
* feat: add context menu submenus
* feat: hook up icon editing in sub menu
* fix: breadcrumb and sidebar not matching
* fix: bring back signal icon for ping and players online
* feat: add compact mode for library
* smaller checkmark
* pnpm prepr
* feat: bring back loader/game version sort
* add loader symbols
* refactor: compact mode with sync'd app settings
* pnpm prepr
* move loaders up
* qa
* feat: exclude loaders from randomizing
quick-xml is already the de facto XML (de)serializer used
elsewhere in the workspace (labrinth, app-lib), so consolidate
on it here too. Its serde feature deserializes the existing
maven-metadata.xml structs without any changes. Drops one
redundant dependency from the workspace.
fix(app): clean up online/offline listeners on Browse.vue unmount
Browse.vue registers window 'online'/'offline' listeners but never
removes them. Since only LibraryPage is kept alive by the router,
Browse unmounts every time the user navigates away (e.g. into a
project) and remounts on return, leaking a new pair of closures (and
pinning the whole component scope) on window each time. Over a
browsing session this accumulates continuously.
* refactor: remove unused legacy onboarded flag
* sqlx prepare
* feat: add onboarding checklist app db and add vue provider
* feat: add welcome page
* feat: add onboarding checklist component
* feat: move checklist visibility source of truth in app db
* feat: split up import modpack button
* feat-small: style tweak
* feat: remove discover section from homepage and add library
* refactor: move welcome screen to component
* refactor: move grid display into /library
* refactor: rename existing components
* refactor: split up the current library page files
* feat: add create group modal
* feat: add instance group definitions
* feat: update accordian for instance groups
* feat: add delete group
* feat: implement rename instance groups
* refactor: move instance group api out
* feat: add context menu for groups
* feat: style instance items in library
* feat: add selected instance item state
* feat: implement action bar for selection
* feat: drag and drop to move between groups
* feat: show ungrouped with header
* feat: improve edit group name
* small fix
* small style fixes
* feat: improve selection behaviour
* fix: dont toggle group when context menu open
* feat: drag and drop multiple selected
* small
* feat: add remove from group in action bar
* feat: add delay on icon hiding in inline input
* feat: improve icon hiding delay
* fix: bad routes.js
* feat: implement sort and filter options
* refactor: dont prefix filenames
* feat: change open/collapse group target
* feat: improve ungrouped behaviour
* feat: add shift to select multiple instances
* fix: icon disappear transition
* feat: add esc while dragging to cancel
* feat: update sorting and moved label
* feat: update context menu
* fix: multiple context menus can be opened
* refactor: instance groups to be identified by ID instead of name, names become display data
* feat: creating new group always adds instance
* feat: create group button, fix instance selection, and increase group name max length
* feat: strokes
* fix: show getting started checklist in all sidebar
* feat: set size on microsoft login screen
* fix: use ButtonStyled in Chips component
* feat: creating groups with selected instances and fix some moving selection and duplication bugs
* pnpm prepr
* feat: add tooltip for instance already in group
* feat: create instance with content in creation flow modal
- search modpack becomes search projects
- creation flow modal context receives prepareProjectInstall and createProjectInstall callbacks, from content-install.ts (shared with ContentInstallModal)
* feat: update instance card styles
* refactor: separate out instance card content
* update styles
* refactor: instance card
* fix: width of instance
* feat: update empty state
* feat: update sort and grouping dropdowns
* feat: better context menu options
* feat: add group action buttons
* feat: add/remove favourites group
* remove manual sort
* feat: improve the "New group" jank
* feat: add group by instance type and change group sorting
* feat: welcome screen styles match figma
* feat: not signed in skins demo
* feat: new hosting empty state
* feat: new instance card style
* feat: add tooltip and spice up animation more
* feat: improve the transitions for groups after dropping many instances
* feat: set instance group membership for bulk moving
* feat: remove fade out
* fix: allow dragging from buttons inside instance card
* fix: library page load in behaviour
* small fix
* feat: add group ordering and reordering
* feat: add drag to reorder groups
* fix: switching page not clearing selected instances
* style fixes
* style fix
* fix spacing
* feat: jump in changes
* feat: add styled newly created instances
* feat: improve jump in cards styles
* fix: welcome screen style
* fix: empty state styles
* feat: max 5 jump in items
* feat: max new instances to 3
* fix: search icon
* feat: clear selection after move
* feat: skins list use check icon styles
* feat: list will be deleted instances and default sort last played
* fix: stroke
* remove: no more group settings in instance general settings
* fix: resolving modpack server install
* feat: icon editor
* feat: add three hue shifted variants
* fix: surprise me doesnt pick symbol
* feat: add customize icon to create instance modal
* feat: skins loading state style
* fix: welcome logo
* fix: copy
* fix: left over usage of ButtonStyled from main's refactor
* feat: some leaked merge stuff
* feat: server empty state styles
* remove: instance helper text
* remove: auto link in set up stage
* feat: auto focus on search when modal open
* fix: delete instance modal style
* remove: modpack meta repeating
* fix: icon
* fix: font weight
* fix: dropdown filter preview heights
* pnpm prepr
* fix: sign into modrinth flashing change in position
* feat: add avatar transparent corner gets padding
* feat: drag and hold over group opens group
* feat: add random icon for custom instance
* feat: update loading icon
* polish: empty state for search
* polish: jump in cards
* fix: avatar could skip checking for image if tauri loads it first
* feat: add icon customize and randomizer in content install modal for add to new instances
* fix: avatar cannot read image pixels due to cors
* refactor: popup notifications toast type for instance sharing notifications
* feat: apply random icons modal and add popup notification for it
* polish: style
* fix: set_webview_visible
* QA
* qa
* feat: add inner white 15 opacity stroke around avatar
* add to catalog
* pnpm prepr
* fix: app event import
* feat: add new icons and backgrounds for icon editor
* feat: recents list generate from randomized icons and save icon in editor + icon editor modal fixes
* qa
* refactor: recipe -> config
* fix: event bus
* polish
* feat: add safe guard against randomizing empty icons
* feat: navigate to instance after creation
* fix: icon file names
* i18n on welcome screen
* i18n pass on PR
* fix: inconsistent max group name length
* refactor: use sqlx macro
* feat: add instance icon background selection drag
* feat: update catalog order
* fix: remove gradient for welcome screen
* remove: frog
* fix: min width
* feat: update corner size
* fix: context menu styles
* prepr
* fix: instance name trimming
* reorder
* fix: instance card loading state stayed until hovering
* feat: add icon randomizer blacklist
* blog
* prepr
---------
Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
* feat: show warning if modpack has a version during time when modpack export broke
* fix type
* fix: dont lazy load versions v3 for staff and convert times to utc
* pnpm prepr
* fix: stale function call set_webview_visible
* fix: modpack export progress bar and add notification when done
* remove: force_no_zip64
* feat: switch to zip crate
* add typo exception
* fix: remove unit test (dont do)
---------
Signed-off-by: Truman Gao <106889354+tdgao@users.noreply.github.com>
Co-authored-by: Calum H. (IMB11) <contact@cal.engineer>
* feat(labrinth): project disclosures model
* feat(labrinth): project disclosures database model
* feat(labrinth): project disclosures get endpoint
* feat(labrinth): censor user ids if set by moderator
* feat(labrinth): wrap disclosures in struct
* feat(labrinth): edit project disclosures endpoint
* style(labrinth): cargo fmt
* style(labrinth): fix typo
* feat(labrinth): add fields for ai content disclosure
* fix(labrinth): field typo
* chore(labrinth): update query cache
* feat(labrinth): index disclosures in search
* refactor(labrinth): use enum instead of bools
* feat(labrinth): trigger incremental index on disclosure change
* feat(labrinth): change archived status to disclosure
* feat(labrinth): use disclosure for archival status
* fix(labrinth): error type for deserialization
* fix(labrinth): migration timestamp
* fix(labrinth): add disclosures to elasticsearch schema
* fix(labrinth): don't remove archival disclosure when changing status via v3 api
* feat(labrinth): derive str for ai usages and telemtry consent
* feat(labrinth): include ai usages and telemetry consent in disclosure types
* refactor(labrinth): move disclosure parsing to document creation
* fix(labrinth): prevent removing moderator added archival disclosures
* fix(labrinth): dedupe ai usages
* fix(labrinth): auth logic on archived disclosure removal
* feat(labrinth): add interactions field
* style(labrinth): cargo fmt
* feat(labrinth): soft delete disclosures
* feat(labrinth): return soft-deleted disclosures
* fix(labrinth): update disclosure on removal
---------
Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
* draft: rejected projects go to ghost on delete
* don't free slug
* fix sqlx
* free slugs but different
* add auto reject for processing items given to ghost, as well as send thread messages with a little info on who it came from
* better default state handling
* make next stage button work for going to next project
* fix skill issue
* actually fix initial values this time,
make single line inputs with varying lengths (text input and dropdown) use their widest possible length instead of whatever the hell they used to be
* loaders in progress
* loaders and versions test (probably dont use them as the messages suck and idrk what they should do quick fix/message wise)
* WIP the wip
* good enough for now slug taken improvements
* trim all those extra newlines
* viewedness
* batch prefetch queue + technically slightly faster checklist init
* show all valid alternative project types regardless of current project type
* Hide moderation permissions stage when it should be, and I'm sure this won't cause any issues
* Hide moderation permissions stage when it should be, and I'm sure this won't cause any issues
* gimme them versions
* better moderation permission stage shown check?
* betterer moderation permission stage shown check?
* bettererer moderation permission stage shown check? + also began deleting legacy checklist types
* fix certain stages being able to be considered viewed before being viewed
* more removals + i forgot to remove an import last commit
* changed nothing™️
* remove severities + bandaid post-approval message priorities + dependencies
* fix message preview tooltips
* next stage = next project when done
* insufficient description custom fix
* fix that thing coolbot told me was broken I forgot what it was oops
* oh there was a second bug there
* make alternate versions and incorrect project type required cuz they are
* re-navigate button also damn that's a lot of other stuff that pnpm fix... fixed?
* you cant just quick fix a slug into a taken one
* maybe lets not just try and set a slug to something entirely invalid?
* what if we just didn't drop ur queue :smart:
* more queue upgrades
* tweaks
* I love unbreaking things
* un-nuked renavigate button
* prepr
* prepr worked this time i think
* undo more mistakes
* i love intellij refactoring
* ok i think we're good
* Add type safety and validation for moderation settings
* Add ability for moderators to adjust page layout for discover, project, moderation pages
Primarily for changes to have more tooling present without overlapping important info
A few components defined their own "Cancel", "Close", "Clear" and
"Success" descriptors when commonMessages already has them. Swapped
them over and removed the old ones.
Locale files come from intl:prune-local dropping the now-orphaned
strings across every language.
Fixes#6601.
Clicking any game version tag on the versions tab passed the release's
entire game_versions array to toggleFilters, so clicking 26.x (or even a
single version tag) selected every version the release supports. On
projects supporting many versions this also froze the page for seconds:
toggleFilters awaited a needlessly-async toggleFilter per version, which
let Vue flush a full re-render between every iteration (~90 flushes on
the reported project).
- formatVersionsForDisplay's grouping now also returns the member
versions per displayed range (getVersionGroupsForDisplay), so version
tags toggle exactly the versions they represent
- toggleFilters applies the whole batch synchronously in one update, and
selects the missing versions unless all are already selected (instead
of blindly inverting each one)
Co-authored-by: Claude <noreply@anthropic.com>
* fix: show "inspecting modpack"
Shows when determining external files for modpacks which have many overrides/over gb of content files.
* fix: better progress indicator
* (do not merge) search test branch
* perf
* fix up search pagination
* more parity and perf work
* expand what parity does
* fix author query
* approach parity even without explicit parity enabled
* remove old parity code
* fix shear
* fix
* fmt
* cleaup app layout, add missing translations to it
* remove feature flag in backend
* add app-messages
* clean up nav slightly
* allow more than 3 quick instances
* make quick instances resizable
* feat: moderation settings
* chore: move moderation specific feature flag to settings
* feat: force open collapsed regions if opened in new tab
* chore: remove unused field
* chore: run prepr
* feat(labrinth): user blocking
still wip, nothing is hooked up
* style(labrinth): cargo fmt
* refactor(labrinth): move block/unblock routes to public api
* feat(labrinth): block friend requests if blocked
* feat(labrinth): remove friend/request on block
* feat(labrinth): get blocked users endpoint
* feat(ux): Add letter counters to the bio and username
the username letter counter only appears after the 30th letter to not encourage people to have long usernames for no reason
* feat(ux): Added "Expand" button to bio on mobile
* Revert "feat(ux): Added "Expand" button to bio on mobile"
This reverts commit f7e036002a.
* prepr
---------
Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
* chore: switch to namespace runners
* fix: sudo
* fix: move to medium runners for frontend
* chore: bump all actions, remove old turbo cache
* fix: bump frontend runners to large
* fix: wrangler
* fix: wrangler version, again
* chore: namespace windows and mac runners
* fix: revert tombi bump
* chore: tweak caching
* fix: remove drilling actions down iframes
* refactor: split up custom popup logic, trim it down a lot
* fix: bring back TCF useractioncomplete and USP/GPP sectionChange event listeners, and only using dom observer as the fallback
* remove open devtools
* format
* harden CPM fallbacks for unknown layouts
* consolidate timeouts
* refactor: rename functions to make sense
* fix: sidebar closed on launch does not properly set state
* feat(labrinth): shared instance report type
* style(labrinth): cargo fmt
* feat(labrinth): check that instance exists when reporting
* style(labrinth): cleanup unused import
* feat(labrinth): store version id for shared instance reports
* style(labrinth): satisfy clippy
* fix(labrinth): use string id instead of int
* fix: branch url in comment
* fix: use sub not small
* de-hardcode siteUrl
* simplify request hook
* nuxt server plugin?
* pull directly from worker + 2 tables
* debug
* undebug
* single preview worker?
* use pr number instead of name because pr names tend to be long + can be changed
* prepr
---------
Co-authored-by: Calum H. (IMB11) <contact@cal.engineer>
Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
* ffix: preserve literal '+' in deep link URI thru API call
* chore: check for missing projects during installs
* chore: remove accidental test files and quote error ID
* fix rustfmt formatting for the change
* feat: minecraft required modal
* pnpm prepr
* refactor: move steve to /assets and turn it to webp
* refactor: rename to steve look up left
---------
Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
* feat: greatly improve the jankiness
* fix: US variant of consent popup
* fix: US cmp in website and styles for US cmp
* remove incognito
* fix: flashing box in top left
---------
Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
* feat: update org projects page
* feat: refresh the transfer projects to org modal
* fix: allow full checkbox cell to be clicked
* feat: update org link to go to org page
* prepr
---------
Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
* Rule 1.x, 3.2 and 3.3x support
* reorganize
* Kinda Jank dynamic list stuff that should probably be implemented better but its 1:30 am
* Checklist Stage Title
* Make Stage Title Good
* Rule 1.x, 3.2 and 3.3x support
* reorganize
* Kinda Jank dynamic list stuff that should probably be implemented better but its 1:30 am
* Checklist Stage Title
* Make Stage Title Good
* oops i forgot 3.1
* Insufficient description improvement test
* "i forgor" checklist tooltips tooltips (kinda jank but they work)
update to latest
* only use indexedDb for moderation storage, localStorage forces a bunch of cringe
* store moderation stuff separately + compact checklist stuff
* give stages actual titles + rename what was previously called titles to hints
* Title & Slug, Summary Description, Links, License, Gallery, Versions and Reupload migrated to new system™️
* put stageoptions before nodes
* do state and variablse in tooltips
* checklist fully migrated to new system, not much new has been added (yet)
* forgot to only do modpack permissions for modpacks
* Idk why I wasn't just mutating the builder
* actual node type hierarchy + action abstraction + improve message/text handling
* dropdown + "functional" quick fixes
* dropdown + "functional" quick fixes
* Allow moderators to suggest correct environment.
* remove vestigial function
* Prioritization™️
* quickest fixes in the west
* start of metadata stage + optimize checklist parsing + a couple of qol features
* futureproof™️ environment metadata + just give me project context everywhere
* tidy up after today's refactoring
* tidy up after tidying up after today's refactoring
* move loaders to metadata (from versions)
* better required display + vueify + reorganize messages + tag quick fixes + todo
* fix log spam + concat md
* more bugs
* nested state access
* update description stage, add showcase clarity
* Fix links stage mostly, and tweak metadata stage.
* fix links lag + actions on stages
* setup links bonus buttons
* Change stage order
* Update rules stage
* Move conditional stages to the top where they belong.
* fix some metadata stuff
* fix stage selector
* don't show non-english buttons on servers without english support.
* prepr
* stop linter from trying to break my markdown
* fix: some issues
* fix: lint
* not sure why but link's links weren't links
* fix quick fixes (again) (idk how they keep breaking)
* make messages only actually count as messages if they actually have content
* rename horror button to spoilers button
* Update links name to match the links settings
* re-review stage
* unbreak stage selector
* passing off version stage fixing.
* actually fix the stage selector this time
* fix showcase clarity msg
* redirect when checklist updates slug
fix initial stage not being first if first stage is only shown under certain conditions
move to a consistent naming scheme
* redirect when checklist updates slug
fix initial stage not being first if first stage is only shown under certain conditions
move to a consistent naming scheme
* ok maybe lets use kebab
* move custom description advice stage to first button.
* temp priority on corrections applied
* make metadata page go to non setting versions page
* links stage bonus buttons, src required flag, show link value in msgs, fix msg groupings.
* update re-review button
* reupload stage navigates to project Description.
* fix: link stage using page context too late
* chore: run prepr
* fix(ci): tell typo check to ignore moderation utils
* fix: pr comment if storybook fails
* make complex nodes less complex (for the most part)
fix re-review stage shown condition
new fancy message collection system
all buttons that contribute to messages now have relevant tooltips
don't store default values in checklist db
* make complex nodes less complex (for the most part)
fix re-review stage shown condition
new fancy message collection system
all buttons that contribute to messages now have relevant tooltips
don't store default values in checklist db
* maybe fixed markdown escaping?
* tweak re-review wording.
* Update license stage handling and info
* add mixed option back for env info
* fix: formatEnvironments
fix: formatEnvironments
* update metadata environment group shown
* fix: status alert priority
* fix: display suggested slug in slug/misused message
* actually navigate when we change project slug
* ok like redirect but like don't lose state when slug changes :smart:
* make checklist reset button reset only current stage if there's modifications to it instead of full checklist
* fix versions stage messages not working
* fix donation links not being in a column
* I think slug stuff is working?
also like actually 100% garunteed markdown escaping works now
* prepr
* pseudo stages no longer interact with non-pseudo stages at all
also query projects better I think?
fix repetitive message spam in links stage
* apply quick fixes before refreshing page
* differentiate reset and return to start
* remove random empty lines in some situations
* better inaccurate slug message
* slug correction input reset button resets to current slug again instead of auto
* better keybind navigation
* incorrect environment message tweak
* use environment name(s) in checklist info
* prepr
---------
Signed-off-by: Prospector <6166773+Prospector@users.noreply.github.com>
Co-authored-by: chyzman <chyzalt@gmail.com>
Co-authored-by: Calum H. (IMB11) <contact@cal.engineer>
Co-authored-by: Gravy Boat <gravy@thatgravyboat.tech>
Co-authored-by: Michael H. <michael@iptables.sh>
Co-authored-by: chyz <32403637+chyzman@users.noreply.github.com>
Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
* feat(labrinth): encode/decode redis values with postcard, add version in namespaces
* chore(labrinth): split cache ex special cases without version
* chore(labrinth): simplify get_many
* fix: tombi
* feat(labrinth): compression support
* chore(labrinth): cleanup redis ser/de
* fix(labrinth): use get_deserialized in tests
* feat: improved warning modals
* fix: qa
* feat: install to play and update to play changes
* fix: dont warn for server projects as already reviewed
* fix: lint
* fix(labrinth): return columns used in filters
fixesmodrinth/code#6607
* chore(labrinth): sqlx query data update
* don't implicitly breakdown when filtering by a metric
* fix docs
---------
Co-authored-by: aecsocket <43144841+aecsocket@users.noreply.github.com>
* fix: tech card not updating project status correctly
* feat: pull out quick actions into buttons for reports
* fix: reports duplicating in the reports queue
* feat: allow for moderation keybinds to be rebindable
* run prepr
* wip
* ui edits
* better logic for syncing tech review state in a single centralized place
* never automatically finish a tech review report
* fix css
* fix clippy
* prepr
* update download with modrinth app button
* feat: implement compatible version card and update download dependency buttons
* fix: download multiple files immediately triggers blocking
* refactor: implement download modal provider
* fix: duplicate dependencies and style update for dependecy section
* feat: improve loading flow when there are dependencies, to not show compatible version until all data is loaded
* fix: fallback to download compatible version if dependency lookup fails
* feat: implement selecting compatible versions when there are multiple
* fix: update dependencies version table to any compatible version
* fix: version showing before depedencies loaded
* feat: add platform options sort order
* pnpm prepr
* feat: keep previous result showing until new one loads in when change compatibility options
* feat: implement better handling for showing required/recommended resource packs with additional files
* pnpm prepr
* fix: required resource pack not showing footer actions
* fix: download with deps is downloading all files
* feat: add joined button for downloading with recommended
* feat: add admontion for dependency that has resource pack to download
* pnpm prepr
* fix: lint
* feat: append "-EXTRACT_ME.zip" to zipped project with dependencies
* fix: date published capitalization
* pnpm prepr
---------
Co-authored-by: Prospector <6166773+Prospector@users.noreply.github.com>
* global detail verdicts system
* global traces frontend
* split global routes into own mod
* tweak migration to only do no-key check at app level
* prepr
* Generate different Daedalus Quilt templates for 26.x/non-26.x
* add docs
* wip: daedalus version groups
* wip: app-side logic
* finish app-side logic, fix certain libs not included
* lints
* fmt
* fmt
* Split frontend changes out of Daedalus branch
description:Add an API endpoint module to packages/api-client from an OpenAPI schema. Use for new backend endpoints, API client modules, or tasks that provide an OpenAPI schema.
---
# Add an API Module
Read the applicable `AGENTS.md` files before you edit code.
Read [the API module standard](../../../standards/frontend/ADDING_API_MODULES.md) in full.
1. Identify the OpenAPI schema from the request. If more than one schema is possible, ask the user to select one.
2. Read the schema. Identify each endpoint, HTTP method, request type, response type, and path parameter.
3. Get the service and version from the URL prefix. For example, map `/v3/projects` to `labrinth/v3/`.
4. Define the API types in `types.ts`. Make each type match the schema exactly.
5. Do not change, rename, or remove API fields.
6. Make a module class that extends `AbstractModule`. Implement each endpoint with `this.client.request()` or `this.client.upload()`.
7. Use the request-option pattern from the standard. Do not call `$fetch`, `fetch`, or another HTTP client directly.
8. Add the module to `MODULE_REGISTRY` so the client can instantiate it.
9. Export new service types from the applicable barrel `index.ts`.
10. Check the module paths, registry key, public type exports, and endpoint types.
Run only the checks that the user or the applicable `AGENTS.md` permits.
description:Convert a page to the shared Modrinth page system for the website and desktop app. Use for shared layouts, wrapped layouts, or platform dependency-injection contracts.
---
# Convert a Cross-Platform Page
Read the applicable `AGENTS.md` files before you edit code.
description:Convert hard-coded English text in changed Vue components to the @modrinth/ui localization system. Use for an i18n pass, untranslated-string review, pull request, or component migration.
---
# Do an Internationalization Pass
Read the applicable `AGENTS.md` files before you edit code.
Read [the internationalization standard](../../../standards/frontend/INTERNATIONALIZATION.md) in full.
1. Identify the scope from the request.
2. For a pull request, use `gh pr diff <number>` to identify changed files.
3. For a file path, inspect that file.
4. When the request gives no scope, inspect the current uncommitted diff.
5. Limit the pass to changed `.vue` files.
6. Find user-visible text in templates and scripts.
description:Review the latest packages/blog/changelog.ts entry against the Modrinth changelog standard. Use before a pull request or when asked to review or lint a changelog entry.
---
# Review a Changelog Entry
Read [the changelog standard](../../../standards/maintaining/CHANGELOG.md) in full before the review.
1. Open `packages/blog/changelog.ts`.
2. Find the first entry in the `VERSIONS` array.
3. If the request names `web`, `hosting`, or `app`, review the latest entry for that product.
4. Otherwise, review the latest entry and all adjacent entries with the same date.
Check the entry structure:
-`date` contains a valid ISO 8601 timestamp.
-`product` is `web`, `hosting`, or `app`.
- An `app` entry has a `version` value.
- A `web` or `hosting` entry does not have a `version` value.
- Standard headings are `## Added`, `## Changed`, `## Fixed`, and `## Security`.
- A featured release can use a linked heading.
- Flag the legacy `## Improvements` heading.
Check each bullet:
- The voice and tense agree with the section.
- The first verb agrees with the section.
- The bullet describes user-visible behavior, not implementation.
- The bullet identifies the applicable page, tab, modal, or feature.
- The bullet contains one sentence, uses sentence case, and ends with a period.
- Product and UI names use the public labels.
- The bullet does not contain filler, vague intensifiers, apologies, or internal references.
- The bullet is not a duplicate detail of a larger listed change.
Group findings by entry. For each finding, show the original bullet and a proposed replacement.
If the entry has no findings, state this result. Do not edit the changelog unless the user asks you to apply fixes.
When the user asks for fixes, preserve tab indentation and template-literal formatting.
description:Convert Vue server-state code to TanStack Query. Use for useQuery, useMutation, cache invalidation, optimistic updates, or replacement of useAsyncData and manual ref patterns.
---
# Convert Data Code to TanStack Query
Read the applicable `AGENTS.md` files before you edit code.
Read [the TanStack Query standard](../../../standards/frontend/FETCHING_DATA.md) in full.
1. Identify the target file from the request.
2. Find `useAsyncData`, `useFetch`, manual API refs, and fetch calls in `onMounted`.
3. Identify mutations that use manual loading, error, or result refs.
For queries:
1. Replace manual fetch logic with `useQuery`.
2. Get `api-client` with `injectModrinthClient()`.
3. Use a hierarchical query key with the resource, qualifier, and parameters.
4. Use a computed query key for reactive parameters.
5. Use a computed `enabled` option when the query depends on other data.
6. Use a shared query-option factory when multiple components use the query.
For mutations:
1. Replace manual mutation state with `useMutation`.
2. Invalidate or update related query data after success.
3. Use an optimistic update only when the UI needs an immediate response.
4. Cancel the applicable query and save its prior data before an optimistic update.
5. Restore the prior data after an error. Invalidate the query after settlement.
Remove manual loading and error refs that TanStack Query replaces. Remove obsolete `onMounted` fetch calls.
Keep Nuxt SSR behavior. Match route-shell prefetch options when `ReadyTransition` and `useReadyState` depend on the query.
Check query keys, invalidation prefixes, reactive values, and rollback data.
Run only the checks that the user or the applicable `AGENTS.md` permits.
description:Add a new API endpoint module to packages/api-client from an OpenAPI schema. Use when adding new backend endpoints, creating API client modules, or when an openapi.yml is provided.
argument-hint:<path-to-openapi.yml>
---
Refer to the standard: @standards/frontend/ADDING_API_MODULES.md
## Steps
1.**Read the OpenAPI schema** at `$ARGUMENTS` — identify the endpoints, request/response shapes, and path parameters.
2.**Read the standard above** for naming conventions, type rules, and the module registration pattern.
3.**Determine the service and version** — the URL path prefix tells you which service directory and version namespace to use (e.g. `/v3/projects` → `labrinth/v3/`).
4.**Define types in `types.ts`** — types must match the API response 1:1. Use the OpenAPI schema as the source of truth. Do not reshape or rename fields.
5.**Create the module class** — extend `BaseModule`, implement each endpoint as a method. Use the correct HTTP verb and request options pattern from the standard.
6.**Register in `MODULE_REGISTRY`** — add the module entry so it's auto-instantiated on the client.
7.**Export types** from the service's barrel `index.ts`.
8.**Verify** — check that the module compiles and the types are accessible from `@modrinth/api-client`.
description:Convert a page to the cross-platform page system so it works in both the website and the desktop app. Use when moving a page into packages/ui/src/layouts/, creating shared or wrapped layouts, or setting up DI contracts for platform abstraction.
argument-hint:<path-to-page>
---
Refer to the standards: @standards/frontend/CROSS_PLATFORM_PAGES.md and @standards/frontend/DEPENDENCY_INJECTION.md
## Steps
1.**Read the target page** at `$ARGUMENTS` and understand its data sources, mutations, and navigation.
2.**Read the standards above** to understand the shared vs wrapped distinction and the DI pattern.
3.**Decide the category:**
- **Wrapped** (`layouts/wrapped/`) — if the page uses the same API source on both platforms (e.g. web requests, not Tauri plugins). Just move the page component into `packages/ui` and import it from both frontends.
- **Shared** (`layouts/shared/`) — if the page has different data-fetching logic per platform (e.g. website uses `api-client`, app uses Tauri `invoke`). Requires a DI contract.
4.**For shared layouts:**
- Define a DI contract interface in `providers/` capturing all platform-specific operations.
- Create the layout component that injects the context and handles all UI logic.
- Extract reusable stateful logic (search, filtering, selection) into `composables/`.
- Implement the contract separately in each frontend (`apps/frontend/`, `apps/app-frontend/`).
5.**For wrapped pages:**
- Move the page component into `packages/ui/src/layouts/wrapped/` matching the route structure.
- Replace any platform-specific imports with shared utilities.
- Import and render the wrapped page from both frontends as a simple component.
- If the layout uses TanStack Query for initial route paint with `ReadyTransition` / `useReadyState`, each platform route shell must call `ensureQueryData` for those queries with matching keys and fetchers — see **Platform route shells: prefetch with `ensureQueryData`** in `standards/frontend/CROSS_PLATFORM_PAGES.md`.
6.**Verify** the page renders correctly by checking for missing imports and that all DI contracts are satisfied.
description:Use the Figma MCP server to translate a Figma design into a Vue page or component layout. Use when the user provides a Figma URL, asks to implement a design, or wants to draft a page layout from Figma.
argument-hint:<figma-url>
---
Refer to the standard: @standards/frontend/FIGMA_MCP_USAGE.md
Also read @packages/ui/CLAUDE.md for color token mapping and component conventions.
## Steps
1.**Parse the Figma URL** from `$ARGUMENTS` — extract the `fileKey` and `nodeId`. Convert `-` to `:` in the node ID.
2.**Read the standards above** for the available tools, adaptation rules, and color usage.
3.**Call `get_design_context`** with the extracted `nodeId` and `fileKey`, using `clientLanguages: "typescript,html,css"` and `clientFrameworks: "vue"`. This is always the first tool to call.
5.**Adapt the output to the Modrinth codebase:**
- Map Figma color variables to `surface-*` / `text-*` tokens — never use Figma's aliased names directly.
- Check `packages/ui/src/components/` for existing components that match elements in the design (buttons, cards, modals, inputs, etc.).
- Check `packages/assets/styles/variables.scss` for tokens not exposed in Figma.
- Match spacing values exactly from the design.
6.**Use `get_screenshot`** if you need a closer visual reference of specific nodes.
7.**Use `get_variable_defs`** to verify which design tokens are applied to ambiguous elements.
8.**Build the component** as a Vue SFC using Tailwind classes and the project's existing component library.
description:Perform an i18n localization pass on changed files or a pull request, converting hard-coded English strings to the @modrinth/ui i18n system. Use when internationalizing a set of changes, reviewing a PR for untranslated strings, or converting a specific component.
argument-hint:[file-path-or-pr-number]
---
Refer to the standard: @standards/frontend/INTERNATIONALIZATION.md
## Steps
1.**Identify the scope of changes:**
- If `$ARGUMENTS` is a PR number, run `gh pr diff $ARGUMENTS` to get the changed files.
- If `$ARGUMENTS` is a file path, use that directly.
- If no argument, check `git diff` for uncommitted changes.
2.**Read the standard above** for the message definition pattern, ICU format rules, and `IntlFormatted` usage.
3.**Filter to Vue SFCs** — only `.vue` files need i18n passes. Skip non-component files.
description:Review the latest changelog entry in packages/blog/changelog.ts against the project's changelog style guide and flag bullets that need rewriting. Use when checking a freshly added changelog entry before opening a PR, or when the user asks to review/lint the latest changelog.
argument-hint:[product?]
---
Refer to the standard: @standards/maintaining/CHANGELOG.md
## Steps
1.**Locate the latest entry:**
- Open `packages/blog/changelog.ts`.
- The latest entries are at the top of the `VERSIONS` array.
- If `$ARGUMENTS` specifies a product (`web`, `hosting`, `app`), review the most recent entry for that product. Otherwise, review the most recent entry overall, plus any sibling entries sharing the same `date` (coordinated releases ship together).
2.**Read the standard above** in full before reviewing. The bullet rules, section/verb agreement, and "Don't" list are the source of truth.
3.**Check the entry shell:**
-`date` is a valid ISO 8601 timestamp.
-`product` is one of `web`, `hosting`, `app`.
-`version` is present for `app` entries and omitted for `web`/`hosting`.
- Section headings use `## Added`, `## Changed`, `## Fixed`, `## Security` (or a featured-release linked heading). Flag legacy `## Improvements`.
4.**Review each bullet** against the standard. For each bullet, check:
- Voice/tense matches the section heading.
- Opening verb agrees with its section.
- Describes observable behavior, not implementation.
- Specific enough to identify the surface (names the tab/page/modal).
- One sentence, ends with a period, sentence case.
- No filler ("issue with", "issue where", "various", "some"), no vague intensifiers, no apologies, no PR/commit references (unless crediting a third-party contributor with a linked GitHub profile).
- Not a duplicate sub-fix of a bigger change already listed.
5.**Report findings** as a short list grouped by entry. For each problem bullet, show the original line and a suggested rewrite. If the entry is clean, say so explicitly. Do not edit the file unless the user asks - this skill is a review pass, not a rewrite pass.
6.**If the user then asks to apply fixes**, edit `packages/blog/changelog.ts` directly using the suggested rewrites. Preserve tab indentation and template literal formatting.
description:Convert a page or component from useAsyncData/manual ref patterns to TanStack Query for server state management. Use when migrating data fetching to useQuery/useMutation, adding cache invalidation, or replacing useAsyncData with TanStack Query.
argument-hint:<path-to-file>
---
Refer to the standard: @standards/frontend/FETCHING_DATA.md
## Steps
1.**Read the target file** at `$ARGUMENTS` and identify all data-fetching patterns: `useAsyncData`, `useFetch`, manual `ref()` + `await`, or `onMounted` fetch calls.
2.**Read the standard above** for the query/mutation patterns, query key conventions, and optimistic update approach.
3.**Convert queries:**
- Replace `useAsyncData` / `useFetch` / manual fetches with `useQuery`.
- Use the `api-client` via `injectModrinthClient()` for the `queryFn`.
- Design query keys with the `['resource', 'version', ...params]` convention.
- Use `computed` query keys for reactive parameters.
- Use the `enabled` option for conditional queries that depend on other data.
4.**Convert mutations:**
- Replace manual `try/catch` + `ref` patterns with `useMutation`.
- Add `onSuccess` handlers that invalidate or update related query caches.
- Consider optimistic updates for UI-critical mutations (follow the pattern in the standard).
5.**Clean up:**
- Remove manual loading/error `ref()`s that are now handled by TanStack Query's return values (`isPending`, `isError`, `error`).
- Remove manual `onMounted` fetch calls.
- Ensure SSR compatibility — queries in Nuxt pages are automatically awaited during SSR.
6.**Verify** the page still renders correctly and that cache invalidation triggers re-fetches where expected.
This is the Modrinth monorepo — it contains all Modrinth projects, both frontend and backend. When entering a project, either to edit or analyse, you should read its AGENTS.md.
Run these from the **root** folder before opening a pull request - do not run these after each prompt the user gives you, only run when asked, ask the user a question if they want to run it if the user indicates that they are about to create a pull request.
- **Website:** `pnpm prepr:frontend:web`
- **App frontend:** `pnpm prepr:frontend:app`
- **Frontend libs:** `pnpm prepr:frontend:lib`
- **All frontend (app+web):** `pnpm prepr`
- **Labrinth (backend):** See `apps/labrinth/AGENTS.md`
The website and app `prepr` commands
## Dev Commands
- **Website:** `pnpm web:dev` (copy `.env` template in `apps/frontend/` first)
- **App:** `pnpm app:dev` (copy `.env` template in `packages/app-lib/` first)
- **Storybook (packages/ui):** `pnpm storybook`
## Project-Specific Instructions
Each project may have its own file with detailed instructions:
- [`apps/labrinth/AGENTS.md`](apps/labrinth/AGENTS.md) — Backend API
- DO NOT use "heading" comments like: `=== Helper methods ===`.
- Use doc comments, but avoid inline comments unless ABSOLUTELY necessary for clarity. Code should aim to be self documenting!
## Bash Guidelines
### Output handling
- DO NOT pipe output through `head`, `tail`, `less`, or `more`
- NEVER use `| head -n X` or `| tail -n X` to truncate output
- IMPORTANT: Run commands directly without pipes when possible
- IMPORTANT: If you need to limit output, use command-specific flags (e.g. `git log -n 10` instead of `git log | head -10`)
- ALWAYS read the full output — never pipe through filters
### General
- Do not create new non-source code files (e.g. Bash scripts, SQL scripts) unless explicitly prompted to
- For Frontend, when doing lint checks, only use the `prepr` commands, do not use `typecheck` or `tsc` etc.
- Types in `@modrinth/utils` are considered highly outdated, if a component needs them, check if you can switch said component to use types from `packages/api-client`
- When provided problems, do not say "I didn't introduce these problems" (shifting the blame/effort) - just fix them.
This is the Modrinth monorepo — it contains all Modrinth projects, both frontend and backend. When entering a project, either to edit or analyse, you should read it's CLAUDE.md.
Run these from the **root** folder before opening a pull request - do not run these after each prompt the user gives you, only run when asked, ask the user a question if they want to run it if the user indicates that they are about to create a pull request.
- **Website:** `pnpm prepr:frontend:web`
- **App frontend:** `pnpm prepr:frontend:app`
- **Frontend libs:** `pnpm prepr:frontend:lib`
- **All frontend (app+web):** `pnpm prepr`
- **Labrinth (backend):** See `apps/labrinth/AGENTS.md`
The website and app `prepr` commands
## Dev Commands
- **Website:** `pnpm web:dev` (copy `.env` template in `apps/frontend/` first)
- **App:** `pnpm app:dev` (copy `.env` template in `packages/app-lib/` first)
- **Storybook (packages/ui):** `pnpm storybook`
## Project-Specific Instructions
Each project may have its own file with detailed instructions:
- [`apps/labrinth/AGENTS.md`](apps/labrinth/AGENTS.md) — Backend API
- DO NOT use "heading" comments like: `=== Helper methods ===`.
- Use doc comments, but avoid inline comments unless ABSOLUTELY necessary for clarity. Code should aim to be self documenting!
## Bash Guidelines
### Output handling
- DO NOT pipe output through `head`, `tail`, `less`, or `more`
- NEVER use `| head -n X` or `| tail -n X` to truncate output
- IMPORTANT: Run commands directly without pipes when possible
- IMPORTANT: If you need to limit output, use command-specific flags (e.g. `git log -n 10` instead of `git log | head -10`)
- ALWAYS read the full output — never pipe through filters
### General
- Do not create new non-source code files (e.g. Bash scripts, SQL scripts) unless explicitly prompted to
- For Frontend, when doing lint checks, only use the `prepr` commands, do not use `typecheck` or `tsc` etc.
- Types in `@modrinth/utils` are considered highly outdated, if a component needs them, check if you can switch said component to use types from `packages/api-client`
- When provided problems, do not say "I didn't introduce these problems" (shifting the blame/effort) - just fix them.
## Edit Tool - Whitespace Handling (CLAUDE ONLY)
The Read tool uses `→` to mark where line numbers end and file content begins.
**Rule:** Copy the EXACT whitespace that appears after the `→` marker.
- Whatever appears between `→` and the code text is what's actually in the file
- That whitespace must be used EXACTLY in Edit tool's old_string
- Don't count arrows, don't interpret - just copy what's after the `→`
**Example:**
14→ private byte tag;
For Edit, use: ` private byte tag;` (copy everything after →, including the two tabs)
**If Edit fails:** Stop and explain the problem. Do not attempt sed/awk/bash workarounds.
**IMPORTANT**: Trust the Read tool output. Copy what's after `→` into Edit immediately. DO NOT verify with sed/od/grep first - that's wasting time and the instructions already tell you to stop if Edit fails, not to pre-verify.

Welcome to the Modrinth Monorepo, the primary codebase for the Modrinth web interface and app. It contains  lines of code and has  contributors!
Welcome to the Modrinth Monorepo, the primary codebase for the Modrinth web interface and app. It contains  lines of code and has  contributors!
If you're not a developer and you've stumbled upon this repository, you can access the web interface on the [Modrinth website](https://modrinth.com) and download the latest release of the app [here](https://modrinth.com/app).
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.