From bca467a634393a93560ec524a5e1727a63fdbed3 Mon Sep 17 00:00:00 2001
From: Prospector <6166773+Prospector@users.noreply.github.com>
Date: Wed, 9 Jul 2025 15:27:59 -0700
Subject: [PATCH 01/62] Add coventry europe region support (#3956)
* Add coventry europe region support, rename germany EU location to central europe
* extract messages
* extract messages again
---
apps/frontend/src/locales/en-US/index.json | 6 +++---
.../src/components/billing/ServersPurchase1Region.vue | 2 +-
packages/ui/src/locales/en-US/index.json | 9 ++++++---
packages/ui/src/utils/regions.ts | 10 +++++-----
4 files changed, 15 insertions(+), 12 deletions(-)
diff --git a/apps/frontend/src/locales/en-US/index.json b/apps/frontend/src/locales/en-US/index.json
index 21580977..828e3ffd 100644
--- a/apps/frontend/src/locales/en-US/index.json
+++ b/apps/frontend/src/locales/en-US/index.json
@@ -383,15 +383,15 @@
"layout.footer.about": {
"message": "About"
},
- "layout.footer.about.news": {
- "message": "News"
- },
"layout.footer.about.careers": {
"message": "Careers"
},
"layout.footer.about.changelog": {
"message": "Changelog"
},
+ "layout.footer.about.news": {
+ "message": "News"
+ },
"layout.footer.about.rewards-program": {
"message": "Rewards Program"
},
diff --git a/packages/ui/src/components/billing/ServersPurchase1Region.vue b/packages/ui/src/components/billing/ServersPurchase1Region.vue
index 3f2bdc59..4a1f2fc5 100644
--- a/packages/ui/src/components/billing/ServersPurchase1Region.vue
+++ b/packages/ui/src/components/billing/ServersPurchase1Region.vue
@@ -40,7 +40,7 @@ const selectedPrice = computed(() => {
return amount ? amount / monthsInInterval[props.interval] : undefined
})
-const regionOrder: string[] = ['us-vin', 'eu-lim']
+const regionOrder: string[] = ['us-vin', 'eu-cov', 'eu-lim']
const sortedRegions = computed(() => {
return props.regions.slice().sort((a, b) => {
diff --git a/packages/ui/src/locales/en-US/index.json b/packages/ui/src/locales/en-US/index.json
index e6088508..23e95048 100644
--- a/packages/ui/src/locales/en-US/index.json
+++ b/packages/ui/src/locales/en-US/index.json
@@ -512,12 +512,12 @@
"servers.purchase.step.review.title": {
"defaultMessage": "Review"
},
+ "servers.region.central-europe": {
+ "defaultMessage": "Central Europe"
+ },
"servers.region.custom.prompt": {
"defaultMessage": "How much RAM do you want your server to have?"
},
- "servers.region.europe": {
- "defaultMessage": "Europe"
- },
"servers.region.north-america": {
"defaultMessage": "North America"
},
@@ -527,6 +527,9 @@
"servers.region.region-unsupported": {
"defaultMessage": "Region not listed? Let us know where you'd like to see Modrinth Servers next!"
},
+ "servers.region.western-europe": {
+ "defaultMessage": "Western Europe"
+ },
"settings.account.title": {
"defaultMessage": "Account and security"
},
diff --git a/packages/ui/src/utils/regions.ts b/packages/ui/src/utils/regions.ts
index 5167a291..4401734f 100644
--- a/packages/ui/src/utils/regions.ts
+++ b/packages/ui/src/utils/regions.ts
@@ -6,11 +6,11 @@ export const regionOverrides = {
flag: 'https://flagcdn.com/us.svg',
},
'eu-lim': {
- name: defineMessage({ id: 'servers.region.europe', defaultMessage: 'Europe' }),
- flag: 'https://flagcdn.com/eu.svg',
+ name: defineMessage({ id: 'servers.region.central-europe', defaultMessage: 'Central Europe' }),
+ flag: 'https://flagcdn.com/de.svg',
},
- 'de-fra': {
- name: defineMessage({ id: 'servers.region.europe', defaultMessage: 'Europe' }),
- flag: 'https://flagcdn.com/eu.svg',
+ 'eu-cov': {
+ name: defineMessage({ id: 'servers.region.western-europe', defaultMessage: 'Western Europe' }),
+ flag: 'https://flagcdn.com/gb.svg',
},
} satisfies Record
--
2.49.1
From 72284997371c5341bb1e100bdab5d9dab261f551 Mon Sep 17 00:00:00 2001
From: tippfehlr
Date: Thu, 10 Jul 2025 00:30:11 +0200
Subject: [PATCH 02/62] fix(theseus-gui): fix sort/group by game version
(#1250)
* fix(theseus-gui): fix sort/group by game version
In the Library, game version 1.8.9 is sorted/grouped after 1.20 because
the default sorting sorts 2 < 8
therefore localeCompare(with numeric=true) is needed, it detects 8 < 20
and puts the versions in the correct order.
* lint
---------
Co-authored-by: Prospector
---
apps/app-frontend/src/components/GridDisplay.vue | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/apps/app-frontend/src/components/GridDisplay.vue b/apps/app-frontend/src/components/GridDisplay.vue
index 6e5dac5d..2ced2956 100644
--- a/apps/app-frontend/src/components/GridDisplay.vue
+++ b/apps/app-frontend/src/components/GridDisplay.vue
@@ -136,7 +136,7 @@ const filteredResults = computed(() => {
if (sortBy.value === 'Game version') {
instances.sort((a, b) => {
- return a.game_version.localeCompare(b.game_version)
+ return a.game_version.localeCompare(b.game_version, undefined, { numeric: true })
})
}
@@ -213,6 +213,17 @@ const filteredResults = computed(() => {
instanceMap.set(entry[0], entry[1])
})
}
+ // default sorting would do 1.20.4 < 1.8.9 because 2 < 8
+ // localeCompare with numeric=true puts 1.8.9 < 1.20.4 because 8 < 20
+ if (group.value === 'Game version') {
+ const sortedEntries = [...instanceMap.entries()].sort((a, b) => {
+ return a[0].localeCompare(b[0], undefined, { numeric: true })
+ })
+ instanceMap.clear()
+ sortedEntries.forEach((entry) => {
+ instanceMap.set(entry[0], entry[1])
+ })
+ }
return instanceMap
})
--
2.49.1
From fadf475f066a6b710cfa8ef13c2802e1db162a03 Mon Sep 17 00:00:00 2001
From: Erb3 <49862976+piprett@users.noreply.github.com>
Date: Thu, 10 Jul 2025 00:51:46 +0200
Subject: [PATCH 03/62] docs(frontend): add security.txt (#2252)
* feat: add security.txt
Security.txt is a well-known (pun intended) file among security researchers, so they don't have to go scavenging for your security information. More information is available on [securitytxt.org](https://securitytxt.org/).
I've set the following values:
- The email to contact with issues, `jai@modrinth.com`. This is the email stated in the security policy. If you wish to not include it here due to spam, you should also not have it as a `mailto` link in the security policy.
- Expiry is set to 2030. By this time Modrinth has become the biggest Minecraft mod distributor, and having expanded into other games. By this time they should also have updated this file.
- English is the preferred language
- The file is located at modrinth.com/.well-known/security.txt
- The security policy is at https://modrinth.com/legal/security
The following values have been left unset:
- PGP key, not sure where this would be located, if there is one
- Acknowledgments. Modrinth does currently not have a site for thanks
- Hiring, as it wants security-related positions
- CSAF, a Common Security Advisory Framework ?
* fix(docs): reduce security.txt expiry
This addresses a concern where the security.txt has a long expiration date. Someone could treat this as "use this until then", which we don't want since it's a long time. The specification recommends no longer than one year, as it is to mark as stale.
From the RFC:
> The "Expires" field indicates the date and time after which the data contained in the "security.txt" file is considered stale and should not be used (as per Section 5.3). The value of this field is formatted according to the Internet profiles of [ISO.8601-1] and [ISO.8601-2] as defined in [RFC3339]. It is RECOMMENDED that the value of this field be less than a year into the future to avoid staleness.
Signed-off-by: Erb3 <49862976+Erb3@users.noreply.github.com>
* fix(frontend): extend security.txt expiry
It takes so long to merge the PR :(
Signed-off-by: Erb3 <49862976+Erb3@users.noreply.github.com>
* docs(frontend) careers link in security.txt
Signed-off-by: Erb3 <49862976+Erb3@users.noreply.github.com>
---------
Signed-off-by: Erb3 <49862976+Erb3@users.noreply.github.com>
Co-authored-by: Erb3 <49862976+Erb3@users.noreply.github.com>
---
apps/frontend/src/public/.well-known/security.txt | 6 ++++++
1 file changed, 6 insertions(+)
create mode 100644 apps/frontend/src/public/.well-known/security.txt
diff --git a/apps/frontend/src/public/.well-known/security.txt b/apps/frontend/src/public/.well-known/security.txt
new file mode 100644
index 00000000..1e1a1626
--- /dev/null
+++ b/apps/frontend/src/public/.well-known/security.txt
@@ -0,0 +1,6 @@
+Contact: mailto:jai@modrinth.com
+Expires: 2025-12-31T00:00:00.000Z
+Preferred-Languages: en
+Canonical: https://modrinth.com/.well-known/security.txt
+Policy: https://modrinth.com/legal/security
+Hiring: https://careers.modrinth.com/
--
2.49.1
From cff3c72f9482e9a95a8990038d21c7e7c82b1ac7 Mon Sep 17 00:00:00 2001
From: ToBinio
Date: Thu, 10 Jul 2025 00:59:59 +0200
Subject: [PATCH 04/62] feat(theseus): add snapPoints for memory sliders
(#1275)
* feat: add snapPoints for memory sliders
* fix lint
* Reapply changes
* Hide snap point display when disabled
* fix unused imports
---------
Co-authored-by: Prospector
---
.../ui/instance_settings/JavaSettings.vue | 6 ++++--
.../ui/settings/DefaultInstanceSettings.vue | 7 ++++---
.../src/composables/useMemorySlider.js | 21 +++++++++++++++++++
packages/ui/src/components/base/Slider.vue | 2 +-
4 files changed, 30 insertions(+), 6 deletions(-)
create mode 100644 apps/app-frontend/src/composables/useMemorySlider.js
diff --git a/apps/app-frontend/src/components/ui/instance_settings/JavaSettings.vue b/apps/app-frontend/src/components/ui/instance_settings/JavaSettings.vue
index 7867791a..cd1b58d3 100644
--- a/apps/app-frontend/src/components/ui/instance_settings/JavaSettings.vue
+++ b/apps/app-frontend/src/components/ui/instance_settings/JavaSettings.vue
@@ -6,9 +6,9 @@ import { edit, get_optimal_jre_key } from '@/helpers/profile'
import { handleError } from '@/store/notifications'
import { defineMessages, useVIntl } from '@vintl/vintl'
import JavaSelector from '@/components/ui/JavaSelector.vue'
-import { get_max_memory } from '@/helpers/jre'
import { get } from '@/helpers/settings.ts'
import type { InstanceSettingsTabProps, AppSettings, MemorySettings } from '../../../helpers/types'
+import useMemorySlider from '@/composables/useMemorySlider'
const { formatMessage } = useVIntl()
@@ -34,7 +34,7 @@ const envVars = ref(
const overrideMemorySettings = ref(!!props.instance.memory)
const memory = ref(props.instance.memory ?? globalSettings.memory)
-const maxMemory = Math.floor((await get_max_memory().catch(handleError)) / 1024)
+const { maxMemory, snapPoints } = await useMemorySlider()
const editProfileObject = computed(() => {
const editProfile: {
@@ -156,6 +156,8 @@ const messages = defineMessages({
:min="512"
:max="maxMemory"
:step="64"
+ :snap-points="snapPoints"
+ :snap-range="512"
unit="MB"
/>