diff --git a/.editorconfig b/.editorconfig index 9fdd83cbb..5cf88b9be 100644 --- a/.editorconfig +++ b/.editorconfig @@ -3,7 +3,7 @@ root = true [*] charset = utf-8 -indent_style = "tab" +indent_style = tab end_of_line = lf insert_final_newline = true trim_trailing_whitespace = true @@ -12,7 +12,14 @@ max_line_length = 100 [*.md] indent_size = 2 max_line_length = off -trim_trailing_whitespace = false -[*.{json,yml,yaml}] +[*.toml] indent_size = 2 + +[*.json] +indent_size = 2 + +# YAML requires space indentation by spec +[*.{yml,yaml}] +indent_size = 2 +indent_style = space diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index 73f69e095..000000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,8 +0,0 @@ -# Default ignored files -/shelf/ -/workspace.xml -# Datasource local storage ignored files -/dataSources/ -/dataSources.local.xml -# Editor-based HTTP Client requests -/httpRequests/ diff --git a/.idea/code.iml b/.idea/code.iml deleted file mode 100644 index d44cfbf11..000000000 --- a/.idea/code.iml +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/discord.xml b/.idea/discord.xml deleted file mode 100644 index d8e956166..000000000 --- a/.idea/discord.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - \ No newline at end of file diff --git a/.idea/libraries/KotlinJavaRuntime.xml b/.idea/libraries/KotlinJavaRuntime.xml deleted file mode 100644 index 78d18789b..000000000 --- a/.idea/libraries/KotlinJavaRuntime.xml +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 23968dc67..000000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 7ddfc9ed4..000000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - \ No newline at end of file diff --git a/.prettierignore b/.prettierignore new file mode 100644 index 000000000..65f065745 --- /dev/null +++ b/.prettierignore @@ -0,0 +1,3 @@ +Cargo.lock +pnpm-lock.yaml +.github/**/*.png diff --git a/Cargo.toml b/Cargo.toml index b1057b705..5c73777c1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,13 +1,13 @@ [workspace] resolver = "2" members = [ - "apps/app", - "apps/app-playground", - "apps/daedalus_client", - "apps/labrinth", - "packages/app-lib", - "packages/ariadne", - "packages/daedalus", + "apps/app", + "apps/app-playground", + "apps/daedalus_client", + "apps/labrinth", + "packages/app-lib", + "packages/ariadne", + "packages/daedalus", ] [workspace.package] @@ -28,12 +28,10 @@ async_zip = "0.0.17" async-compression = { version = "0.4.27", default-features = false } async-recursion = "1.1.1" async-stripe = { version = "0.41.0", default-features = false, features = [ - "runtime-tokio-hyper-rustls", + "runtime-tokio-hyper-rustls", ] } async-trait = "0.1.88" -async-tungstenite = { version = "0.30.0", default-features = false, features = [ - "futures-03-sink", -] } +async-tungstenite = { version = "0.30.0", default-features = false, features = ["futures-03-sink"] } async-walkdir = "2.1.0" base64 = "0.22.1" bitflags = "2.9.1" @@ -69,10 +67,10 @@ hickory-resolver = "0.25.2" hmac = "0.12.1" hyper = "1.6.0" hyper-rustls = { version = "0.27.7", default-features = false, features = [ - "http1", - "native-tokio", - "ring", - "tls12", + "http1", + "native-tokio", + "ring", + "tls12", ] } hyper-util = "0.1.16" iana-time-zone = "0.1.63" @@ -83,13 +81,13 @@ itertools = "0.14.0" jemalloc_pprof = "0.8.1" json-patch = { version = "4.0.0", default-features = false } lettre = { version = "0.11.18", default-features = false, features = [ - "builder", - "hostname", - "pool", - "ring", - "rustls", - "rustls-native-certs", - "smtp-transport", + "builder", + "hostname", + "pool", + "ring", + "rustls", + "rustls-native-certs", + "smtp-transport", ] } maxminddb = "0.26.0" meilisearch-sdk = { version = "0.29.1", default-features = false } @@ -104,30 +102,27 @@ png = "0.17.16" prometheus = "0.14.0" quartz_nbt = "0.2.9" quick-xml = "0.38.1" -rand = "=0.8.5" # Locked on 0.8 until argon2 and p256 update to 0.9 -rand_chacha = "=0.3.1" # Locked on 0.3 until we can update rand to 0.9 +rand = "=0.8.5" # Locked on 0.8 until argon2 and p256 update to 0.9 +rand_chacha = "=0.3.1" # Locked on 0.3 until we can update rand to 0.9 redis = "0.32.4" regex = "1.11.1" reqwest = { version = "0.12.22", default-features = false } rgb = "0.8.52" -rust_decimal = { version = "1.37.2", features = [ - "serde-with-float", - "serde-with-str", -] } +rust_decimal = { version = "1.37.2", features = ["serde-with-float", "serde-with-str"] } rust_iso3166 = "0.1.14" rust-s3 = { version = "0.35.1", default-features = false, features = [ - "fail-on-err", - "tags", - "tokio-rustls-tls", + "fail-on-err", + "tags", + "tokio-rustls-tls", ] } rusty-money = "0.4.1" sentry = { version = "0.42.0", default-features = false, features = [ - "backtrace", - "contexts", - "debug-images", - "panic", - "reqwest", - "rustls", + "backtrace", + "contexts", + "debug-images", + "panic", + "reqwest", + "rustls", ] } sentry-actix = "0.42.0" serde = "1.0.219" @@ -136,7 +131,7 @@ serde_cbor = "0.11.2" serde_ini = "0.2.0" serde_json = "1.0.142" serde_with = "3.14.0" -serde-xml-rs = "0.8.1" # Also an XML (de)serializer, consider dropping yaserde in favor of this +serde-xml-rs = "0.8.1" # Also an XML (de)serializer, consider dropping yaserde in favor of this sha1 = "0.10.6" sha1_smol = { version = "1.0.1", features = ["std"] } sha2 = "0.10.9" @@ -153,8 +148,8 @@ tauri-plugin-opener = "2.4.0" tauri-plugin-os = "2.3.0" tauri-plugin-single-instance = "2.3.2" tauri-plugin-updater = { version = "2.9.0", default-features = false, features = [ - "rustls-tls", - "zip", + "rustls-tls", + "zip", ] } tauri-plugin-window-state = "2.4.0" tempfile = "3.20.0" @@ -180,10 +175,10 @@ winreg = "0.55.0" woothee = "0.13.0" yaserde = "0.12.0" zip = { version = "4.3.0", default-features = false, features = [ - "bzip2", - "deflate", - "deflate64", - "zstd", + "bzip2", + "deflate", + "deflate64", + "zstd", ] } zxcvbn = "3.1.0" @@ -230,11 +225,11 @@ wry = { git = "https://github.com/modrinth/wry", rev = "f2ce0b0" } # Optimize for speed and reduce size on release builds [profile.release] -opt-level = "s" # Optimize for binary size -strip = true # Remove debug symbols -lto = true # Enables link to optimizations -panic = "abort" # Strip expensive panic clean-up logic -codegen-units = 1 # Compile crates one after another so the compiler can optimize better +opt-level = "s" # Optimize for binary size +strip = true # Remove debug symbols +lto = true # Enables link to optimizations +panic = "abort" # Strip expensive panic clean-up logic +codegen-units = 1 # Compile crates one after another so the compiler can optimize better [profile.dev.package.sqlx-macros] opt-level = 3 diff --git a/apps/app-frontend/.prettierignore b/apps/app-frontend/.prettierignore index f631b52a7..7ea3c138a 100644 --- a/apps/app-frontend/.prettierignore +++ b/apps/app-frontend/.prettierignore @@ -1,3 +1,4 @@ **/dist *.gltf src/locales/ +src/assets/**/*.svg diff --git a/apps/app-playground/.prettierignore b/apps/app-playground/.prettierignore new file mode 100644 index 000000000..ecc487ec4 --- /dev/null +++ b/apps/app-playground/.prettierignore @@ -0,0 +1 @@ +**/*.rs diff --git a/apps/app-playground/package.json b/apps/app-playground/package.json index 342b3cecb..7d9fdaa61 100644 --- a/apps/app-playground/package.json +++ b/apps/app-playground/package.json @@ -1,10 +1,12 @@ { - "name": "@modrinth/app-playground", - "scripts": { - "build": "cargo build --release", - "lint": "cargo fmt --check && cargo clippy --all-targets", - "fix": "cargo clippy --all-targets --fix --allow-dirty && cargo fmt", - "dev": "cargo run", - "test": "cargo nextest run --all-targets --no-fail-fast" - } + "name": "@modrinth/app-playground", + "scripts": { + "build": "cargo build --release", + "lint": "cargo fmt --check && cargo clippy --all-targets", + "lint:ancillary": "prettier --check .", + "fix": "cargo clippy --all-targets --fix --allow-dirty && cargo fmt", + "fix:ancillary": "prettier --check .", + "dev": "cargo run", + "test": "cargo nextest run --all-targets --no-fail-fast" + } } diff --git a/apps/app/.prettierignore b/apps/app/.prettierignore new file mode 100644 index 000000000..06dd4658c --- /dev/null +++ b/apps/app/.prettierignore @@ -0,0 +1,2 @@ +**/*.rs +src/api/oauth_utils/auth_code_reply/page.html diff --git a/apps/app/Cargo.toml b/apps/app/Cargo.toml index e1a612e55..b0a489bd0 100644 --- a/apps/app/Cargo.toml +++ b/apps/app/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "theseus_gui" -version = "1.0.0-local" # The actual version is set by the theseus-build workflow on tagging +version = "1.0.0-local" # The actual version is set by the theseus-build workflow on tagging description = "The Modrinth App is a desktop application for managing your Minecraft mods" license = "GPL-3.0-only" repository = "https://github.com/modrinth/code/apps/app/" diff --git a/apps/app/Info.plist b/apps/app/Info.plist index 844d3a25f..68d93a149 100644 --- a/apps/app/Info.plist +++ b/apps/app/Info.plist @@ -1,42 +1,43 @@ - - + + - - CFBundleURLTypes - - - CFBundleURLName - ModrinthApp - CFBundleURLSchemes - - modrinth - modrinthscheme - - - - NSCameraUsageDescription - A Minecraft mod wants to access your camera. - NSMicrophoneUsageDescription - A Minecraft mod wants to access your microphone. - NSAppTransportSecurity - - NSExceptionDomains - - asset.localhost - - NSExceptionAllowsInsecureHTTPLoads - - NSIncludesSubdomains - - - textures.minecraft.net - - NSExceptionAllowsInsecureHTTPLoads - - NSIncludesSubdomains - - - - - + + CFBundleURLTypes + + + CFBundleURLName + ModrinthApp + CFBundleURLSchemes + + modrinth + modrinthscheme + + + + NSCameraUsageDescription + A Minecraft mod wants to access your camera. + NSMicrophoneUsageDescription + A Minecraft mod wants to access your microphone. + NSAppTransportSecurity + + NSExceptionDomains + + asset.localhost + + NSExceptionAllowsInsecureHTTPLoads + + NSIncludesSubdomains + + + textures.minecraft.net + + NSExceptionAllowsInsecureHTTPLoads + + NSIncludesSubdomains + + + + + diff --git a/apps/app/capabilities/ads.json b/apps/app/capabilities/ads.json index 3f8b5ad06..e0479d6d3 100644 --- a/apps/app/capabilities/ads.json +++ b/apps/app/capabilities/ads.json @@ -1,10 +1,10 @@ { - "identifier": "ads", - "description": "", - "local": false, - "remote": { - "urls": ["https://modrinth.com/*", "http://localhost:3000/*"] - }, - "webviews": ["ads-window"], - "permissions": ["ads:default"] + "identifier": "ads", + "description": "", + "local": false, + "remote": { + "urls": ["https://modrinth.com/*", "http://localhost:3000/*"] + }, + "webviews": ["ads-window"], + "permissions": ["ads:default"] } diff --git a/apps/app/capabilities/core.json b/apps/app/capabilities/core.json index ac4c012b8..ff4f7b14a 100644 --- a/apps/app/capabilities/core.json +++ b/apps/app/capabilities/core.json @@ -1,28 +1,28 @@ { - "identifier": "core", - "description": "", - "local": true, - "windows": ["main"], - "permissions": [ - "core:default", - "core:path:default", - "core:event:default", - "core:window:default", - "core:app:default", - "core:resources:default", - "core:menu:default", - "core:tray:default", - "core:window:allow-create", - "core:window:allow-maximize", - "core:window:allow-toggle-maximize", - "core:window:allow-unmaximize", - "core:window:allow-minimize", - "core:window:allow-unminimize", - "core:window:allow-show", - "core:window:allow-hide", - "core:window:allow-close", - "core:window:allow-set-decorations", - "core:window:allow-start-dragging", - "core:webview:allow-set-webview-zoom" - ] + "identifier": "core", + "description": "", + "local": true, + "windows": ["main"], + "permissions": [ + "core:default", + "core:path:default", + "core:event:default", + "core:window:default", + "core:app:default", + "core:resources:default", + "core:menu:default", + "core:tray:default", + "core:window:allow-create", + "core:window:allow-maximize", + "core:window:allow-toggle-maximize", + "core:window:allow-unmaximize", + "core:window:allow-minimize", + "core:window:allow-unminimize", + "core:window:allow-show", + "core:window:allow-hide", + "core:window:allow-close", + "core:window:allow-set-decorations", + "core:window:allow-start-dragging", + "core:webview:allow-set-webview-zoom" + ] } diff --git a/apps/app/capabilities/plugins.json b/apps/app/capabilities/plugins.json index b3947857b..588b59b59 100644 --- a/apps/app/capabilities/plugins.json +++ b/apps/app/capabilities/plugins.json @@ -1,50 +1,47 @@ { - "identifier": "plugins", - "description": "", - "local": true, - "windows": ["main"], - "permissions": [ - "dialog:allow-open", - "dialog:allow-confirm", - "opener:default", - "os:allow-platform", - "os:allow-version", - "os:allow-os-type", - "os:allow-family", - "os:allow-arch", - "os:allow-exe-extension", - "os:allow-locale", - "os:allow-hostname", - "deep-link:default", - "window-state:default", - "window-state:allow-restore-state", - "window-state:allow-save-window-state", - - { - "identifier": "http:default", - "allow": [ - { "url": "https://modrinth.com/*" }, - { "url": "https://*.modrinth.com/*" } - ] - }, + "identifier": "plugins", + "description": "", + "local": true, + "windows": ["main"], + "permissions": [ + "dialog:allow-open", + "dialog:allow-confirm", + "opener:default", + "os:allow-platform", + "os:allow-version", + "os:allow-os-type", + "os:allow-family", + "os:allow-arch", + "os:allow-exe-extension", + "os:allow-locale", + "os:allow-hostname", + "deep-link:default", + "window-state:default", + "window-state:allow-restore-state", + "window-state:allow-save-window-state", - "auth:default", - "import:default", - "jre:default", - "logs:default", - "metadata:default", - "minecraft-skins:default", - "mr-auth:default", - "profile-create:default", - "pack:default", - "process:default", - "profile:default", - "cache:default", - "settings:default", - "tags:default", - "utils:default", - "ads:default", - "friends:default", - "worlds:default" - ] + { + "identifier": "http:default", + "allow": [{ "url": "https://modrinth.com/*" }, { "url": "https://*.modrinth.com/*" }] + }, + + "auth:default", + "import:default", + "jre:default", + "logs:default", + "metadata:default", + "minecraft-skins:default", + "mr-auth:default", + "profile-create:default", + "pack:default", + "process:default", + "profile:default", + "cache:default", + "settings:default", + "tags:default", + "utils:default", + "ads:default", + "friends:default", + "worlds:default" + ] } diff --git a/apps/app/capabilities/updater.json b/apps/app/capabilities/updater.json index cdc28e946..6719d96a9 100644 --- a/apps/app/capabilities/updater.json +++ b/apps/app/capabilities/updater.json @@ -1,7 +1,7 @@ { - "identifier": "updater", - "description": "", - "local": true, - "windows": ["main"], - "permissions": ["updater:default"] + "identifier": "updater", + "description": "", + "local": true, + "windows": ["main"], + "permissions": ["updater:default"] } diff --git a/apps/app/package.json b/apps/app/package.json index 43f017203..ddcd1d077 100644 --- a/apps/app/package.json +++ b/apps/app/package.json @@ -1,19 +1,21 @@ { - "name": "@modrinth/app", - "scripts": { - "tauri": "tauri", - "build": "tauri build", - "dev": "tauri dev", - "test": "cargo nextest run --all-targets --no-fail-fast", - "lint": "cargo fmt --check && cargo clippy --all-targets", - "fix": "cargo clippy --all-targets --fix --allow-dirty && cargo fmt" - }, - "devDependencies": { - "@tauri-apps/cli": "2.5.0" - }, - "dependencies": { - "@modrinth/app-frontend": "workspace:*", - "@modrinth/app-lib": "workspace:*", - "@modrinth/daedalus": "workspace:*" - } + "name": "@modrinth/app", + "scripts": { + "tauri": "tauri", + "build": "tauri build", + "dev": "tauri dev", + "test": "cargo nextest run --all-targets --no-fail-fast", + "lint": "cargo fmt --check && cargo clippy --all-targets", + "lint:ancillary": "prettier --check .", + "fix": "cargo clippy --all-targets --fix --allow-dirty && cargo fmt", + "fix:ancillary": "prettier --write ." + }, + "devDependencies": { + "@tauri-apps/cli": "2.5.0" + }, + "dependencies": { + "@modrinth/app-frontend": "workspace:*", + "@modrinth/app-lib": "workspace:*", + "@modrinth/daedalus": "workspace:*" + } } diff --git a/apps/app/src/api/ads-init.js b/apps/app/src/api/ads-init.js index 060e7ba4c..bd4582729 100644 --- a/apps/app/src/api/ads-init.js +++ b/apps/app/src/api/ads-init.js @@ -1,106 +1,106 @@ document.addEventListener( - 'click', - function (e) { - window.top.postMessage({ modrinthAdClick: true }, 'https://modrinth.com') + 'click', + function (e) { + window.top.postMessage({ modrinthAdClick: true }, 'https://modrinth.com') - let target = e.target - while (target != null) { - if (target.matches('a')) { - e.preventDefault() - if (target.href) { - window.top.postMessage({ modrinthOpenUrl: target.href }, 'https://modrinth.com') - } - break - } - target = target.parentElement - } - }, - true, + let target = e.target + while (target != null) { + if (target.matches('a')) { + e.preventDefault() + if (target.href) { + window.top.postMessage({ modrinthOpenUrl: target.href }, 'https://modrinth.com') + } + break + } + target = target.parentElement + } + }, + true, ) window.open = (url, target, features) => { - window.top.postMessage({ modrinthOpenUrl: url }, 'https://modrinth.com') + window.top.postMessage({ modrinthOpenUrl: url }, 'https://modrinth.com') } function muteAudioContext() { - if (window.AudioContext || window.webkitAudioContext) { - const AudioContext = window.AudioContext || window.webkitAudioContext - const originalCreateMediaElementSource = AudioContext.prototype.createMediaElementSource - const originalCreateMediaStreamSource = AudioContext.prototype.createMediaStreamSource - const originalCreateMediaStreamTrackSource = AudioContext.prototype.createMediaStreamTrackSource - const originalCreateBufferSource = AudioContext.prototype.createBufferSource - const originalCreateOscillator = AudioContext.prototype.createOscillator + if (window.AudioContext || window.webkitAudioContext) { + const AudioContext = window.AudioContext || window.webkitAudioContext + const originalCreateMediaElementSource = AudioContext.prototype.createMediaElementSource + const originalCreateMediaStreamSource = AudioContext.prototype.createMediaStreamSource + const originalCreateMediaStreamTrackSource = AudioContext.prototype.createMediaStreamTrackSource + const originalCreateBufferSource = AudioContext.prototype.createBufferSource + const originalCreateOscillator = AudioContext.prototype.createOscillator - AudioContext.prototype.createGain = function () { - const gain = originalCreateGain.call(this) - gain.gain.value = 0 - return gain - } + AudioContext.prototype.createGain = function () { + const gain = originalCreateGain.call(this) + gain.gain.value = 0 + return gain + } - AudioContext.prototype.createMediaElementSource = function (mediaElement) { - const source = originalCreateMediaElementSource.call(this, mediaElement) - source.connect(this.createGain()) - return source - } + AudioContext.prototype.createMediaElementSource = function (mediaElement) { + const source = originalCreateMediaElementSource.call(this, mediaElement) + source.connect(this.createGain()) + return source + } - AudioContext.prototype.createMediaStreamSource = function (mediaStream) { - const source = originalCreateMediaStreamSource.call(this, mediaStream) - source.connect(this.createGain()) - return source - } + AudioContext.prototype.createMediaStreamSource = function (mediaStream) { + const source = originalCreateMediaStreamSource.call(this, mediaStream) + source.connect(this.createGain()) + return source + } - AudioContext.prototype.createMediaStreamTrackSource = function (mediaStreamTrack) { - const source = originalCreateMediaStreamTrackSource.call(this, mediaStreamTrack) - source.connect(this.createGain()) - return source - } + AudioContext.prototype.createMediaStreamTrackSource = function (mediaStreamTrack) { + const source = originalCreateMediaStreamTrackSource.call(this, mediaStreamTrack) + source.connect(this.createGain()) + return source + } - AudioContext.prototype.createBufferSource = function () { - const source = originalCreateBufferSource.call(this) - source.connect(this.createGain()) - return source - } + AudioContext.prototype.createBufferSource = function () { + const source = originalCreateBufferSource.call(this) + source.connect(this.createGain()) + return source + } - AudioContext.prototype.createOscillator = function () { - const oscillator = originalCreateOscillator.call(this) - oscillator.connect(this.createGain()) - return oscillator - } - } + AudioContext.prototype.createOscillator = function () { + const oscillator = originalCreateOscillator.call(this) + oscillator.connect(this.createGain()) + return oscillator + } + } } function muteVideo(mediaElement) { - let count = Number(mediaElement.getAttribute('data-modrinth-muted-count') ?? 0) + let count = Number(mediaElement.getAttribute('data-modrinth-muted-count') ?? 0) - if (!mediaElement.muted || mediaElement.volume !== 0) { - mediaElement.muted = true - mediaElement.volume = 0 + if (!mediaElement.muted || mediaElement.volume !== 0) { + mediaElement.muted = true + mediaElement.volume = 0 - mediaElement.setAttribute('data-modrinth-muted-count', count + 1) - } + mediaElement.setAttribute('data-modrinth-muted-count', count + 1) + } - if (count > 5) { - // Video is detected as malicious, so it is removed from the page - mediaElement.remove() - } + if (count > 5) { + // Video is detected as malicious, so it is removed from the page + mediaElement.remove() + } } function muteVideos() { - document.querySelectorAll('video, audio').forEach(function (mediaElement) { - muteVideo(mediaElement) + document.querySelectorAll('video, audio').forEach(function (mediaElement) { + muteVideo(mediaElement) - if (!mediaElement.hasAttribute('data-modrinth-muted')) { - mediaElement.addEventListener('volumechange', () => muteVideo(mediaElement)) + if (!mediaElement.hasAttribute('data-modrinth-muted')) { + mediaElement.addEventListener('volumechange', () => muteVideo(mediaElement)) - mediaElement.setAttribute('data-modrinth-muted', 'true') - } - }) + mediaElement.setAttribute('data-modrinth-muted', 'true') + } + }) } document.addEventListener('DOMContentLoaded', () => { - muteVideos() - muteAudioContext() + muteVideos() + muteAudioContext() - const observer = new MutationObserver(muteVideos) - observer.observe(document.body, { childList: true, subtree: true }) + const observer = new MutationObserver(muteVideos) + observer.observe(document.body, { childList: true, subtree: true }) }) diff --git a/apps/app/tauri-release.conf.json b/apps/app/tauri-release.conf.json index 47b3705a3..e3585db77 100644 --- a/apps/app/tauri-release.conf.json +++ b/apps/app/tauri-release.conf.json @@ -1,37 +1,37 @@ { - "bundle": { - "createUpdaterArtifacts": "v1Compatible", - "windows": { - "signCommand": { - "cmd": "jsign", - "args": [ - "sign", - "--verbose", - "--storetype", - "DIGICERTONE", - "--keystore", - "https://clientauth.one.digicert.com", - "--storepass", - "env:DIGICERT_ONE_SIGNER_CREDENTIALS", - "--tsaurl", - "https://timestamp.sectigo.com,http://timestamp.digicert.com", - "%1" - ] - } - } - }, - "build": { - "features": ["updater"] - }, - "app": { - "security": { - "capabilities": ["ads", "core", "plugins", "updater"] - } - }, - "plugins": { - "updater": { - "pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IDIwMzM5QkE0M0FCOERBMzkKUldRNTJyZzZwSnN6SUdPRGdZREtUUGxMblZqeG9OVHYxRUlRTzJBc2U3MUNJaDMvZDQ1UytZZmYK", - "endpoints": ["https://launcher-files.modrinth.com/updates.json"] - } - } + "bundle": { + "createUpdaterArtifacts": "v1Compatible", + "windows": { + "signCommand": { + "cmd": "jsign", + "args": [ + "sign", + "--verbose", + "--storetype", + "DIGICERTONE", + "--keystore", + "https://clientauth.one.digicert.com", + "--storepass", + "env:DIGICERT_ONE_SIGNER_CREDENTIALS", + "--tsaurl", + "https://timestamp.sectigo.com,http://timestamp.digicert.com", + "%1" + ] + } + } + }, + "build": { + "features": ["updater"] + }, + "app": { + "security": { + "capabilities": ["ads", "core", "plugins", "updater"] + } + }, + "plugins": { + "updater": { + "pubkey": "dW50cnVzdGVkIGNvbW1lbnQ6IG1pbmlzaWduIHB1YmxpYyBrZXk6IDIwMzM5QkE0M0FCOERBMzkKUldRNTJyZzZwSnN6SUdPRGdZREtUUGxMblZqeG9OVHYxRUlRTzJBc2U3MUNJaDMvZDQ1UytZZmYK", + "endpoints": ["https://launcher-files.modrinth.com/updates.json"] + } + } } diff --git a/apps/app/tauri.conf.json b/apps/app/tauri.conf.json index 675b49d76..e55ba32be 100644 --- a/apps/app/tauri.conf.json +++ b/apps/app/tauri.conf.json @@ -1,100 +1,100 @@ { - "$schema": "https://schema.tauri.app/config/2", - "build": { - "beforeDevCommand": "pnpm turbo run dev --filter=@modrinth/app-frontend", - "beforeBuildCommand": "pnpm turbo run build --filter=@modrinth/app-frontend", - "frontendDist": "../app-frontend/dist", - "devUrl": "http://localhost:1420" - }, - "bundle": { - "active": true, - "category": "Game", - "copyright": "", - "targets": "all", - "externalBin": [], - "icon": ["icons/128x128.png", "icons/128x128@2x.png", "icons/icon.icns", "icons/icon.ico"], - "windows": { - "nsis": { - "installMode": "currentUser", - "installerHooks": "./nsis/hooks.nsi" - } - }, - "longDescription": "", - "macOS": { - "entitlements": "App.entitlements", - "exceptionDomain": "", - "frameworks": [], - "providerShortName": null, - "signingIdentity": null - }, - "shortDescription": "", - "linux": { - "deb": { - "depends": [] - } - }, - "fileAssociations": [ - { - "ext": ["mrpack"], - "mimeType": "application/x-modrinth-modpack+zip" - } - ] - }, - "productName": "Modrinth App", - "version": "../app-frontend/package.json", - "mainBinaryName": "Modrinth App", - "identifier": "ModrinthApp", - "plugins": { - "deep-link": { - "desktop": { - "schemes": ["modrinth"] - }, - "mobile": [] - } - }, - "app": { - "withGlobalTauri": false, - "macOSPrivateApi": true, - "windows": [ - { - "titleBarStyle": "Overlay", - "hiddenTitle": true, - "fullscreen": false, - "height": 800, - "resizable": true, - "title": "Modrinth App", - "label": "main", - "width": 1280, - "minHeight": 700, - "minWidth": 1100, - "visible": true, - "zoomHotkeysEnabled": false, - "decorations": false - } - ], - "security": { - "assetProtocol": { - "scope": [ - "$APPDATA/caches/icons/*", - "$APPCONFIG/caches/icons/*", - "$CONFIG/caches/icons/*", - "$APPDATA/profiles/*/saves/*/icon.png", - "$APPCONFIG/profiles/*/saves/*/icon.png", - "$CONFIG/profiles/*/saves/*/icon.png" - ], - "enable": true - }, - "capabilities": ["ads", "core", "plugins"], - "csp": { - "default-src": "'self' customprotocol: asset:", - "connect-src": "ipc: http://ipc.localhost https://modrinth.com https://*.modrinth.com https://*.posthog.com https://*.sentry.io https://api.mclo.gs 'self' data: blob:", - "font-src": ["https://cdn-raw.modrinth.com/fonts/"], - "img-src": "https: 'unsafe-inline' 'self' asset: http://asset.localhost http://textures.minecraft.net blob: data:", - "style-src": "'unsafe-inline' 'self'", - "script-src": "https://*.posthog.com https://tally.so/widgets/embed.js 'self'", - "frame-src": "https://www.youtube.com https://www.youtube-nocookie.com https://discord.com https://tally.so/popup/ 'self'", - "media-src": "https://*.githubusercontent.com" - } - } - } + "$schema": "https://schema.tauri.app/config/2", + "build": { + "beforeDevCommand": "pnpm turbo run dev --filter=@modrinth/app-frontend", + "beforeBuildCommand": "pnpm turbo run build --filter=@modrinth/app-frontend", + "frontendDist": "../app-frontend/dist", + "devUrl": "http://localhost:1420" + }, + "bundle": { + "active": true, + "category": "Game", + "copyright": "", + "targets": "all", + "externalBin": [], + "icon": ["icons/128x128.png", "icons/128x128@2x.png", "icons/icon.icns", "icons/icon.ico"], + "windows": { + "nsis": { + "installMode": "currentUser", + "installerHooks": "./nsis/hooks.nsi" + } + }, + "longDescription": "", + "macOS": { + "entitlements": "App.entitlements", + "exceptionDomain": "", + "frameworks": [], + "providerShortName": null, + "signingIdentity": null + }, + "shortDescription": "", + "linux": { + "deb": { + "depends": [] + } + }, + "fileAssociations": [ + { + "ext": ["mrpack"], + "mimeType": "application/x-modrinth-modpack+zip" + } + ] + }, + "productName": "Modrinth App", + "version": "../app-frontend/package.json", + "mainBinaryName": "Modrinth App", + "identifier": "ModrinthApp", + "plugins": { + "deep-link": { + "desktop": { + "schemes": ["modrinth"] + }, + "mobile": [] + } + }, + "app": { + "withGlobalTauri": false, + "macOSPrivateApi": true, + "windows": [ + { + "titleBarStyle": "Overlay", + "hiddenTitle": true, + "fullscreen": false, + "height": 800, + "resizable": true, + "title": "Modrinth App", + "label": "main", + "width": 1280, + "minHeight": 700, + "minWidth": 1100, + "visible": true, + "zoomHotkeysEnabled": false, + "decorations": false + } + ], + "security": { + "assetProtocol": { + "scope": [ + "$APPDATA/caches/icons/*", + "$APPCONFIG/caches/icons/*", + "$CONFIG/caches/icons/*", + "$APPDATA/profiles/*/saves/*/icon.png", + "$APPCONFIG/profiles/*/saves/*/icon.png", + "$CONFIG/profiles/*/saves/*/icon.png" + ], + "enable": true + }, + "capabilities": ["ads", "core", "plugins"], + "csp": { + "default-src": "'self' customprotocol: asset:", + "connect-src": "ipc: http://ipc.localhost https://modrinth.com https://*.modrinth.com https://*.posthog.com https://*.sentry.io https://api.mclo.gs 'self' data: blob:", + "font-src": ["https://cdn-raw.modrinth.com/fonts/"], + "img-src": "https: 'unsafe-inline' 'self' asset: http://asset.localhost http://textures.minecraft.net blob: data:", + "style-src": "'unsafe-inline' 'self'", + "script-src": "https://*.posthog.com https://tally.so/widgets/embed.js 'self'", + "frame-src": "https://www.youtube.com https://www.youtube-nocookie.com https://discord.com https://tally.so/popup/ 'self'", + "media-src": "https://*.githubusercontent.com" + } + } + } } diff --git a/apps/app/tauri.linux.conf.json b/apps/app/tauri.linux.conf.json index 2dfc6edd7..5b2e9ec68 100644 --- a/apps/app/tauri.linux.conf.json +++ b/apps/app/tauri.linux.conf.json @@ -1,3 +1,3 @@ { - "mainBinaryName": "ModrinthApp" + "mainBinaryName": "ModrinthApp" } diff --git a/apps/app/tauri.macos.conf.json b/apps/app/tauri.macos.conf.json index 821902426..363f00e85 100644 --- a/apps/app/tauri.macos.conf.json +++ b/apps/app/tauri.macos.conf.json @@ -1,24 +1,24 @@ { - "app": { - "windows": [ - { - "titleBarStyle": "Overlay", - "hiddenTitle": true, - "fullscreen": false, - "height": 800, - "resizable": true, - "title": "Modrinth App", - "width": 1280, - "minHeight": 700, - "minWidth": 1100, - "visible": false, - "zoomHotkeysEnabled": false, - "decorations": true, - "trafficLightPosition": { - "x": 15.0, - "y": 22.0 - } - } - ] - } + "app": { + "windows": [ + { + "titleBarStyle": "Overlay", + "hiddenTitle": true, + "fullscreen": false, + "height": 800, + "resizable": true, + "title": "Modrinth App", + "width": 1280, + "minHeight": 700, + "minWidth": 1100, + "visible": false, + "zoomHotkeysEnabled": false, + "decorations": true, + "trafficLightPosition": { + "x": 15.0, + "y": 22.0 + } + } + ] + } } diff --git a/apps/app/turbo.jsonc b/apps/app/turbo.jsonc index 7cdf6bd4b..91b8afaa3 100644 --- a/apps/app/turbo.jsonc +++ b/apps/app/turbo.jsonc @@ -1,14 +1,14 @@ { - "$schema": "../../node_modules/turbo/schema.json", - "extends": ["//"], - "tasks": { - // Running Clippy and tests on a Tauri application requires - // the frontend to be built at least once first - "lint": { - "dependsOn": ["@modrinth/app-frontend#build"] - }, - "test": { - "dependsOn": ["@modrinth/app-frontend#build"] - } - } + "$schema": "../../node_modules/turbo/schema.json", + "extends": ["//"], + "tasks": { + // Running Clippy and tests on a Tauri application requires + // the frontend to be built at least once first + "lint": { + "dependsOn": ["@modrinth/app-frontend#build"] + }, + "test": { + "dependsOn": ["@modrinth/app-frontend#build"] + } + } } diff --git a/apps/daedalus_client/.prettierignore b/apps/daedalus_client/.prettierignore new file mode 100644 index 000000000..ecc487ec4 --- /dev/null +++ b/apps/daedalus_client/.prettierignore @@ -0,0 +1 @@ +**/*.rs diff --git a/apps/daedalus_client/Cargo.toml b/apps/daedalus_client/Cargo.toml index ffec1a471..feb1f52dc 100644 --- a/apps/daedalus_client/Cargo.toml +++ b/apps/daedalus_client/Cargo.toml @@ -16,7 +16,14 @@ serde_json.workspace = true serde-xml-rs.workspace = true thiserror.workspace = true reqwest = { workspace = true, features = ["stream", "json", "rustls-tls-native-roots"] } -async_zip = { workspace = true, features = ["chrono", "tokio-fs", "deflate", "bzip2", "zstd", "deflate64"] } +async_zip = { workspace = true, features = [ + "chrono", + "tokio-fs", + "deflate", + "bzip2", + "zstd", + "deflate64", +] } chrono = { workspace = true, features = ["serde"] } bytes.workspace = true rust-s3.workspace = true diff --git a/apps/daedalus_client/library-patches.json b/apps/daedalus_client/library-patches.json index 10987aff8..fa9bfe93f 100644 --- a/apps/daedalus_client/library-patches.json +++ b/apps/daedalus_client/library-patches.json @@ -1,2780 +1,2780 @@ [ - { - "_comment": "Only allow osx-arm64 for existing LWJGL 3.3.2/3.3.3", - "match": [ - "org.lwjgl:lwjgl-freetype-natives-macos-arm64:3.3.2", - "org.lwjgl:lwjgl-glfw-natives-macos-arm64:3.3.2", - "org.lwjgl:lwjgl-jemalloc-natives-macos-arm64:3.3.2", - "org.lwjgl:lwjgl-openal-natives-macos-arm64:3.3.2", - "org.lwjgl:lwjgl-opengl-natives-macos-arm64:3.3.2", - "org.lwjgl:lwjgl-stb-natives-macos-arm64:3.3.2", - "org.lwjgl:lwjgl-tinyfd-natives-macos-arm64:3.3.2", - "org.lwjgl:lwjgl-natives-macos-arm64:3.3.2", - "org.lwjgl:lwjgl-freetype-natives-macos-arm64:3.3.3", - "org.lwjgl:lwjgl-glfw-natives-macos-arm64:3.3.3", - "org.lwjgl:lwjgl-jemalloc-natives-macos-arm64:3.3.3", - "org.lwjgl:lwjgl-openal-natives-macos-arm64:3.3.3", - "org.lwjgl:lwjgl-opengl-natives-macos-arm64:3.3.3", - "org.lwjgl:lwjgl-stb-natives-macos-arm64:3.3.3", - "org.lwjgl:lwjgl-tinyfd-natives-macos-arm64:3.3.3", - "org.lwjgl:lwjgl-natives-macos-arm64:3.3.3" - ], - "override": { - "rules": [ - { - "action": "allow", - "os": { - "name": "osx-arm64" - } - } - ] - } - }, - { - "_comment": "Only allow windows-arm64 for existing LWJGL 3.3.2/3.3.3", - "match": [ - "org.lwjgl:lwjgl-freetype-natives-windows-arm64:3.3.2", - "org.lwjgl:lwjgl-glfw-natives-windows-arm64:3.3.2", - "org.lwjgl:lwjgl-jemalloc-natives-windows-arm64:3.3.2", - "org.lwjgl:lwjgl-openal-natives-windows-arm64:3.3.2", - "org.lwjgl:lwjgl-opengl-natives-windows-arm64:3.3.2", - "org.lwjgl:lwjgl-stb-natives-windows-arm64:3.3.2", - "org.lwjgl:lwjgl-tinyfd-natives-windows-arm64:3.3.2", - "org.lwjgl:lwjgl-natives-windows-arm64:3.3.2", - "org.lwjgl:lwjgl-freetype-natives-windows-arm64:3.3.3", - "org.lwjgl:lwjgl-glfw-natives-windows-arm64:3.3.3", - "org.lwjgl:lwjgl-jemalloc-natives-windows-arm64:3.3.3", - "org.lwjgl:lwjgl-openal-natives-windows-arm64:3.3.3", - "org.lwjgl:lwjgl-opengl-natives-windows-arm64:3.3.3", - "org.lwjgl:lwjgl-stb-natives-windows-arm64:3.3.3", - "org.lwjgl:lwjgl-tinyfd-natives-windows-arm64:3.3.3", - "org.lwjgl:lwjgl-natives-windows-arm64:3.3.3" - ], - "override": { - "rules": [ - { - "action": "allow", - "os": { - "name": "windows-arm64" - } - } - ] - } - }, - { - "_comment": "Add missing tinyfd to the broken LWJGL 3.2.2 variant", - "match": ["org.lwjgl:lwjgl:3.2.2"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "fcbe606c8f8da6f8f9a05e2c540eb1ee8632b0e9", - "size": 7092, - "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.2.2/lwjgl-tinyfd-3.2.2.jar" - } - }, - "name": "org.lwjgl:lwjgl-tinyfd:3.2.2" - }, - { - "downloads": { - "artifact": { - "sha1": "fcbe606c8f8da6f8f9a05e2c540eb1ee8632b0e9", - "size": 7092, - "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.2.2/lwjgl-tinyfd-3.2.2.jar" - }, - "classifiers": { - "natives-linux": { - "sha1": "39e35b161c130635d9c8918ce04e887a30c5b687", - "size": 38804, - "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.2.2/lwjgl-tinyfd-3.2.2-natives-linux.jar" - }, - "natives-macos": { - "sha1": "46d0798228b8a28e857a2a0f02310fd6ba2a4eab", - "size": 42136, - "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.2.2/lwjgl-tinyfd-3.2.2-natives-macos.jar" - }, - "natives-windows": { - "sha1": "e9115958773644e863332a6a06488d26f9e1fc9f", - "size": 208314, - "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.2.2/lwjgl-tinyfd-3.2.2-natives-windows.jar" - } - } - }, - "name": "org.lwjgl:lwjgl-tinyfd:3.2.2", - "natives": { - "linux": "natives-linux", - "osx": "natives-macos", - "windows": "natives-windows" - } - } - ], - "patchAdditionalLibraries": true - }, - { - "_comment": "Add additional library just for osx-arm64. No override needed", - "match": ["ca.weblite:java-objc-bridge:1.0.0"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "369a83621e3c65496348491e533cb97fe5f2f37d", - "size": 91947, - "url": "https://github.com/MinecraftMachina/Java-Objective-C-Bridge/releases/download/1.1.0-mmachina.1/java-objc-bridge-1.1.jar" - } - }, - "name": "ca.weblite:java-objc-bridge:1.1.0-mmachina.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "osx-arm64" - } - } - ] - } - ] - }, - { - "_comment": "Add additional classifiers for jinput-platform", - "match": ["net.java.jinput:jinput-platform:2.0.5"], - "override": { - "downloads": { - "classifiers": { - "natives-osx-arm64": { - "sha1": "5189eb40db3087fb11ca063b68fa4f4c20b199dd", - "size": 10031, - "url": "https://github.com/r58Playz/jinput-m1/raw/main/plugins/OSX/bin/jinput-platform-2.0.5.jar" - }, - "natives-linux-arm64": { - "sha1": "42b388ccb7c63cec4e9f24f4dddef33325f8b212", - "size": 10932, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-2.9.4/jinput-platform-2.0.5-natives-linux.jar" - }, - "natives-linux-arm32": { - "sha1": "f3c455b71c5146acb5f8a9513247fc06db182fd5", - "size": 4521, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-2.9.4/jinput-platform-2.0.5-natives-linux.jar" - } - } - }, - "natives": { - "linux-arm64": "natives-linux-arm64", - "linux-arm32": "natives-linux-arm32", - "osx-arm64": "natives-osx-arm64" - } - } - }, - { - "_comment": "Use a newer version on osx-arm64", - "match": [ - "com.mojang:text2speech:1.0.10", - "com.mojang:text2speech:1.5", - "com.mojang:text2speech:1.6", - "com.mojang:text2speech:1.7", - "com.mojang:text2speech:1.10.1", - "com.mojang:text2speech:1.10.3", - "com.mojang:text2speech:1.11.2" - ], - "override": { - "rules": [ - { - "action": "allow" - }, - { - "action": "disallow", - "os": { - "name": "osx-arm64" - } - } - ] - }, - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "f378f889797edd7df8d32272c06ca80a1b6b0f58", - "size": 13164, - "url": "https://libraries.minecraft.net/com/mojang/text2speech/1.11.3/text2speech-1.11.3.jar" - } - }, - "name": "com.mojang:text2speech:1.11.3", - "rules": [ - { - "action": "allow", - "os": { - "name": "osx-arm64" - } - } - ] - } - ] - }, - { - "_comment": "Use a newer version on osx-arm64, linux-arm64, and linux-arm32", - "match": [ - "org.lwjgl.lwjgl:lwjgl:2.9.3", - "org.lwjgl.lwjgl:lwjgl:2.9.1-nightly-20131120", - "org.lwjgl.lwjgl:lwjgl:2.9.1-nightly-20131017", - "org.lwjgl.lwjgl:lwjgl:2.9.1-nightly-20130708-debug3", - "org.lwjgl.lwjgl:lwjgl:2.9.1" - ], - "override": { - "rules": [ - { - "action": "allow" - }, - { - "action": "disallow", - "os": { - "name": "osx-arm64" - } - }, - { - "action": "disallow", - "os": { - "name": "linux-arm64" - } - }, - { - "action": "disallow", - "os": { - "name": "linux-arm32" - } - } - ] - }, - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "697517568c68e78ae0b4544145af031c81082dfe", - "size": 1047168, - "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl/2.9.4-nightly-20150209/lwjgl-2.9.4-nightly-20150209.jar" - } - }, - "name": "org.lwjgl.lwjgl:lwjgl:2.9.4-nightly-20150209", - "rules": [ - { - "action": "allow", - "os": { - "name": "osx-arm64" - } - }, - { - "action": "allow", - "os": { - "name": "linux-arm64" - } - }, - { - "action": "allow", - "os": { - "name": "linux-arm32" - } - } - ] - } - ] - }, - { - "_comment": "Use a newer version on osx-arm64, linux-arm64, and linux-arm32", - "match": [ - "org.lwjgl.lwjgl:lwjgl_util:2.9.3", - "org.lwjgl.lwjgl:lwjgl_util:2.9.1-nightly-20131120", - "org.lwjgl.lwjgl:lwjgl_util:2.9.1-nightly-20131017", - "org.lwjgl.lwjgl:lwjgl_util:2.9.1-nightly-20130708-debug3", - "org.lwjgl.lwjgl:lwjgl_util:2.9.1" - ], - "override": { - "rules": [ - { - "action": "allow" - }, - { - "action": "disallow", - "os": { - "name": "osx-arm64" - } - }, - { - "action": "disallow", - "os": { - "name": "linux-arm64" - } - }, - { - "action": "disallow", - "os": { - "name": "linux-arm32" - } - } - ] - }, - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "d51a7c040a721d13efdfbd34f8b257b2df882ad0", - "size": 173887, - "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl_util/2.9.4-nightly-20150209/lwjgl_util-2.9.4-nightly-20150209.jar" - } - }, - "name": "org.lwjgl.lwjgl:lwjgl_util:2.9.4-nightly-20150209", - "rules": [ - { - "action": "allow", - "os": { - "name": "osx-arm64" - } - }, - { - "action": "allow", - "os": { - "name": "linux-arm64" - } - }, - { - "action": "allow", - "os": { - "name": "linux-arm32" - } - } - ] - } - ] - }, - { - "_comment": "Use a newer patched version on osx-arm64, linux-arm64, and linux-arm32", - "match": [ - "org.lwjgl.lwjgl:lwjgl-platform:2.9.4-nightly-20150209", - "org.lwjgl.lwjgl:lwjgl-platform:2.9.3", - "org.lwjgl.lwjgl:lwjgl-platform:2.9.1-nightly-20131120", - "org.lwjgl.lwjgl:lwjgl-platform:2.9.1-nightly-20131017", - "org.lwjgl.lwjgl:lwjgl-platform:2.9.1-nightly-20130708-debug3", - "org.lwjgl.lwjgl:lwjgl-platform:2.9.1" - ], - "override": { - "downloads": { - "classifiers": { - "natives-osx-arm64": { - "sha1": "eff546c0b319d6ffc7a835652124c18089c67f36", - "size": 488316, - "url": "https://github.com/MinecraftMachina/lwjgl/releases/download/2.9.4-20150209-mmachina.2/lwjgl-platform-2.9.4-nightly-20150209-natives-osx.jar" - }, - "natives-linux-arm64": { - "sha1": "63ac7da0f4a4785c7eadc0f8edc1e9dcc4dd08cb", - "size": 579979, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-2.9.4/lwjgl-platform-2.9.4-nightly-20150209-natives-linux.jar" - }, - "natives-linux-arm32": { - "sha1": "fa483e540a9a753a5ffbb23dcf7879a5bf752611", - "size": 475177, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-2.9.4/lwjgl-platform-2.9.4-nightly-20150209-natives-linux.jar" - } - } - }, - "natives": { - "linux-arm64": "natives-linux-arm64", - "linux-arm32": "natives-linux-arm32", - "osx-arm64": "natives-osx-arm64" - } - } - }, - { - "_comment": "Use a newer patched version on osx-arm64, linux-arm64, and linux-arm32", - "match": [ - "org.lwjgl:lwjgl-glfw:3.2.2", - "org.lwjgl:lwjgl-glfw:3.2.1", - "org.lwjgl:lwjgl-glfw:3.1.6", - "org.lwjgl:lwjgl-glfw:3.1.2" - ], - "override": { - "rules": [ - { - "action": "allow" - }, - { - "action": "disallow", - "os": { - "name": "linux-arm64" - } - }, - { - "action": "disallow", - "os": { - "name": "linux-arm32" - } - }, - { - "action": "disallow", - "os": { - "name": "osx-arm64" - } - } - ] - }, - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "155d175037efc76630940c197ca6dea2b17d7e18", - "size": 108691, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-glfw.jar" - } - }, - "name": "org.lwjgl:lwjgl-glfw:3.2.2-gman64.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm64" - } - } - ] - }, - { - "downloads": { - "artifact": { - "sha1": "155d175037efc76630940c197ca6dea2b17d7e18", - "size": 108691, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-glfw.jar" - }, - "classifiers": { - "natives-linux-arm64": { - "sha1": "074ad243761147df0d060fbefc814614d2ff75cc", - "size": 85072, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-glfw-natives-linux-arm64.jar" - } - } - }, - "name": "org.lwjgl:lwjgl-glfw:3.2.2-gman64.1", - "natives": { - "linux-arm64": "natives-linux-arm64" - }, - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm64" - } - } - ] - }, - { - "downloads": { - "artifact": { - "sha1": "99e9a39fa8ed4167e3ff9e04d47eb32c9e69804d", - "size": 108691, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-glfw.jar" - } - }, - "name": "org.lwjgl:lwjgl-glfw:3.2.2-gman32.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm32" - } - } - ] - }, - { - "downloads": { - "artifact": { - "sha1": "99e9a39fa8ed4167e3ff9e04d47eb32c9e69804d", - "size": 108691, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-glfw.jar" - }, - "classifiers": { - "natives-linux-arm32": { - "sha1": "4265f2fbe3b9d642591165165a17cf406cf7b98e", - "size": 80186, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-glfw-natives-linux-arm32.jar" - } - } - }, - "name": "org.lwjgl:lwjgl-glfw:3.2.2-gman32.1", - "natives": { - "linux-arm32": "natives-linux-arm32" - }, - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm32" - } - } - ] - }, - { - "downloads": { - "artifact": { - "sha1": "e9a101bca4fa30d26b21b526ff28e7c2d8927f1b", - "size": 130128, - "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-glfw.jar" - } - }, - "name": "org.lwjgl:lwjgl-glfw:3.3.1-mmachina.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "osx-arm64" - } - } - ] - }, - { - "downloads": { - "artifact": { - "sha1": "e9a101bca4fa30d26b21b526ff28e7c2d8927f1b", - "size": 130128, - "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-glfw.jar" - }, - "classifiers": { - "natives-osx-arm64": { - "sha1": "71d793d0a5a42e3dfe78eb882abc2523a2c6b496", - "size": 129076, - "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-glfw-natives-macos-arm64.jar" - } - } - }, - "name": "org.lwjgl:lwjgl-glfw:3.3.1-mmachina.1", - "natives": { - "osx-arm64": "natives-osx-arm64" - }, - "rules": [ - { - "action": "allow", - "os": { - "name": "osx-arm64" - } - } - ] - } - ] - }, - { - "_comment": "Use a newer patched version on osx-arm64, linux-arm64, and linux-arm32", - "match": [ - "org.lwjgl:lwjgl-jemalloc:3.2.2", - "org.lwjgl:lwjgl-jemalloc:3.2.1", - "org.lwjgl:lwjgl-jemalloc:3.1.6", - "org.lwjgl:lwjgl-jemalloc:3.1.2" - ], - "override": { - "rules": [ - { - "action": "allow" - }, - { - "action": "disallow", - "os": { - "name": "linux-arm64" - } - }, - { - "action": "disallow", - "os": { - "name": "linux-arm32" - } - }, - { - "action": "disallow", - "os": { - "name": "osx-arm64" - } - } - ] - }, - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "cc04eec29b2fa8c298791af9800a3766d9617954", - "size": 33790, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-jemalloc.jar" - } - }, - "name": "org.lwjgl:lwjgl-jemalloc:3.2.2-gman64.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm64" - } - } - ] - }, - { - "downloads": { - "artifact": { - "sha1": "cc04eec29b2fa8c298791af9800a3766d9617954", - "size": 33790, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-jemalloc.jar" - }, - "classifiers": { - "natives-linux-arm64": { - "sha1": "762d7d80c9cdf3a3f3fc80c8a5f86612255edfe0", - "size": 156343, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-jemalloc-patched-natives-linux-arm64.jar" - } - } - }, - "name": "org.lwjgl:lwjgl-jemalloc:3.2.2-gman64.2", - "natives": { - "linux-arm64": "natives-linux-arm64" - }, - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm64" - } - } - ] - }, - { - "downloads": { - "artifact": { - "sha1": "8224ae2e8fc6d8e1a0fc7d84dc917aa3c440620c", - "size": 33790, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-jemalloc.jar" - } - }, - "name": "org.lwjgl:lwjgl-jemalloc:3.2.2-gman32.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm32" - } - } - ] - }, - { - "downloads": { - "artifact": { - "sha1": "8224ae2e8fc6d8e1a0fc7d84dc917aa3c440620c", - "size": 33790, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-jemalloc.jar" - }, - "classifiers": { - "natives-linux-arm32": { - "sha1": "9163a2a5559ef87bc13ead8fea84417ea3928748", - "size": 134237, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-jemalloc-natives-linux-arm32.jar" - } - } - }, - "name": "org.lwjgl:lwjgl-jemalloc:3.2.2-gman32.1", - "natives": { - "linux-arm32": "natives-linux-arm32" - }, - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm32" - } - } - ] - }, - { - "downloads": { - "artifact": { - "sha1": "4fb94224378d3588d52d2beb172f2eeafea2d546", - "size": 36976, - "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-jemalloc.jar" - } - }, - "name": "org.lwjgl:lwjgl-jemalloc:3.3.1-mmachina.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "osx-arm64" - } - } - ] - }, - { - "downloads": { - "artifact": { - "sha1": "4fb94224378d3588d52d2beb172f2eeafea2d546", - "size": 36976, - "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-jemalloc.jar" - }, - "classifiers": { - "natives-osx-arm64": { - "sha1": "b0be721188d2e7195798780b1c5fe7eafe8091c1", - "size": 103478, - "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-jemalloc-natives-macos-arm64.jar" - } - } - }, - "name": "org.lwjgl:lwjgl-jemalloc:3.3.1-mmachina.1", - "natives": { - "osx-arm64": "natives-osx-arm64" - }, - "rules": [ - { - "action": "allow", - "os": { - "name": "osx-arm64" - } - } - ] - } - ] - }, - { - "_comment": "Use a newer patched version on osx-arm64, linux-arm64, and linux-arm32", - "match": [ - "org.lwjgl:lwjgl-openal:3.2.2", - "org.lwjgl:lwjgl-openal:3.2.1", - "org.lwjgl:lwjgl-openal:3.1.6", - "org.lwjgl:lwjgl-openal:3.1.2" - ], - "override": { - "rules": [ - { - "action": "allow" - }, - { - "action": "disallow", - "os": { - "name": "linux-arm64" - } - }, - { - "action": "disallow", - "os": { - "name": "linux-arm32" - } - }, - { - "action": "disallow", - "os": { - "name": "osx-arm64" - } - } - ] - }, - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "6dfce9dc6a9629c75b2ae01a8df7e7be80ba0261", - "size": 79582, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-openal.jar" - } - }, - "name": "org.lwjgl:lwjgl-openal:3.2.2-gman64.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm64" - } - } - ] - }, - { - "downloads": { - "artifact": { - "sha1": "6dfce9dc6a9629c75b2ae01a8df7e7be80ba0261", - "size": 79582, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-openal.jar" - }, - "classifiers": { - "natives-linux-arm64": { - "sha1": "948e415b5b2a2c650c25b377a4a9f443b21ce92e", - "size": 469432, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-openal-natives-linux-arm64.jar" - } - } - }, - "name": "org.lwjgl:lwjgl-openal:3.2.2-gman64.1", - "natives": { - "linux-arm64": "natives-linux-arm64" - }, - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm64" - } - } - ] - }, - { - "downloads": { - "artifact": { - "sha1": "304f0571fd5971621ee6da86a4c1e90f6f52e2ee", - "size": 79582, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-openal.jar" - } - }, - "name": "org.lwjgl:lwjgl-openal:3.2.2-gman32.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm32" - } - } - ] - }, - { - "downloads": { - "artifact": { - "sha1": "304f0571fd5971621ee6da86a4c1e90f6f52e2ee", - "size": 79582, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-openal.jar" - }, - "classifiers": { - "natives-linux-arm32": { - "sha1": "ecbc981fdd996492a1f6334f003ed62e5a8c0cd5", - "size": 398418, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-openal-natives-linux-arm32.jar" - } - } - }, - "name": "org.lwjgl:lwjgl-openal:3.2.2-gman32.1", - "natives": { - "linux-arm32": "natives-linux-arm32" - }, - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm32" - } - } - ] - }, - { - "downloads": { - "artifact": { - "sha1": "d48e753d85916fc8a200ccddc709b36e3865cc4e", - "size": 88880, - "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-openal.jar" - } - }, - "name": "org.lwjgl:lwjgl-openal:3.3.1-mmachina.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "osx-arm64" - } - } - ] - }, - { - "downloads": { - "artifact": { - "sha1": "d48e753d85916fc8a200ccddc709b36e3865cc4e", - "size": 88880, - "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-openal.jar" - }, - "classifiers": { - "natives-osx-arm64": { - "sha1": "6b80fc0b982a0723b141e88859c42d6f71bd723f", - "size": 346131, - "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-openal-natives-macos-arm64.jar" - } - } - }, - "name": "org.lwjgl:lwjgl-openal:3.3.1-mmachina.1", - "natives": { - "osx-arm64": "natives-osx-arm64" - }, - "rules": [ - { - "action": "allow", - "os": { - "name": "osx-arm64" - } - } - ] - } - ] - }, - { - "_comment": "Use a newer patched version on osx-arm64, linux-arm64, and linux-arm32", - "match": [ - "org.lwjgl:lwjgl-opengl:3.2.2", - "org.lwjgl:lwjgl-opengl:3.2.1", - "org.lwjgl:lwjgl-opengl:3.1.6", - "org.lwjgl:lwjgl-opengl:3.1.2" - ], - "override": { - "rules": [ - { - "action": "allow" - }, - { - "action": "disallow", - "os": { - "name": "linux-arm64" - } - }, - { - "action": "disallow", - "os": { - "name": "linux-arm32" - } - }, - { - "action": "disallow", - "os": { - "name": "osx-arm64" - } - } - ] - }, - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "198bc2f72e0b2eb401eb6f5999aea52909b31ac4", - "size": 937609, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-opengl.jar" - } - }, - "name": "org.lwjgl:lwjgl-opengl:3.2.2-gman64.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm64" - } - } - ] - }, - { - "downloads": { - "artifact": { - "sha1": "198bc2f72e0b2eb401eb6f5999aea52909b31ac4", - "size": 937609, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-opengl.jar" - }, - "classifiers": { - "natives-linux-arm64": { - "sha1": "bd40897077bf7d12f562da898b18ac2c68e1f9d7", - "size": 56109, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-opengl-natives-linux-arm64.jar" - } - } - }, - "name": "org.lwjgl:lwjgl-opengl:3.2.2-gman64.1", - "natives": { - "linux-arm64": "natives-linux-arm64" - }, - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm64" - } - } - ] - }, - { - "downloads": { - "artifact": { - "sha1": "9762ae928d02147e716cd82e929b74a97ea9600a", - "size": 937609, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-opengl.jar" - } - }, - "name": "org.lwjgl:lwjgl-opengl:3.2.2-gman32.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm32" - } - } - ] - }, - { - "downloads": { - "artifact": { - "sha1": "9762ae928d02147e716cd82e929b74a97ea9600a", - "size": 937609, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-opengl.jar" - }, - "classifiers": { - "natives-linux-arm32": { - "sha1": "3af5599c74dd76dd8dbb567b3f9b4963a6abeed5", - "size": 56388, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-opengl-natives-linux-arm32.jar" - } - } - }, - "name": "org.lwjgl:lwjgl-opengl:3.2.2-gman32.1", - "natives": { - "linux-arm32": "natives-linux-arm32" - }, - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm32" - } - } - ] - }, - { - "downloads": { - "artifact": { - "sha1": "962c2a8d2a8cdd3b89de3d78d766ab5e2133c2f4", - "size": 929233, - "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-opengl.jar" - } - }, - "name": "org.lwjgl:lwjgl-opengl:3.3.1-mmachina.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "osx-arm64" - } - } - ] - }, - { - "downloads": { - "artifact": { - "sha1": "962c2a8d2a8cdd3b89de3d78d766ab5e2133c2f4", - "size": 929233, - "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-opengl.jar" - }, - "classifiers": { - "natives-osx-arm64": { - "sha1": "bb575058e0372f515587b5d2d04ff7db185f3ffe", - "size": 41667, - "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-opengl-natives-macos-arm64.jar" - } - } - }, - "name": "org.lwjgl:lwjgl-opengl:3.3.1-mmachina.1", - "natives": { - "osx-arm64": "natives-osx-arm64" - }, - "rules": [ - { - "action": "allow", - "os": { - "name": "osx-arm64" - } - } - ] - } - ] - }, - { - "_comment": "Use a newer patched version on osx-arm64, linux-arm64, and linux-arm32", - "match": [ - "org.lwjgl:lwjgl-stb:3.2.2", - "org.lwjgl:lwjgl-stb:3.2.1", - "org.lwjgl:lwjgl-stb:3.1.6", - "org.lwjgl:lwjgl-stb:3.1.2" - ], - "override": { - "rules": [ - { - "action": "allow" - }, - { - "action": "disallow", - "os": { - "name": "linux-arm64" - } - }, - { - "action": "disallow", - "os": { - "name": "linux-arm32" - } - }, - { - "action": "disallow", - "os": { - "name": "osx-arm64" - } - } - ] - }, - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "46a5735f3eb9d17eb5dcbdd5afa194066d2a6555", - "size": 104075, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-stb.jar" - } - }, - "name": "org.lwjgl:lwjgl-stb:3.2.2-gman64.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm64" - } - } - ] - }, - { - "downloads": { - "artifact": { - "sha1": "46a5735f3eb9d17eb5dcbdd5afa194066d2a6555", - "size": 104075, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-stb.jar" - }, - "classifiers": { - "natives-linux-arm64": { - "sha1": "077efa7d7ea41b32df5c6078e912e724cccd06db", - "size": 202038, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-stb-natives-linux-arm64.jar" - } - } - }, - "name": "org.lwjgl:lwjgl-stb:3.2.2-gman64.1", - "natives": { - "linux-arm64": "natives-linux-arm64" - }, - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm64" - } - } - ] - }, - { - "downloads": { - "artifact": { - "sha1": "ea979b0af45b8e689f5f47c989aa8550c148d8a2", - "size": 104075, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-stb.jar" - } - }, - "name": "org.lwjgl:lwjgl-stb:3.2.2-gman32.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm32" - } - } - ] - }, - { - "downloads": { - "artifact": { - "sha1": "ea979b0af45b8e689f5f47c989aa8550c148d8a2", - "size": 104075, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-stb.jar" - }, - "classifiers": { - "natives-linux-arm32": { - "sha1": "ec9d70aaebd0ff76dfeecf8f00b56118bf3706b1", - "size": 149387, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-stb-natives-linux-arm32.jar" - } - } - }, - "name": "org.lwjgl:lwjgl-stb:3.2.2-gman32.1", - "natives": { - "linux-arm32": "natives-linux-arm32" - }, - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm32" - } - } - ] - }, - { - "downloads": { - "artifact": { - "sha1": "703e4b533e2542560e9f94d6d8bd148be1c1d572", - "size": 113273, - "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-stb.jar" - } - }, - "name": "org.lwjgl:lwjgl-stb:3.3.1-mmachina.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "osx-arm64" - } - } - ] - }, - { - "downloads": { - "artifact": { - "sha1": "703e4b533e2542560e9f94d6d8bd148be1c1d572", - "size": 113273, - "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-stb.jar" - }, - "classifiers": { - "natives-osx-arm64": { - "sha1": "98f0ad956c754723ef354d50057cc30417ef376a", - "size": 178409, - "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-stb-natives-macos-arm64.jar" - } - } - }, - "name": "org.lwjgl:lwjgl-stb:3.3.1-mmachina.1", - "natives": { - "osx-arm64": "natives-osx-arm64" - }, - "rules": [ - { - "action": "allow", - "os": { - "name": "osx-arm64" - } - } - ] - } - ] - }, - { - "_comment": "Use a newer patched version on osx-arm64, linux-arm64, and linux-arm32", - "match": [ - "org.lwjgl:lwjgl-tinyfd:3.2.2", - "org.lwjgl:lwjgl-tinyfd:3.2.1", - "org.lwjgl:lwjgl-tinyfd:3.1.6", - "org.lwjgl:lwjgl-tinyfd:3.1.2" - ], - "override": { - "rules": [ - { - "action": "allow" - }, - { - "action": "disallow", - "os": { - "name": "linux-arm64" - } - }, - { - "action": "disallow", - "os": { - "name": "linux-arm32" - } - }, - { - "action": "disallow", - "os": { - "name": "osx-arm64" - } - } - ] - }, - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "3a75b9811607633bf33c978f53964df1534a4bc1", - "size": 5571, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-tinyfd.jar" - } - }, - "name": "org.lwjgl:lwjgl-tinyfd:3.2.2-gman64.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm64" - } - } - ] - }, - { - "downloads": { - "artifact": { - "sha1": "3a75b9811607633bf33c978f53964df1534a4bc1", - "size": 5571, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-tinyfd.jar" - }, - "classifiers": { - "natives-linux-arm64": { - "sha1": "37c744ca289b5d7ae155d79e39029488b3254e5b", - "size": 37893, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-tinyfd-natives-linux-arm64.jar" - } - } - }, - "name": "org.lwjgl:lwjgl-tinyfd:3.2.2-gman64.1", - "natives": { - "linux-arm64": "natives-linux-arm64" - }, - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm64" - } - } - ] - }, - { - "downloads": { - "artifact": { - "sha1": "a8c09f5b7fa24bd53ec329c231b566497a163d5b", - "size": 5571, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-tinyfd.jar" - } - }, - "name": "org.lwjgl:lwjgl-tinyfd:3.2.2-gman32.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm32" - } - } - ] - }, - { - "downloads": { - "artifact": { - "sha1": "a8c09f5b7fa24bd53ec329c231b566497a163d5b", - "size": 5571, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-tinyfd.jar" - }, - "classifiers": { - "natives-linux-arm32": { - "sha1": "82d16054ada6633297a3108fb6d8bae98800c76f", - "size": 41663, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-tinyfd-natives-linux-arm32.jar" - } - } - }, - "name": "org.lwjgl:lwjgl-tinyfd:3.2.2-gman32.1", - "natives": { - "linux-arm32": "natives-linux-arm32" - }, - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm32" - } - } - ] - }, - { - "downloads": { - "artifact": { - "sha1": "1203660b3131cbb8681b17ce6437412545be95e0", - "size": 6802, - "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-tinyfd.jar" - } - }, - "name": "org.lwjgl:lwjgl-tinyfd:3.3.1-mmachina.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "osx-arm64" - } - } - ] - }, - { - "downloads": { - "artifact": { - "sha1": "1203660b3131cbb8681b17ce6437412545be95e0", - "size": 6802, - "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-tinyfd.jar" - }, - "classifiers": { - "natives-osx-arm64": { - "sha1": "015b931a2daba8f0c317d84c9d14e8e98ae56e0c", - "size": 41384, - "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-tinyfd-natives-macos-arm64.jar" - } - } - }, - "name": "org.lwjgl:lwjgl-tinyfd:3.3.1-mmachina.1", - "natives": { - "osx-arm64": "natives-osx-arm64" - }, - "rules": [ - { - "action": "allow", - "os": { - "name": "osx-arm64" - } - } - ] - } - ] - }, - { - "_comment": "Use a newer patched version on osx-arm64, linux-arm64, and linux-arm32", - "match": [ - "org.lwjgl:lwjgl:3.2.2", - "org.lwjgl:lwjgl:3.2.1", - "org.lwjgl:lwjgl:3.1.6", - "org.lwjgl:lwjgl:3.1.2" - ], - "override": { - "rules": [ - { - "action": "allow" - }, - { - "action": "disallow", - "os": { - "name": "linux-arm64" - } - }, - { - "action": "disallow", - "os": { - "name": "linux-arm32" - } - }, - { - "action": "disallow", - "os": { - "name": "osx-arm64" - } - } - ] - }, - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "360899386df83d6a8407844a94478607af937f97", - "size": 318833, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-core.jar" - } - }, - "name": "org.lwjgl:lwjgl:3.2.2-gman64.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm64" - } - } - ] - }, - { - "downloads": { - "artifact": { - "sha1": "360899386df83d6a8407844a94478607af937f97", - "size": 318833, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-core.jar" - }, - "classifiers": { - "natives-linux-arm64": { - "sha1": "612efd57d12b2e48e554858eb35e7e2eb46ebb4c", - "size": 87121, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-natives-linux-arm64.jar" - } - } - }, - "name": "org.lwjgl:lwjgl:3.2.2-gman64.1", - "natives": { - "linux-arm64": "natives-linux-arm64" - }, - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm64" - } - } - ] - }, - { - "downloads": { - "artifact": { - "sha1": "16ea3934fca417368250d1ddac01a30c1809d317", - "size": 318413, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-core.jar" - } - }, - "name": "org.lwjgl:lwjgl:3.2.2-gman32.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm32" - } - } - ] - }, - { - "downloads": { - "artifact": { - "sha1": "16ea3934fca417368250d1ddac01a30c1809d317", - "size": 318413, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-core.jar" - }, - "classifiers": { - "natives-linux-arm32": { - "sha1": "6bd0b37fef777a309936a72dc7f63126e8c79ea5", - "size": 90296, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-natives-linux-arm32.jar" - } - } - }, - "name": "org.lwjgl:lwjgl:3.2.2-gman32.1", - "natives": { - "linux-arm32": "natives-linux-arm32" - }, - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm32" - } - } - ] - }, - { - "downloads": { - "artifact": { - "sha1": "8e664dd69ad7bbcf2053da23efc7848e39e498db", - "size": 719038, - "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl.jar" - } - }, - "name": "org.lwjgl:lwjgl:3.3.1-mmachina.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "osx-arm64" - } - } - ] - }, - { - "downloads": { - "artifact": { - "sha1": "8e664dd69ad7bbcf2053da23efc7848e39e498db", - "size": 719038, - "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl.jar" - }, - "classifiers": { - "natives-osx-arm64": { - "sha1": "984df31fadaab86838877b112e5b4e4f68a00ccf", - "size": 42693, - "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-natives-macos-arm64.jar" - } - } - }, - "name": "org.lwjgl:lwjgl:3.3.1-mmachina.1", - "natives": { - "osx-arm64": "natives-osx-arm64" - }, - "rules": [ - { - "action": "allow", - "os": { - "name": "osx-arm64" - } - } - ] - } - ] - }, - { - "_comment": "Only allow osx-arm64 for existing LWJGL 3.3.1", - "match": [ - "org.lwjgl:lwjgl-glfw-natives-macos-arm64:3.3.1", - "org.lwjgl:lwjgl-jemalloc-natives-macos-arm64:3.3.1", - "org.lwjgl:lwjgl-openal-natives-macos-arm64:3.3.1", - "org.lwjgl:lwjgl-opengl-natives-macos-arm64:3.3.1", - "org.lwjgl:lwjgl-stb-natives-macos-arm64:3.3.1", - "org.lwjgl:lwjgl-tinyfd-natives-macos-arm64:3.3.1", - "org.lwjgl:lwjgl-natives-macos-arm64:3.3.1" - ], - "override": { - "rules": [ - { - "action": "allow", - "os": { - "name": "osx-arm64" - } - } - ] - } - }, - { - "_comment": "Only allow osx-arm64 for existing java-objc-bridge:1.1", - "match": ["ca.weblite:java-objc-bridge:1.1"], - "override": { - "rules": [ - { - "action": "allow", - "os": { - "name": "osx-arm64" - } - } - ] - } - }, - { - "_comment": "Only allow windows-arm64 for existing LWJGL 3.3.1", - "match": [ - "org.lwjgl:lwjgl-glfw-natives-windows-arm64:3.3.1", - "org.lwjgl:lwjgl-jemalloc-natives-windows-arm64:3.3.1", - "org.lwjgl:lwjgl-openal-natives-windows-arm64:3.3.1", - "org.lwjgl:lwjgl-opengl-natives-windows-arm64:3.3.1", - "org.lwjgl:lwjgl-stb-natives-windows-arm64:3.3.1", - "org.lwjgl:lwjgl-tinyfd-natives-windows-arm64:3.3.1", - "org.lwjgl:lwjgl-natives-windows-arm64:3.3.1" - ], - "override": { - "rules": [ - { - "action": "allow", - "os": { - "name": "windows-arm64" - } - } - ] - } - }, - { - "_comment": "Add linux-arm64 support for LWJGL 3.3.1", - "match": ["org.lwjgl:lwjgl-glfw:3.3.1"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "513eb39b866d0fe131a18d5c517087805433b029", - "size": 112350, - "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl-glfw/lwjgl-glfw-natives-linux-arm64.jar" - } - }, - "name": "org.lwjgl:lwjgl-glfw-natives-linux-arm64:3.3.1-lwjgl.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm64" - } - } - ] - } - ] - }, - { - "_comment": "Add linux-arm64 support for LWJGL 3.3.1", - "match": ["org.lwjgl:lwjgl-jemalloc:3.3.1"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "749be48a9b86ee2c3a2da5fd77511208adcfb33b", - "size": 159993, - "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.3.1/lwjgl-jemalloc-patched-natives-linux-arm64.jar" - } - }, - "name": "org.lwjgl:lwjgl-jemalloc-natives-linux-arm64:3.3.1-gman64.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm64" - } - } - ] - } - ] - }, - { - "_comment": "Add linux-arm64 support for LWJGL 3.3.1", - "match": ["org.lwjgl:lwjgl-openal:3.3.1"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "cf4e303257e82981b8b2e31bba3d7f8f7b8f42b2", - "size": 470743, - "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl-openal/lwjgl-openal-natives-linux-arm64.jar" - } - }, - "name": "org.lwjgl:lwjgl-openal-natives-linux-arm64:3.3.1-lwjgl.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm64" - } - } - ] - } - ] - }, - { - "_comment": "Add linux-arm64 support for LWJGL 3.3.1", - "match": ["org.lwjgl:lwjgl-opengl:3.3.1"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "1c528fb258a6e63e8fceb4482d8db0f3af10a634", - "size": 57908, - "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl-opengl/lwjgl-opengl-natives-linux-arm64.jar" - } - }, - "name": "org.lwjgl:lwjgl-opengl-natives-linux-arm64:3.3.1-lwjgl.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm64" - } - } - ] - } - ] - }, - { - "_comment": "Add linux-arm64 support for LWJGL 3.3.1", - "match": ["org.lwjgl:lwjgl-stb:3.3.1"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "8e8348a1813aad7f30aaf75ea197151ebb7beba9", - "size": 205491, - "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl-stb/lwjgl-stb-natives-linux-arm64.jar" - } - }, - "name": "org.lwjgl:lwjgl-stb-natives-linux-arm64:3.3.1-lwjgl.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm64" - } - } - ] - } - ] - }, - { - "_comment": "Add linux-arm64 support for LWJGL 3.3.1", - "match": ["org.lwjgl:lwjgl-tinyfd:3.3.1"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "964f628b7a82fd909def086c0dd9a4b84bb259ae", - "size": 42654, - "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl-tinyfd/lwjgl-tinyfd-natives-linux-arm64.jar" - } - }, - "name": "org.lwjgl:lwjgl-tinyfd-natives-linux-arm64:3.3.1-lwjgl.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm64" - } - } - ] - } - ] - }, - { - "_comment": "Add linux-arm64 support for LWJGL 3.3.1", - "match": ["org.lwjgl:lwjgl:3.3.1"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "b597401014acb7196c76d97e15a6288f54f1f692", - "size": 86308, - "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl/lwjgl-natives-linux-arm64.jar" - } - }, - "name": "org.lwjgl:lwjgl-natives-linux-arm64:3.3.1-lwjgl.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm64" - } - } - ] - } - ] - }, - { - "_comment": "Add linux-arm32 support for LWJGL 3.3.1", - "match": ["org.lwjgl:lwjgl-glfw:3.3.1"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "816d935933f2dd743074c4e717cc25b55720f294", - "size": 104027, - "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl-glfw/lwjgl-glfw-natives-linux-arm32.jar" - } - }, - "name": "org.lwjgl:lwjgl-glfw-natives-linux-arm32:3.3.1-lwjgl.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm32" - } - } - ] - } - ] - }, - { - "_comment": "Add linux-arm32 support for LWJGL 3.3.1", - "match": ["org.lwjgl:lwjgl-jemalloc:3.3.1"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "a96a6d6cb3876d7813fcee53c3c24f246aeba3b3", - "size": 136157, - "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl-jemalloc/lwjgl-jemalloc-natives-linux-arm32.jar" - } - }, - "name": "org.lwjgl:lwjgl-jemalloc-natives-linux-arm32:3.3.1-lwjgl.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm32" - } - } - ] - } - ] - }, - { - "_comment": "Add linux-arm32 support for LWJGL 3.3.1", - "match": ["org.lwjgl:lwjgl-openal:3.3.1"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "ffbe35d7fa5ec9b7eca136a7c71f24d4025a510b", - "size": 400129, - "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl-openal/lwjgl-openal-natives-linux-arm32.jar" - } - }, - "name": "org.lwjgl:lwjgl-openal-natives-linux-arm32:3.3.1-lwjgl.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm32" - } - } - ] - } - ] - }, - { - "_comment": "Add linux-arm32 support for LWJGL 3.3.1", - "match": ["org.lwjgl:lwjgl-opengl:3.3.1"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "e3550fa91097fd56e361b4370fa822220fef3595", - "size": 58474, - "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl-opengl/lwjgl-opengl-natives-linux-arm32.jar" - } - }, - "name": "org.lwjgl:lwjgl-opengl-natives-linux-arm32:3.3.1-lwjgl.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm32" - } - } - ] - } - ] - }, - { - "_comment": "Add linux-arm32 support for LWJGL 3.3.1", - "match": ["org.lwjgl:lwjgl-stb:3.3.1"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "b08226bab162c06ae69337d8a1b0ee0a3fdf0b90", - "size": 153889, - "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl-stb/lwjgl-stb-natives-linux-arm32.jar" - } - }, - "name": "org.lwjgl:lwjgl-stb-natives-linux-arm32:3.3.1-lwjgl.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm32" - } - } - ] - } - ] - }, - { - "_comment": "Add linux-arm32 support for LWJGL 3.3.1", - "match": ["org.lwjgl:lwjgl-tinyfd:3.3.1"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "d53d331e859217a61298fcbcf8d79137f3df345c", - "size": 48061, - "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl-tinyfd/lwjgl-tinyfd-natives-linux-arm32.jar" - } - }, - "name": "org.lwjgl:lwjgl-tinyfd-natives-linux-arm32:3.3.1-lwjgl.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm32" - } - } - ] - } - ] - }, - { - "_comment": "Add linux-arm32 support for LWJGL 3.3.1", - "match": ["org.lwjgl:lwjgl:3.3.1"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "41a3c1dd15d6b964eb8196dde69720a3e3e5e969", - "size": 82374, - "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl/lwjgl-natives-linux-arm32.jar" - } - }, - "name": "org.lwjgl:lwjgl-natives-linux-arm32:3.3.1-lwjgl.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm32" - } - } - ] - } - ] - }, - { - "_comment": "Add linux-arm64 support for LWJGL 3.3.2", - "match": ["org.lwjgl:lwjgl-freetype:3.3.2"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "896e7d9b8f60d7273f3d491c69270afc67ece3ce", - "size": 1073374, - "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-freetype/lwjgl-freetype-natives-linux-arm64.jar" - } - }, - "name": "org.lwjgl:lwjgl-freetype-natives-linux-arm64:3.3.2-lwjgl.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm64" - } - } - ] - } - ] - }, - { - "_comment": "Add linux-arm64 support for LWJGL 3.3.2", - "match": ["org.lwjgl:lwjgl-glfw:3.3.2"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "bc49e64bae0f7ff103a312ee8074a34c4eb034c7", - "size": 120168, - "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-glfw/lwjgl-glfw-natives-linux-arm64.jar" - } - }, - "name": "org.lwjgl:lwjgl-glfw-natives-linux-arm64:3.3.2-lwjgl.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm64" - } - } - ] - } - ] - }, - { - "_comment": "Add linux-arm64 support for LWJGL 3.3.2", - "match": ["org.lwjgl:lwjgl-jemalloc:3.3.2"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "5249f18a9ae20ea86c5816bc3107a888ce7a17d2", - "size": 206402, - "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-jemalloc/lwjgl-jemalloc-natives-linux-arm64.jar" - } - }, - "name": "org.lwjgl:lwjgl-jemalloc-natives-linux-arm64:3.3.2-lwjgl.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm64" - } - } - ] - } - ] - }, - { - "_comment": "Add linux-arm64 support for LWJGL 3.3.2", - "match": ["org.lwjgl:lwjgl-openal:3.3.2"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "22408980cc579709feaf9acb807992d3ebcf693f", - "size": 590865, - "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-openal/lwjgl-openal-natives-linux-arm64.jar" - } - }, - "name": "org.lwjgl:lwjgl-openal-natives-linux-arm64:3.3.2-lwjgl.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm64" - } - } - ] - } - ] - }, - { - "_comment": "Add linux-arm64 support for LWJGL 3.3.2", - "match": ["org.lwjgl:lwjgl-opengl:3.3.2"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "bb9eb56da6d1d549d6a767218e675e36bc568eb9", - "size": 58627, - "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-opengl/lwjgl-opengl-natives-linux-arm64.jar" - } - }, - "name": "org.lwjgl:lwjgl-opengl-natives-linux-arm64:3.3.2-lwjgl.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm64" - } - } - ] - } - ] - }, - { - "_comment": "Add linux-arm64 support for LWJGL 3.3.2", - "match": ["org.lwjgl:lwjgl-stb:3.3.2"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "11a380c37b0f03cb46db235e064528f84d736ff7", - "size": 207419, - "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-stb/lwjgl-stb-natives-linux-arm64.jar" - } - }, - "name": "org.lwjgl:lwjgl-stb-natives-linux-arm64:3.3.2-lwjgl.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm64" - } - } - ] - } - ] - }, - { - "_comment": "Add linux-arm64 support for LWJGL 3.3.2", - "match": ["org.lwjgl:lwjgl-tinyfd:3.3.2"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "93f8c5bc1984963cd79109891fb5a9d1e580373e", - "size": 43381, - "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-tinyfd/lwjgl-tinyfd-natives-linux-arm64.jar" - } - }, - "name": "org.lwjgl:lwjgl-tinyfd-natives-linux-arm64:3.3.2-lwjgl.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm64" - } - } - ] - } - ] - }, - { - "_comment": "Add linux-arm64 support for LWJGL 3.3.2", - "match": ["org.lwjgl:lwjgl:3.3.2"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "8bd89332c90a90e6bc4aa997a25c05b7db02c90a", - "size": 90795, - "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl/lwjgl-natives-linux-arm64.jar" - } - }, - "name": "org.lwjgl:lwjgl-natives-linux-arm64:3.3.2-lwjgl.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm64" - } - } - ] - } - ] - }, - { - "_comment": "Add linux-arm32 support for LWJGL 3.3.2", - "match": ["org.lwjgl:lwjgl-freetype:3.3.2"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "b7f77ceb951182659fd400437272aa7e96709968", - "size": 924657, - "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-freetype/lwjgl-freetype-natives-linux-arm32.jar" - } - }, - "name": "org.lwjgl:lwjgl-freetype-natives-linux-arm32:3.3.2-lwjgl.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm32" - } - } - ] - } - ] - }, - { - "_comment": "Add linux-arm32 support for LWJGL 3.3.2", - "match": ["org.lwjgl:lwjgl-glfw:3.3.2"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "5907d9a6b7c44fb0612a63bb1cff5992588f65be", - "size": 110067, - "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-glfw/lwjgl-glfw-natives-linux-arm32.jar" - } - }, - "name": "org.lwjgl:lwjgl-glfw-natives-linux-arm32:3.3.2-lwjgl.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm32" - } - } - ] - } - ] - }, - { - "_comment": "Add linux-arm32 support for LWJGL 3.3.2", - "match": ["org.lwjgl:lwjgl-jemalloc:3.3.2"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "9367437ce192e4d6f5725d53d85520644c0b0d6f", - "size": 177571, - "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-jemalloc/lwjgl-jemalloc-natives-linux-arm32.jar" - } - }, - "name": "org.lwjgl:lwjgl-jemalloc-natives-linux-arm32:3.3.2-lwjgl.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm32" - } - } - ] - } - ] - }, - { - "_comment": "Add linux-arm32 support for LWJGL 3.3.2", - "match": ["org.lwjgl:lwjgl-openal:3.3.2"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "7c82bbc33ef49ee4094b216c940db564b2998224", - "size": 503352, - "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-openal/lwjgl-openal-natives-linux-arm32.jar" - } - }, - "name": "org.lwjgl:lwjgl-openal-natives-linux-arm32:3.3.2-lwjgl.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm32" - } - } - ] - } - ] - }, - { - "_comment": "Add linux-arm32 support for LWJGL 3.3.2", - "match": ["org.lwjgl:lwjgl-opengl:3.3.2"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "821f9a2d1d583c44893f42b96f6977682b48a99b", - "size": 59265, - "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-opengl/lwjgl-opengl-natives-linux-arm32.jar" - } - }, - "name": "org.lwjgl:lwjgl-opengl-natives-linux-arm32:3.3.2-lwjgl.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm32" - } - } - ] - } - ] - }, - { - "_comment": "Add linux-arm32 support for LWJGL 3.3.2", - "match": ["org.lwjgl:lwjgl-stb:3.3.2"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "ca9333da184aade20757151f4615f1e27ca521ae", - "size": 154928, - "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-stb/lwjgl-stb-natives-linux-arm32.jar" - } - }, - "name": "org.lwjgl:lwjgl-stb-natives-linux-arm32:3.3.2-lwjgl.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm32" - } - } - ] - } - ] - }, - { - "_comment": "Add linux-arm32 support for LWJGL 3.3.2", - "match": ["org.lwjgl:lwjgl-tinyfd:3.3.2"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "807e220913aa0740449ff90d3b3d825cf5f359ed", - "size": 48788, - "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-tinyfd/lwjgl-tinyfd-natives-linux-arm32.jar" - } - }, - "name": "org.lwjgl:lwjgl-tinyfd-natives-linux-arm32:3.3.2-lwjgl.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm32" - } - } - ] - } - ] - }, - { - "_comment": "Add linux-arm32 support for LWJGL 3.3.2", - "match": ["org.lwjgl:lwjgl:3.3.2"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "afcbfaaa46f217e98a6da4208550f71de1f2a225", - "size": 89347, - "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl/lwjgl-natives-linux-arm32.jar" - } - }, - "name": "org.lwjgl:lwjgl-natives-linux-arm32:3.3.2-lwjgl.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm32" - } - } - ] - } - ] - }, - { - "_comment": "Add linux-arm64 support for LWJGL 3.3.3", - "match": ["org.lwjgl:lwjgl-freetype:3.3.3"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "498965aac06c4a0d42df1fbef6bacd05bde7f974", - "size": 1093516, - "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-freetype/lwjgl-freetype-natives-linux-arm64.jar" - } - }, - "name": "org.lwjgl:lwjgl-freetype-natives-linux-arm64:3.3.3-lwjgl.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm64" - } - } - ] - } - ] - }, - { - "_comment": "Add linux-arm64 support for LWJGL 3.3.3", - "match": ["org.lwjgl:lwjgl-glfw:3.3.3"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "492a0f11f85b85899a6568f07511160c1b87cd38", - "size": 122159, - "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-glfw/lwjgl-glfw-natives-linux-arm64.jar" - } - }, - "name": "org.lwjgl:lwjgl-glfw-natives-linux-arm64:3.3.3-lwjgl.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm64" - } - } - ] - } - ] - }, - { - "_comment": "Add linux-arm64 support for LWJGL 3.3.3", - "match": ["org.lwjgl:lwjgl-jemalloc:3.3.3"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "eff8b86798191192fe2cba2dc2776109f30c239d", - "size": 209315, - "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-jemalloc/lwjgl-jemalloc-natives-linux-arm64.jar" - } - }, - "name": "org.lwjgl:lwjgl-jemalloc-natives-linux-arm64:3.3.3-lwjgl.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm64" - } - } - ] - } - ] - }, - { - "_comment": "Add linux-arm64 support for LWJGL 3.3.3", - "match": ["org.lwjgl:lwjgl-openal:3.3.3"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "ad8f302118a65bb8d615f8a2a680db58fb8f835e", - "size": 592963, - "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-openal/lwjgl-openal-natives-linux-arm64.jar" - } - }, - "name": "org.lwjgl:lwjgl-openal-natives-linux-arm64:3.3.3-lwjgl.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm64" - } - } - ] - } - ] - }, - { - "_comment": "Add linux-arm64 support for LWJGL 3.3.3", - "match": ["org.lwjgl:lwjgl-opengl:3.3.3"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "2096f6b94b2d68745d858fbfe53aacf5f0c8074c", - "size": 58625, - "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-opengl/lwjgl-opengl-natives-linux-arm64.jar" - } - }, - "name": "org.lwjgl:lwjgl-opengl-natives-linux-arm64:3.3.3-lwjgl.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm64" - } - } - ] - } - ] - }, - { - "_comment": "Add linux-arm64 support for LWJGL 3.3.3", - "match": ["org.lwjgl:lwjgl-stb:3.3.3"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "ddc177afc2be1ee8d93684b11363b80589a13fe1", - "size": 207418, - "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-stb/lwjgl-stb-natives-linux-arm64.jar" - } - }, - "name": "org.lwjgl:lwjgl-stb-natives-linux-arm64:3.3.3-lwjgl.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm64" - } - } - ] - } - ] - }, - { - "_comment": "Add linux-arm64 support for LWJGL 3.3.3", - "match": ["org.lwjgl:lwjgl-tinyfd:3.3.3"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "2823a8c955c758d0954d282888075019ef99cec7", - "size": 43864, - "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-tinyfd/lwjgl-tinyfd-natives-linux-arm64.jar" - } - }, - "name": "org.lwjgl:lwjgl-tinyfd-natives-linux-arm64:3.3.3-lwjgl.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm64" - } - } - ] - } - ] - }, - { - "_comment": "Add linux-arm64 support for LWJGL 3.3.3", - "match": ["org.lwjgl:lwjgl:3.3.3"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "f35d8b6ffe1ac1e3a5eb1d4e33de80f044ad5fd8", - "size": 91294, - "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl/lwjgl-natives-linux-arm64.jar" - } - }, - "name": "org.lwjgl:lwjgl-natives-linux-arm64:3.3.3-lwjgl.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm64" - } - } - ] - } - ] - }, - { - "_comment": "Add linux-arm32 support for LWJGL 3.3.3", - "match": ["org.lwjgl:lwjgl-freetype:3.3.3"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "7dd3b1f751571adaf2c4dc882bc675a5d1e796e6", - "size": 942636, - "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-freetype/lwjgl-freetype-natives-linux-arm32.jar" - } - }, - "name": "org.lwjgl:lwjgl-freetype-natives-linux-arm32:3.3.3-lwjgl.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm32" - } - } - ] - } - ] - }, - { - "_comment": "Add linux-arm32 support for LWJGL 3.3.3", - "match": ["org.lwjgl:lwjgl-glfw:3.3.3"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "d9af485c32545b37dd5359b163161d42d7534dcf", - "size": 112560, - "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-glfw/lwjgl-glfw-natives-linux-arm32.jar" - } - }, - "name": "org.lwjgl:lwjgl-glfw-natives-linux-arm32:3.3.3-lwjgl.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm32" - } - } - ] - } - ] - }, - { - "_comment": "Add linux-arm32 support for LWJGL 3.3.3", - "match": ["org.lwjgl:lwjgl-jemalloc:3.3.3"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "109b6931880d02d4e65ced38928a16e41d19873e", - "size": 178324, - "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-jemalloc/lwjgl-jemalloc-natives-linux-arm32.jar" - } - }, - "name": "org.lwjgl:lwjgl-jemalloc-natives-linux-arm32:3.3.3-lwjgl.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm32" - } - } - ] - } - ] - }, - { - "_comment": "Add linux-arm32 support for LWJGL 3.3.3", - "match": ["org.lwjgl:lwjgl-openal:3.3.3"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "e1702aa09d20359d6cf5cb2999fa7685a785eca7", - "size": 505618, - "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-openal/lwjgl-openal-natives-linux-arm32.jar" - } - }, - "name": "org.lwjgl:lwjgl-openal-natives-linux-arm32:3.3.3-lwjgl.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm32" - } - } - ] - } - ] - }, - { - "_comment": "Add linux-arm32 support for LWJGL 3.3.3", - "match": ["org.lwjgl:lwjgl-opengl:3.3.3"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "dbba17fc5ac0985d14a57c11f9537617d67b9952", - "size": 59263, - "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-opengl/lwjgl-opengl-natives-linux-arm32.jar" - } - }, - "name": "org.lwjgl:lwjgl-opengl-natives-linux-arm32:3.3.3-lwjgl.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm32" - } - } - ] - } - ] - }, - { - "_comment": "Add linux-arm32 support for LWJGL 3.3.3", - "match": ["org.lwjgl:lwjgl-stb:3.3.3"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "1ae28ff044699ff29b0e980ffabd73fba8a664b3", - "size": 154931, - "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-stb/lwjgl-stb-natives-linux-arm32.jar" - } - }, - "name": "org.lwjgl:lwjgl-stb-natives-linux-arm32:3.3.3-lwjgl.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm32" - } - } - ] - } - ] - }, - { - "_comment": "Add linux-arm32 support for LWJGL 3.3.3", - "match": ["org.lwjgl:lwjgl-tinyfd:3.3.3"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "c2a0a05c82c4b9f69ded0b6ad5f417addea78ce2", - "size": 49495, - "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-tinyfd/lwjgl-tinyfd-natives-linux-arm32.jar" - } - }, - "name": "org.lwjgl:lwjgl-tinyfd-natives-linux-arm32:3.3.3-lwjgl.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm32" - } - } - ] - } - ] - }, - { - "_comment": "Add linux-arm32 support for LWJGL 3.3.3", - "match": ["org.lwjgl:lwjgl:3.3.3"], - "additionalLibraries": [ - { - "downloads": { - "artifact": { - "sha1": "2075c51a80f0ef0f22ba616ba54007ac2b0debd4", - "size": 89565, - "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl/lwjgl-natives-linux-arm32.jar" - } - }, - "name": "org.lwjgl:lwjgl-natives-linux-arm32:3.3.3-lwjgl.1", - "rules": [ - { - "action": "allow", - "os": { - "name": "linux-arm32" - } - } - ] - } - ] - }, - { - "_comment": "Replace glfw from 3.3.1 with version from 3.3.2 to prevent stack smashing", - "match": [ - "org.lwjgl:lwjgl-glfw-natives-linux:3.3.1", - "org.lwjgl:lwjgl-glfw:3.3.1:natives-linux" - ], - "override": { - "downloads": { - "artifact": { - "sha1": "0766bb0e8e829598b1c8052fd8173c62af741c52", - "size": 115553, - "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-glfw/lwjgl-glfw-natives-linux.jar" - } - }, - "name": "org.lwjgl:lwjgl-glfw-natives-linux:3.3.2-lwjgl.1" - } - } + { + "_comment": "Only allow osx-arm64 for existing LWJGL 3.3.2/3.3.3", + "match": [ + "org.lwjgl:lwjgl-freetype-natives-macos-arm64:3.3.2", + "org.lwjgl:lwjgl-glfw-natives-macos-arm64:3.3.2", + "org.lwjgl:lwjgl-jemalloc-natives-macos-arm64:3.3.2", + "org.lwjgl:lwjgl-openal-natives-macos-arm64:3.3.2", + "org.lwjgl:lwjgl-opengl-natives-macos-arm64:3.3.2", + "org.lwjgl:lwjgl-stb-natives-macos-arm64:3.3.2", + "org.lwjgl:lwjgl-tinyfd-natives-macos-arm64:3.3.2", + "org.lwjgl:lwjgl-natives-macos-arm64:3.3.2", + "org.lwjgl:lwjgl-freetype-natives-macos-arm64:3.3.3", + "org.lwjgl:lwjgl-glfw-natives-macos-arm64:3.3.3", + "org.lwjgl:lwjgl-jemalloc-natives-macos-arm64:3.3.3", + "org.lwjgl:lwjgl-openal-natives-macos-arm64:3.3.3", + "org.lwjgl:lwjgl-opengl-natives-macos-arm64:3.3.3", + "org.lwjgl:lwjgl-stb-natives-macos-arm64:3.3.3", + "org.lwjgl:lwjgl-tinyfd-natives-macos-arm64:3.3.3", + "org.lwjgl:lwjgl-natives-macos-arm64:3.3.3" + ], + "override": { + "rules": [ + { + "action": "allow", + "os": { + "name": "osx-arm64" + } + } + ] + } + }, + { + "_comment": "Only allow windows-arm64 for existing LWJGL 3.3.2/3.3.3", + "match": [ + "org.lwjgl:lwjgl-freetype-natives-windows-arm64:3.3.2", + "org.lwjgl:lwjgl-glfw-natives-windows-arm64:3.3.2", + "org.lwjgl:lwjgl-jemalloc-natives-windows-arm64:3.3.2", + "org.lwjgl:lwjgl-openal-natives-windows-arm64:3.3.2", + "org.lwjgl:lwjgl-opengl-natives-windows-arm64:3.3.2", + "org.lwjgl:lwjgl-stb-natives-windows-arm64:3.3.2", + "org.lwjgl:lwjgl-tinyfd-natives-windows-arm64:3.3.2", + "org.lwjgl:lwjgl-natives-windows-arm64:3.3.2", + "org.lwjgl:lwjgl-freetype-natives-windows-arm64:3.3.3", + "org.lwjgl:lwjgl-glfw-natives-windows-arm64:3.3.3", + "org.lwjgl:lwjgl-jemalloc-natives-windows-arm64:3.3.3", + "org.lwjgl:lwjgl-openal-natives-windows-arm64:3.3.3", + "org.lwjgl:lwjgl-opengl-natives-windows-arm64:3.3.3", + "org.lwjgl:lwjgl-stb-natives-windows-arm64:3.3.3", + "org.lwjgl:lwjgl-tinyfd-natives-windows-arm64:3.3.3", + "org.lwjgl:lwjgl-natives-windows-arm64:3.3.3" + ], + "override": { + "rules": [ + { + "action": "allow", + "os": { + "name": "windows-arm64" + } + } + ] + } + }, + { + "_comment": "Add missing tinyfd to the broken LWJGL 3.2.2 variant", + "match": ["org.lwjgl:lwjgl:3.2.2"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "fcbe606c8f8da6f8f9a05e2c540eb1ee8632b0e9", + "size": 7092, + "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.2.2/lwjgl-tinyfd-3.2.2.jar" + } + }, + "name": "org.lwjgl:lwjgl-tinyfd:3.2.2" + }, + { + "downloads": { + "artifact": { + "sha1": "fcbe606c8f8da6f8f9a05e2c540eb1ee8632b0e9", + "size": 7092, + "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.2.2/lwjgl-tinyfd-3.2.2.jar" + }, + "classifiers": { + "natives-linux": { + "sha1": "39e35b161c130635d9c8918ce04e887a30c5b687", + "size": 38804, + "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.2.2/lwjgl-tinyfd-3.2.2-natives-linux.jar" + }, + "natives-macos": { + "sha1": "46d0798228b8a28e857a2a0f02310fd6ba2a4eab", + "size": 42136, + "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.2.2/lwjgl-tinyfd-3.2.2-natives-macos.jar" + }, + "natives-windows": { + "sha1": "e9115958773644e863332a6a06488d26f9e1fc9f", + "size": 208314, + "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl-tinyfd/3.2.2/lwjgl-tinyfd-3.2.2-natives-windows.jar" + } + } + }, + "name": "org.lwjgl:lwjgl-tinyfd:3.2.2", + "natives": { + "linux": "natives-linux", + "osx": "natives-macos", + "windows": "natives-windows" + } + } + ], + "patchAdditionalLibraries": true + }, + { + "_comment": "Add additional library just for osx-arm64. No override needed", + "match": ["ca.weblite:java-objc-bridge:1.0.0"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "369a83621e3c65496348491e533cb97fe5f2f37d", + "size": 91947, + "url": "https://github.com/MinecraftMachina/Java-Objective-C-Bridge/releases/download/1.1.0-mmachina.1/java-objc-bridge-1.1.jar" + } + }, + "name": "ca.weblite:java-objc-bridge:1.1.0-mmachina.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "osx-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add additional classifiers for jinput-platform", + "match": ["net.java.jinput:jinput-platform:2.0.5"], + "override": { + "downloads": { + "classifiers": { + "natives-osx-arm64": { + "sha1": "5189eb40db3087fb11ca063b68fa4f4c20b199dd", + "size": 10031, + "url": "https://github.com/r58Playz/jinput-m1/raw/main/plugins/OSX/bin/jinput-platform-2.0.5.jar" + }, + "natives-linux-arm64": { + "sha1": "42b388ccb7c63cec4e9f24f4dddef33325f8b212", + "size": 10932, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-2.9.4/jinput-platform-2.0.5-natives-linux.jar" + }, + "natives-linux-arm32": { + "sha1": "f3c455b71c5146acb5f8a9513247fc06db182fd5", + "size": 4521, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-2.9.4/jinput-platform-2.0.5-natives-linux.jar" + } + } + }, + "natives": { + "linux-arm64": "natives-linux-arm64", + "linux-arm32": "natives-linux-arm32", + "osx-arm64": "natives-osx-arm64" + } + } + }, + { + "_comment": "Use a newer version on osx-arm64", + "match": [ + "com.mojang:text2speech:1.0.10", + "com.mojang:text2speech:1.5", + "com.mojang:text2speech:1.6", + "com.mojang:text2speech:1.7", + "com.mojang:text2speech:1.10.1", + "com.mojang:text2speech:1.10.3", + "com.mojang:text2speech:1.11.2" + ], + "override": { + "rules": [ + { + "action": "allow" + }, + { + "action": "disallow", + "os": { + "name": "osx-arm64" + } + } + ] + }, + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "f378f889797edd7df8d32272c06ca80a1b6b0f58", + "size": 13164, + "url": "https://libraries.minecraft.net/com/mojang/text2speech/1.11.3/text2speech-1.11.3.jar" + } + }, + "name": "com.mojang:text2speech:1.11.3", + "rules": [ + { + "action": "allow", + "os": { + "name": "osx-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Use a newer version on osx-arm64, linux-arm64, and linux-arm32", + "match": [ + "org.lwjgl.lwjgl:lwjgl:2.9.3", + "org.lwjgl.lwjgl:lwjgl:2.9.1-nightly-20131120", + "org.lwjgl.lwjgl:lwjgl:2.9.1-nightly-20131017", + "org.lwjgl.lwjgl:lwjgl:2.9.1-nightly-20130708-debug3", + "org.lwjgl.lwjgl:lwjgl:2.9.1" + ], + "override": { + "rules": [ + { + "action": "allow" + }, + { + "action": "disallow", + "os": { + "name": "osx-arm64" + } + }, + { + "action": "disallow", + "os": { + "name": "linux-arm64" + } + }, + { + "action": "disallow", + "os": { + "name": "linux-arm32" + } + } + ] + }, + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "697517568c68e78ae0b4544145af031c81082dfe", + "size": 1047168, + "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl/2.9.4-nightly-20150209/lwjgl-2.9.4-nightly-20150209.jar" + } + }, + "name": "org.lwjgl.lwjgl:lwjgl:2.9.4-nightly-20150209", + "rules": [ + { + "action": "allow", + "os": { + "name": "osx-arm64" + } + }, + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + }, + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Use a newer version on osx-arm64, linux-arm64, and linux-arm32", + "match": [ + "org.lwjgl.lwjgl:lwjgl_util:2.9.3", + "org.lwjgl.lwjgl:lwjgl_util:2.9.1-nightly-20131120", + "org.lwjgl.lwjgl:lwjgl_util:2.9.1-nightly-20131017", + "org.lwjgl.lwjgl:lwjgl_util:2.9.1-nightly-20130708-debug3", + "org.lwjgl.lwjgl:lwjgl_util:2.9.1" + ], + "override": { + "rules": [ + { + "action": "allow" + }, + { + "action": "disallow", + "os": { + "name": "osx-arm64" + } + }, + { + "action": "disallow", + "os": { + "name": "linux-arm64" + } + }, + { + "action": "disallow", + "os": { + "name": "linux-arm32" + } + } + ] + }, + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "d51a7c040a721d13efdfbd34f8b257b2df882ad0", + "size": 173887, + "url": "https://libraries.minecraft.net/org/lwjgl/lwjgl/lwjgl_util/2.9.4-nightly-20150209/lwjgl_util-2.9.4-nightly-20150209.jar" + } + }, + "name": "org.lwjgl.lwjgl:lwjgl_util:2.9.4-nightly-20150209", + "rules": [ + { + "action": "allow", + "os": { + "name": "osx-arm64" + } + }, + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + }, + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Use a newer patched version on osx-arm64, linux-arm64, and linux-arm32", + "match": [ + "org.lwjgl.lwjgl:lwjgl-platform:2.9.4-nightly-20150209", + "org.lwjgl.lwjgl:lwjgl-platform:2.9.3", + "org.lwjgl.lwjgl:lwjgl-platform:2.9.1-nightly-20131120", + "org.lwjgl.lwjgl:lwjgl-platform:2.9.1-nightly-20131017", + "org.lwjgl.lwjgl:lwjgl-platform:2.9.1-nightly-20130708-debug3", + "org.lwjgl.lwjgl:lwjgl-platform:2.9.1" + ], + "override": { + "downloads": { + "classifiers": { + "natives-osx-arm64": { + "sha1": "eff546c0b319d6ffc7a835652124c18089c67f36", + "size": 488316, + "url": "https://github.com/MinecraftMachina/lwjgl/releases/download/2.9.4-20150209-mmachina.2/lwjgl-platform-2.9.4-nightly-20150209-natives-osx.jar" + }, + "natives-linux-arm64": { + "sha1": "63ac7da0f4a4785c7eadc0f8edc1e9dcc4dd08cb", + "size": 579979, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-2.9.4/lwjgl-platform-2.9.4-nightly-20150209-natives-linux.jar" + }, + "natives-linux-arm32": { + "sha1": "fa483e540a9a753a5ffbb23dcf7879a5bf752611", + "size": 475177, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-2.9.4/lwjgl-platform-2.9.4-nightly-20150209-natives-linux.jar" + } + } + }, + "natives": { + "linux-arm64": "natives-linux-arm64", + "linux-arm32": "natives-linux-arm32", + "osx-arm64": "natives-osx-arm64" + } + } + }, + { + "_comment": "Use a newer patched version on osx-arm64, linux-arm64, and linux-arm32", + "match": [ + "org.lwjgl:lwjgl-glfw:3.2.2", + "org.lwjgl:lwjgl-glfw:3.2.1", + "org.lwjgl:lwjgl-glfw:3.1.6", + "org.lwjgl:lwjgl-glfw:3.1.2" + ], + "override": { + "rules": [ + { + "action": "allow" + }, + { + "action": "disallow", + "os": { + "name": "linux-arm64" + } + }, + { + "action": "disallow", + "os": { + "name": "linux-arm32" + } + }, + { + "action": "disallow", + "os": { + "name": "osx-arm64" + } + } + ] + }, + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "155d175037efc76630940c197ca6dea2b17d7e18", + "size": 108691, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-glfw.jar" + } + }, + "name": "org.lwjgl:lwjgl-glfw:3.2.2-gman64.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "155d175037efc76630940c197ca6dea2b17d7e18", + "size": 108691, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-glfw.jar" + }, + "classifiers": { + "natives-linux-arm64": { + "sha1": "074ad243761147df0d060fbefc814614d2ff75cc", + "size": 85072, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-glfw-natives-linux-arm64.jar" + } + } + }, + "name": "org.lwjgl:lwjgl-glfw:3.2.2-gman64.1", + "natives": { + "linux-arm64": "natives-linux-arm64" + }, + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "99e9a39fa8ed4167e3ff9e04d47eb32c9e69804d", + "size": 108691, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-glfw.jar" + } + }, + "name": "org.lwjgl:lwjgl-glfw:3.2.2-gman32.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "99e9a39fa8ed4167e3ff9e04d47eb32c9e69804d", + "size": 108691, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-glfw.jar" + }, + "classifiers": { + "natives-linux-arm32": { + "sha1": "4265f2fbe3b9d642591165165a17cf406cf7b98e", + "size": 80186, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-glfw-natives-linux-arm32.jar" + } + } + }, + "name": "org.lwjgl:lwjgl-glfw:3.2.2-gman32.1", + "natives": { + "linux-arm32": "natives-linux-arm32" + }, + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "e9a101bca4fa30d26b21b526ff28e7c2d8927f1b", + "size": 130128, + "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-glfw.jar" + } + }, + "name": "org.lwjgl:lwjgl-glfw:3.3.1-mmachina.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "osx-arm64" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "e9a101bca4fa30d26b21b526ff28e7c2d8927f1b", + "size": 130128, + "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-glfw.jar" + }, + "classifiers": { + "natives-osx-arm64": { + "sha1": "71d793d0a5a42e3dfe78eb882abc2523a2c6b496", + "size": 129076, + "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-glfw-natives-macos-arm64.jar" + } + } + }, + "name": "org.lwjgl:lwjgl-glfw:3.3.1-mmachina.1", + "natives": { + "osx-arm64": "natives-osx-arm64" + }, + "rules": [ + { + "action": "allow", + "os": { + "name": "osx-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Use a newer patched version on osx-arm64, linux-arm64, and linux-arm32", + "match": [ + "org.lwjgl:lwjgl-jemalloc:3.2.2", + "org.lwjgl:lwjgl-jemalloc:3.2.1", + "org.lwjgl:lwjgl-jemalloc:3.1.6", + "org.lwjgl:lwjgl-jemalloc:3.1.2" + ], + "override": { + "rules": [ + { + "action": "allow" + }, + { + "action": "disallow", + "os": { + "name": "linux-arm64" + } + }, + { + "action": "disallow", + "os": { + "name": "linux-arm32" + } + }, + { + "action": "disallow", + "os": { + "name": "osx-arm64" + } + } + ] + }, + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "cc04eec29b2fa8c298791af9800a3766d9617954", + "size": 33790, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-jemalloc.jar" + } + }, + "name": "org.lwjgl:lwjgl-jemalloc:3.2.2-gman64.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "cc04eec29b2fa8c298791af9800a3766d9617954", + "size": 33790, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-jemalloc.jar" + }, + "classifiers": { + "natives-linux-arm64": { + "sha1": "762d7d80c9cdf3a3f3fc80c8a5f86612255edfe0", + "size": 156343, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-jemalloc-patched-natives-linux-arm64.jar" + } + } + }, + "name": "org.lwjgl:lwjgl-jemalloc:3.2.2-gman64.2", + "natives": { + "linux-arm64": "natives-linux-arm64" + }, + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "8224ae2e8fc6d8e1a0fc7d84dc917aa3c440620c", + "size": 33790, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-jemalloc.jar" + } + }, + "name": "org.lwjgl:lwjgl-jemalloc:3.2.2-gman32.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "8224ae2e8fc6d8e1a0fc7d84dc917aa3c440620c", + "size": 33790, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-jemalloc.jar" + }, + "classifiers": { + "natives-linux-arm32": { + "sha1": "9163a2a5559ef87bc13ead8fea84417ea3928748", + "size": 134237, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-jemalloc-natives-linux-arm32.jar" + } + } + }, + "name": "org.lwjgl:lwjgl-jemalloc:3.2.2-gman32.1", + "natives": { + "linux-arm32": "natives-linux-arm32" + }, + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "4fb94224378d3588d52d2beb172f2eeafea2d546", + "size": 36976, + "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-jemalloc.jar" + } + }, + "name": "org.lwjgl:lwjgl-jemalloc:3.3.1-mmachina.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "osx-arm64" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "4fb94224378d3588d52d2beb172f2eeafea2d546", + "size": 36976, + "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-jemalloc.jar" + }, + "classifiers": { + "natives-osx-arm64": { + "sha1": "b0be721188d2e7195798780b1c5fe7eafe8091c1", + "size": 103478, + "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-jemalloc-natives-macos-arm64.jar" + } + } + }, + "name": "org.lwjgl:lwjgl-jemalloc:3.3.1-mmachina.1", + "natives": { + "osx-arm64": "natives-osx-arm64" + }, + "rules": [ + { + "action": "allow", + "os": { + "name": "osx-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Use a newer patched version on osx-arm64, linux-arm64, and linux-arm32", + "match": [ + "org.lwjgl:lwjgl-openal:3.2.2", + "org.lwjgl:lwjgl-openal:3.2.1", + "org.lwjgl:lwjgl-openal:3.1.6", + "org.lwjgl:lwjgl-openal:3.1.2" + ], + "override": { + "rules": [ + { + "action": "allow" + }, + { + "action": "disallow", + "os": { + "name": "linux-arm64" + } + }, + { + "action": "disallow", + "os": { + "name": "linux-arm32" + } + }, + { + "action": "disallow", + "os": { + "name": "osx-arm64" + } + } + ] + }, + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "6dfce9dc6a9629c75b2ae01a8df7e7be80ba0261", + "size": 79582, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-openal.jar" + } + }, + "name": "org.lwjgl:lwjgl-openal:3.2.2-gman64.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "6dfce9dc6a9629c75b2ae01a8df7e7be80ba0261", + "size": 79582, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-openal.jar" + }, + "classifiers": { + "natives-linux-arm64": { + "sha1": "948e415b5b2a2c650c25b377a4a9f443b21ce92e", + "size": 469432, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-openal-natives-linux-arm64.jar" + } + } + }, + "name": "org.lwjgl:lwjgl-openal:3.2.2-gman64.1", + "natives": { + "linux-arm64": "natives-linux-arm64" + }, + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "304f0571fd5971621ee6da86a4c1e90f6f52e2ee", + "size": 79582, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-openal.jar" + } + }, + "name": "org.lwjgl:lwjgl-openal:3.2.2-gman32.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "304f0571fd5971621ee6da86a4c1e90f6f52e2ee", + "size": 79582, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-openal.jar" + }, + "classifiers": { + "natives-linux-arm32": { + "sha1": "ecbc981fdd996492a1f6334f003ed62e5a8c0cd5", + "size": 398418, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-openal-natives-linux-arm32.jar" + } + } + }, + "name": "org.lwjgl:lwjgl-openal:3.2.2-gman32.1", + "natives": { + "linux-arm32": "natives-linux-arm32" + }, + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "d48e753d85916fc8a200ccddc709b36e3865cc4e", + "size": 88880, + "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-openal.jar" + } + }, + "name": "org.lwjgl:lwjgl-openal:3.3.1-mmachina.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "osx-arm64" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "d48e753d85916fc8a200ccddc709b36e3865cc4e", + "size": 88880, + "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-openal.jar" + }, + "classifiers": { + "natives-osx-arm64": { + "sha1": "6b80fc0b982a0723b141e88859c42d6f71bd723f", + "size": 346131, + "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-openal-natives-macos-arm64.jar" + } + } + }, + "name": "org.lwjgl:lwjgl-openal:3.3.1-mmachina.1", + "natives": { + "osx-arm64": "natives-osx-arm64" + }, + "rules": [ + { + "action": "allow", + "os": { + "name": "osx-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Use a newer patched version on osx-arm64, linux-arm64, and linux-arm32", + "match": [ + "org.lwjgl:lwjgl-opengl:3.2.2", + "org.lwjgl:lwjgl-opengl:3.2.1", + "org.lwjgl:lwjgl-opengl:3.1.6", + "org.lwjgl:lwjgl-opengl:3.1.2" + ], + "override": { + "rules": [ + { + "action": "allow" + }, + { + "action": "disallow", + "os": { + "name": "linux-arm64" + } + }, + { + "action": "disallow", + "os": { + "name": "linux-arm32" + } + }, + { + "action": "disallow", + "os": { + "name": "osx-arm64" + } + } + ] + }, + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "198bc2f72e0b2eb401eb6f5999aea52909b31ac4", + "size": 937609, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-opengl.jar" + } + }, + "name": "org.lwjgl:lwjgl-opengl:3.2.2-gman64.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "198bc2f72e0b2eb401eb6f5999aea52909b31ac4", + "size": 937609, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-opengl.jar" + }, + "classifiers": { + "natives-linux-arm64": { + "sha1": "bd40897077bf7d12f562da898b18ac2c68e1f9d7", + "size": 56109, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-opengl-natives-linux-arm64.jar" + } + } + }, + "name": "org.lwjgl:lwjgl-opengl:3.2.2-gman64.1", + "natives": { + "linux-arm64": "natives-linux-arm64" + }, + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "9762ae928d02147e716cd82e929b74a97ea9600a", + "size": 937609, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-opengl.jar" + } + }, + "name": "org.lwjgl:lwjgl-opengl:3.2.2-gman32.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "9762ae928d02147e716cd82e929b74a97ea9600a", + "size": 937609, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-opengl.jar" + }, + "classifiers": { + "natives-linux-arm32": { + "sha1": "3af5599c74dd76dd8dbb567b3f9b4963a6abeed5", + "size": 56388, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-opengl-natives-linux-arm32.jar" + } + } + }, + "name": "org.lwjgl:lwjgl-opengl:3.2.2-gman32.1", + "natives": { + "linux-arm32": "natives-linux-arm32" + }, + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "962c2a8d2a8cdd3b89de3d78d766ab5e2133c2f4", + "size": 929233, + "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-opengl.jar" + } + }, + "name": "org.lwjgl:lwjgl-opengl:3.3.1-mmachina.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "osx-arm64" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "962c2a8d2a8cdd3b89de3d78d766ab5e2133c2f4", + "size": 929233, + "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-opengl.jar" + }, + "classifiers": { + "natives-osx-arm64": { + "sha1": "bb575058e0372f515587b5d2d04ff7db185f3ffe", + "size": 41667, + "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-opengl-natives-macos-arm64.jar" + } + } + }, + "name": "org.lwjgl:lwjgl-opengl:3.3.1-mmachina.1", + "natives": { + "osx-arm64": "natives-osx-arm64" + }, + "rules": [ + { + "action": "allow", + "os": { + "name": "osx-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Use a newer patched version on osx-arm64, linux-arm64, and linux-arm32", + "match": [ + "org.lwjgl:lwjgl-stb:3.2.2", + "org.lwjgl:lwjgl-stb:3.2.1", + "org.lwjgl:lwjgl-stb:3.1.6", + "org.lwjgl:lwjgl-stb:3.1.2" + ], + "override": { + "rules": [ + { + "action": "allow" + }, + { + "action": "disallow", + "os": { + "name": "linux-arm64" + } + }, + { + "action": "disallow", + "os": { + "name": "linux-arm32" + } + }, + { + "action": "disallow", + "os": { + "name": "osx-arm64" + } + } + ] + }, + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "46a5735f3eb9d17eb5dcbdd5afa194066d2a6555", + "size": 104075, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-stb.jar" + } + }, + "name": "org.lwjgl:lwjgl-stb:3.2.2-gman64.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "46a5735f3eb9d17eb5dcbdd5afa194066d2a6555", + "size": 104075, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-stb.jar" + }, + "classifiers": { + "natives-linux-arm64": { + "sha1": "077efa7d7ea41b32df5c6078e912e724cccd06db", + "size": 202038, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-stb-natives-linux-arm64.jar" + } + } + }, + "name": "org.lwjgl:lwjgl-stb:3.2.2-gman64.1", + "natives": { + "linux-arm64": "natives-linux-arm64" + }, + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "ea979b0af45b8e689f5f47c989aa8550c148d8a2", + "size": 104075, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-stb.jar" + } + }, + "name": "org.lwjgl:lwjgl-stb:3.2.2-gman32.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "ea979b0af45b8e689f5f47c989aa8550c148d8a2", + "size": 104075, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-stb.jar" + }, + "classifiers": { + "natives-linux-arm32": { + "sha1": "ec9d70aaebd0ff76dfeecf8f00b56118bf3706b1", + "size": 149387, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-stb-natives-linux-arm32.jar" + } + } + }, + "name": "org.lwjgl:lwjgl-stb:3.2.2-gman32.1", + "natives": { + "linux-arm32": "natives-linux-arm32" + }, + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "703e4b533e2542560e9f94d6d8bd148be1c1d572", + "size": 113273, + "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-stb.jar" + } + }, + "name": "org.lwjgl:lwjgl-stb:3.3.1-mmachina.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "osx-arm64" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "703e4b533e2542560e9f94d6d8bd148be1c1d572", + "size": 113273, + "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-stb.jar" + }, + "classifiers": { + "natives-osx-arm64": { + "sha1": "98f0ad956c754723ef354d50057cc30417ef376a", + "size": 178409, + "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-stb-natives-macos-arm64.jar" + } + } + }, + "name": "org.lwjgl:lwjgl-stb:3.3.1-mmachina.1", + "natives": { + "osx-arm64": "natives-osx-arm64" + }, + "rules": [ + { + "action": "allow", + "os": { + "name": "osx-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Use a newer patched version on osx-arm64, linux-arm64, and linux-arm32", + "match": [ + "org.lwjgl:lwjgl-tinyfd:3.2.2", + "org.lwjgl:lwjgl-tinyfd:3.2.1", + "org.lwjgl:lwjgl-tinyfd:3.1.6", + "org.lwjgl:lwjgl-tinyfd:3.1.2" + ], + "override": { + "rules": [ + { + "action": "allow" + }, + { + "action": "disallow", + "os": { + "name": "linux-arm64" + } + }, + { + "action": "disallow", + "os": { + "name": "linux-arm32" + } + }, + { + "action": "disallow", + "os": { + "name": "osx-arm64" + } + } + ] + }, + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "3a75b9811607633bf33c978f53964df1534a4bc1", + "size": 5571, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-tinyfd.jar" + } + }, + "name": "org.lwjgl:lwjgl-tinyfd:3.2.2-gman64.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "3a75b9811607633bf33c978f53964df1534a4bc1", + "size": 5571, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-tinyfd.jar" + }, + "classifiers": { + "natives-linux-arm64": { + "sha1": "37c744ca289b5d7ae155d79e39029488b3254e5b", + "size": 37893, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-tinyfd-natives-linux-arm64.jar" + } + } + }, + "name": "org.lwjgl:lwjgl-tinyfd:3.2.2-gman64.1", + "natives": { + "linux-arm64": "natives-linux-arm64" + }, + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "a8c09f5b7fa24bd53ec329c231b566497a163d5b", + "size": 5571, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-tinyfd.jar" + } + }, + "name": "org.lwjgl:lwjgl-tinyfd:3.2.2-gman32.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "a8c09f5b7fa24bd53ec329c231b566497a163d5b", + "size": 5571, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-tinyfd.jar" + }, + "classifiers": { + "natives-linux-arm32": { + "sha1": "82d16054ada6633297a3108fb6d8bae98800c76f", + "size": 41663, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-tinyfd-natives-linux-arm32.jar" + } + } + }, + "name": "org.lwjgl:lwjgl-tinyfd:3.2.2-gman32.1", + "natives": { + "linux-arm32": "natives-linux-arm32" + }, + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "1203660b3131cbb8681b17ce6437412545be95e0", + "size": 6802, + "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-tinyfd.jar" + } + }, + "name": "org.lwjgl:lwjgl-tinyfd:3.3.1-mmachina.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "osx-arm64" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "1203660b3131cbb8681b17ce6437412545be95e0", + "size": 6802, + "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-tinyfd.jar" + }, + "classifiers": { + "natives-osx-arm64": { + "sha1": "015b931a2daba8f0c317d84c9d14e8e98ae56e0c", + "size": 41384, + "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-tinyfd-natives-macos-arm64.jar" + } + } + }, + "name": "org.lwjgl:lwjgl-tinyfd:3.3.1-mmachina.1", + "natives": { + "osx-arm64": "natives-osx-arm64" + }, + "rules": [ + { + "action": "allow", + "os": { + "name": "osx-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Use a newer patched version on osx-arm64, linux-arm64, and linux-arm32", + "match": [ + "org.lwjgl:lwjgl:3.2.2", + "org.lwjgl:lwjgl:3.2.1", + "org.lwjgl:lwjgl:3.1.6", + "org.lwjgl:lwjgl:3.1.2" + ], + "override": { + "rules": [ + { + "action": "allow" + }, + { + "action": "disallow", + "os": { + "name": "linux-arm64" + } + }, + { + "action": "disallow", + "os": { + "name": "linux-arm32" + } + }, + { + "action": "disallow", + "os": { + "name": "osx-arm64" + } + } + ] + }, + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "360899386df83d6a8407844a94478607af937f97", + "size": 318833, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-core.jar" + } + }, + "name": "org.lwjgl:lwjgl:3.2.2-gman64.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "360899386df83d6a8407844a94478607af937f97", + "size": 318833, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-core.jar" + }, + "classifiers": { + "natives-linux-arm64": { + "sha1": "612efd57d12b2e48e554858eb35e7e2eb46ebb4c", + "size": 87121, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.2.2/lwjgl-natives-linux-arm64.jar" + } + } + }, + "name": "org.lwjgl:lwjgl:3.2.2-gman64.1", + "natives": { + "linux-arm64": "natives-linux-arm64" + }, + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "16ea3934fca417368250d1ddac01a30c1809d317", + "size": 318413, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-core.jar" + } + }, + "name": "org.lwjgl:lwjgl:3.2.2-gman32.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "16ea3934fca417368250d1ddac01a30c1809d317", + "size": 318413, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-core.jar" + }, + "classifiers": { + "natives-linux-arm32": { + "sha1": "6bd0b37fef777a309936a72dc7f63126e8c79ea5", + "size": 90296, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm32/raw/lwjgl-3.2.2/lwjgl-natives-linux-arm32.jar" + } + } + }, + "name": "org.lwjgl:lwjgl:3.2.2-gman32.1", + "natives": { + "linux-arm32": "natives-linux-arm32" + }, + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "8e664dd69ad7bbcf2053da23efc7848e39e498db", + "size": 719038, + "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl.jar" + } + }, + "name": "org.lwjgl:lwjgl:3.3.1-mmachina.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "osx-arm64" + } + } + ] + }, + { + "downloads": { + "artifact": { + "sha1": "8e664dd69ad7bbcf2053da23efc7848e39e498db", + "size": 719038, + "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl.jar" + }, + "classifiers": { + "natives-osx-arm64": { + "sha1": "984df31fadaab86838877b112e5b4e4f68a00ccf", + "size": 42693, + "url": "https://github.com/MinecraftMachina/lwjgl3/releases/download/3.3.1-mmachina.1/lwjgl-natives-macos-arm64.jar" + } + } + }, + "name": "org.lwjgl:lwjgl:3.3.1-mmachina.1", + "natives": { + "osx-arm64": "natives-osx-arm64" + }, + "rules": [ + { + "action": "allow", + "os": { + "name": "osx-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Only allow osx-arm64 for existing LWJGL 3.3.1", + "match": [ + "org.lwjgl:lwjgl-glfw-natives-macos-arm64:3.3.1", + "org.lwjgl:lwjgl-jemalloc-natives-macos-arm64:3.3.1", + "org.lwjgl:lwjgl-openal-natives-macos-arm64:3.3.1", + "org.lwjgl:lwjgl-opengl-natives-macos-arm64:3.3.1", + "org.lwjgl:lwjgl-stb-natives-macos-arm64:3.3.1", + "org.lwjgl:lwjgl-tinyfd-natives-macos-arm64:3.3.1", + "org.lwjgl:lwjgl-natives-macos-arm64:3.3.1" + ], + "override": { + "rules": [ + { + "action": "allow", + "os": { + "name": "osx-arm64" + } + } + ] + } + }, + { + "_comment": "Only allow osx-arm64 for existing java-objc-bridge:1.1", + "match": ["ca.weblite:java-objc-bridge:1.1"], + "override": { + "rules": [ + { + "action": "allow", + "os": { + "name": "osx-arm64" + } + } + ] + } + }, + { + "_comment": "Only allow windows-arm64 for existing LWJGL 3.3.1", + "match": [ + "org.lwjgl:lwjgl-glfw-natives-windows-arm64:3.3.1", + "org.lwjgl:lwjgl-jemalloc-natives-windows-arm64:3.3.1", + "org.lwjgl:lwjgl-openal-natives-windows-arm64:3.3.1", + "org.lwjgl:lwjgl-opengl-natives-windows-arm64:3.3.1", + "org.lwjgl:lwjgl-stb-natives-windows-arm64:3.3.1", + "org.lwjgl:lwjgl-tinyfd-natives-windows-arm64:3.3.1", + "org.lwjgl:lwjgl-natives-windows-arm64:3.3.1" + ], + "override": { + "rules": [ + { + "action": "allow", + "os": { + "name": "windows-arm64" + } + } + ] + } + }, + { + "_comment": "Add linux-arm64 support for LWJGL 3.3.1", + "match": ["org.lwjgl:lwjgl-glfw:3.3.1"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "513eb39b866d0fe131a18d5c517087805433b029", + "size": 112350, + "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl-glfw/lwjgl-glfw-natives-linux-arm64.jar" + } + }, + "name": "org.lwjgl:lwjgl-glfw-natives-linux-arm64:3.3.1-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm64 support for LWJGL 3.3.1", + "match": ["org.lwjgl:lwjgl-jemalloc:3.3.1"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "749be48a9b86ee2c3a2da5fd77511208adcfb33b", + "size": 159993, + "url": "https://github.com/theofficialgman/lwjgl3-binaries-arm64/raw/lwjgl-3.3.1/lwjgl-jemalloc-patched-natives-linux-arm64.jar" + } + }, + "name": "org.lwjgl:lwjgl-jemalloc-natives-linux-arm64:3.3.1-gman64.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm64 support for LWJGL 3.3.1", + "match": ["org.lwjgl:lwjgl-openal:3.3.1"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "cf4e303257e82981b8b2e31bba3d7f8f7b8f42b2", + "size": 470743, + "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl-openal/lwjgl-openal-natives-linux-arm64.jar" + } + }, + "name": "org.lwjgl:lwjgl-openal-natives-linux-arm64:3.3.1-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm64 support for LWJGL 3.3.1", + "match": ["org.lwjgl:lwjgl-opengl:3.3.1"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "1c528fb258a6e63e8fceb4482d8db0f3af10a634", + "size": 57908, + "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl-opengl/lwjgl-opengl-natives-linux-arm64.jar" + } + }, + "name": "org.lwjgl:lwjgl-opengl-natives-linux-arm64:3.3.1-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm64 support for LWJGL 3.3.1", + "match": ["org.lwjgl:lwjgl-stb:3.3.1"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "8e8348a1813aad7f30aaf75ea197151ebb7beba9", + "size": 205491, + "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl-stb/lwjgl-stb-natives-linux-arm64.jar" + } + }, + "name": "org.lwjgl:lwjgl-stb-natives-linux-arm64:3.3.1-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm64 support for LWJGL 3.3.1", + "match": ["org.lwjgl:lwjgl-tinyfd:3.3.1"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "964f628b7a82fd909def086c0dd9a4b84bb259ae", + "size": 42654, + "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl-tinyfd/lwjgl-tinyfd-natives-linux-arm64.jar" + } + }, + "name": "org.lwjgl:lwjgl-tinyfd-natives-linux-arm64:3.3.1-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm64 support for LWJGL 3.3.1", + "match": ["org.lwjgl:lwjgl:3.3.1"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "b597401014acb7196c76d97e15a6288f54f1f692", + "size": 86308, + "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl/lwjgl-natives-linux-arm64.jar" + } + }, + "name": "org.lwjgl:lwjgl-natives-linux-arm64:3.3.1-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm32 support for LWJGL 3.3.1", + "match": ["org.lwjgl:lwjgl-glfw:3.3.1"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "816d935933f2dd743074c4e717cc25b55720f294", + "size": 104027, + "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl-glfw/lwjgl-glfw-natives-linux-arm32.jar" + } + }, + "name": "org.lwjgl:lwjgl-glfw-natives-linux-arm32:3.3.1-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm32 support for LWJGL 3.3.1", + "match": ["org.lwjgl:lwjgl-jemalloc:3.3.1"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "a96a6d6cb3876d7813fcee53c3c24f246aeba3b3", + "size": 136157, + "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl-jemalloc/lwjgl-jemalloc-natives-linux-arm32.jar" + } + }, + "name": "org.lwjgl:lwjgl-jemalloc-natives-linux-arm32:3.3.1-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm32 support for LWJGL 3.3.1", + "match": ["org.lwjgl:lwjgl-openal:3.3.1"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "ffbe35d7fa5ec9b7eca136a7c71f24d4025a510b", + "size": 400129, + "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl-openal/lwjgl-openal-natives-linux-arm32.jar" + } + }, + "name": "org.lwjgl:lwjgl-openal-natives-linux-arm32:3.3.1-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm32 support for LWJGL 3.3.1", + "match": ["org.lwjgl:lwjgl-opengl:3.3.1"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "e3550fa91097fd56e361b4370fa822220fef3595", + "size": 58474, + "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl-opengl/lwjgl-opengl-natives-linux-arm32.jar" + } + }, + "name": "org.lwjgl:lwjgl-opengl-natives-linux-arm32:3.3.1-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm32 support for LWJGL 3.3.1", + "match": ["org.lwjgl:lwjgl-stb:3.3.1"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "b08226bab162c06ae69337d8a1b0ee0a3fdf0b90", + "size": 153889, + "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl-stb/lwjgl-stb-natives-linux-arm32.jar" + } + }, + "name": "org.lwjgl:lwjgl-stb-natives-linux-arm32:3.3.1-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm32 support for LWJGL 3.3.1", + "match": ["org.lwjgl:lwjgl-tinyfd:3.3.1"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "d53d331e859217a61298fcbcf8d79137f3df345c", + "size": 48061, + "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl-tinyfd/lwjgl-tinyfd-natives-linux-arm32.jar" + } + }, + "name": "org.lwjgl:lwjgl-tinyfd-natives-linux-arm32:3.3.1-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm32 support for LWJGL 3.3.1", + "match": ["org.lwjgl:lwjgl:3.3.1"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "41a3c1dd15d6b964eb8196dde69720a3e3e5e969", + "size": 82374, + "url": "https://build.lwjgl.org/release/3.3.1/bin/lwjgl/lwjgl-natives-linux-arm32.jar" + } + }, + "name": "org.lwjgl:lwjgl-natives-linux-arm32:3.3.1-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm64 support for LWJGL 3.3.2", + "match": ["org.lwjgl:lwjgl-freetype:3.3.2"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "896e7d9b8f60d7273f3d491c69270afc67ece3ce", + "size": 1073374, + "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-freetype/lwjgl-freetype-natives-linux-arm64.jar" + } + }, + "name": "org.lwjgl:lwjgl-freetype-natives-linux-arm64:3.3.2-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm64 support for LWJGL 3.3.2", + "match": ["org.lwjgl:lwjgl-glfw:3.3.2"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "bc49e64bae0f7ff103a312ee8074a34c4eb034c7", + "size": 120168, + "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-glfw/lwjgl-glfw-natives-linux-arm64.jar" + } + }, + "name": "org.lwjgl:lwjgl-glfw-natives-linux-arm64:3.3.2-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm64 support for LWJGL 3.3.2", + "match": ["org.lwjgl:lwjgl-jemalloc:3.3.2"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "5249f18a9ae20ea86c5816bc3107a888ce7a17d2", + "size": 206402, + "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-jemalloc/lwjgl-jemalloc-natives-linux-arm64.jar" + } + }, + "name": "org.lwjgl:lwjgl-jemalloc-natives-linux-arm64:3.3.2-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm64 support for LWJGL 3.3.2", + "match": ["org.lwjgl:lwjgl-openal:3.3.2"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "22408980cc579709feaf9acb807992d3ebcf693f", + "size": 590865, + "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-openal/lwjgl-openal-natives-linux-arm64.jar" + } + }, + "name": "org.lwjgl:lwjgl-openal-natives-linux-arm64:3.3.2-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm64 support for LWJGL 3.3.2", + "match": ["org.lwjgl:lwjgl-opengl:3.3.2"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "bb9eb56da6d1d549d6a767218e675e36bc568eb9", + "size": 58627, + "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-opengl/lwjgl-opengl-natives-linux-arm64.jar" + } + }, + "name": "org.lwjgl:lwjgl-opengl-natives-linux-arm64:3.3.2-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm64 support for LWJGL 3.3.2", + "match": ["org.lwjgl:lwjgl-stb:3.3.2"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "11a380c37b0f03cb46db235e064528f84d736ff7", + "size": 207419, + "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-stb/lwjgl-stb-natives-linux-arm64.jar" + } + }, + "name": "org.lwjgl:lwjgl-stb-natives-linux-arm64:3.3.2-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm64 support for LWJGL 3.3.2", + "match": ["org.lwjgl:lwjgl-tinyfd:3.3.2"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "93f8c5bc1984963cd79109891fb5a9d1e580373e", + "size": 43381, + "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-tinyfd/lwjgl-tinyfd-natives-linux-arm64.jar" + } + }, + "name": "org.lwjgl:lwjgl-tinyfd-natives-linux-arm64:3.3.2-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm64 support for LWJGL 3.3.2", + "match": ["org.lwjgl:lwjgl:3.3.2"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "8bd89332c90a90e6bc4aa997a25c05b7db02c90a", + "size": 90795, + "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl/lwjgl-natives-linux-arm64.jar" + } + }, + "name": "org.lwjgl:lwjgl-natives-linux-arm64:3.3.2-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm32 support for LWJGL 3.3.2", + "match": ["org.lwjgl:lwjgl-freetype:3.3.2"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "b7f77ceb951182659fd400437272aa7e96709968", + "size": 924657, + "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-freetype/lwjgl-freetype-natives-linux-arm32.jar" + } + }, + "name": "org.lwjgl:lwjgl-freetype-natives-linux-arm32:3.3.2-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm32 support for LWJGL 3.3.2", + "match": ["org.lwjgl:lwjgl-glfw:3.3.2"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "5907d9a6b7c44fb0612a63bb1cff5992588f65be", + "size": 110067, + "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-glfw/lwjgl-glfw-natives-linux-arm32.jar" + } + }, + "name": "org.lwjgl:lwjgl-glfw-natives-linux-arm32:3.3.2-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm32 support for LWJGL 3.3.2", + "match": ["org.lwjgl:lwjgl-jemalloc:3.3.2"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "9367437ce192e4d6f5725d53d85520644c0b0d6f", + "size": 177571, + "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-jemalloc/lwjgl-jemalloc-natives-linux-arm32.jar" + } + }, + "name": "org.lwjgl:lwjgl-jemalloc-natives-linux-arm32:3.3.2-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm32 support for LWJGL 3.3.2", + "match": ["org.lwjgl:lwjgl-openal:3.3.2"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "7c82bbc33ef49ee4094b216c940db564b2998224", + "size": 503352, + "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-openal/lwjgl-openal-natives-linux-arm32.jar" + } + }, + "name": "org.lwjgl:lwjgl-openal-natives-linux-arm32:3.3.2-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm32 support for LWJGL 3.3.2", + "match": ["org.lwjgl:lwjgl-opengl:3.3.2"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "821f9a2d1d583c44893f42b96f6977682b48a99b", + "size": 59265, + "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-opengl/lwjgl-opengl-natives-linux-arm32.jar" + } + }, + "name": "org.lwjgl:lwjgl-opengl-natives-linux-arm32:3.3.2-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm32 support for LWJGL 3.3.2", + "match": ["org.lwjgl:lwjgl-stb:3.3.2"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "ca9333da184aade20757151f4615f1e27ca521ae", + "size": 154928, + "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-stb/lwjgl-stb-natives-linux-arm32.jar" + } + }, + "name": "org.lwjgl:lwjgl-stb-natives-linux-arm32:3.3.2-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm32 support for LWJGL 3.3.2", + "match": ["org.lwjgl:lwjgl-tinyfd:3.3.2"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "807e220913aa0740449ff90d3b3d825cf5f359ed", + "size": 48788, + "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-tinyfd/lwjgl-tinyfd-natives-linux-arm32.jar" + } + }, + "name": "org.lwjgl:lwjgl-tinyfd-natives-linux-arm32:3.3.2-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm32 support for LWJGL 3.3.2", + "match": ["org.lwjgl:lwjgl:3.3.2"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "afcbfaaa46f217e98a6da4208550f71de1f2a225", + "size": 89347, + "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl/lwjgl-natives-linux-arm32.jar" + } + }, + "name": "org.lwjgl:lwjgl-natives-linux-arm32:3.3.2-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm64 support for LWJGL 3.3.3", + "match": ["org.lwjgl:lwjgl-freetype:3.3.3"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "498965aac06c4a0d42df1fbef6bacd05bde7f974", + "size": 1093516, + "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-freetype/lwjgl-freetype-natives-linux-arm64.jar" + } + }, + "name": "org.lwjgl:lwjgl-freetype-natives-linux-arm64:3.3.3-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm64 support for LWJGL 3.3.3", + "match": ["org.lwjgl:lwjgl-glfw:3.3.3"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "492a0f11f85b85899a6568f07511160c1b87cd38", + "size": 122159, + "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-glfw/lwjgl-glfw-natives-linux-arm64.jar" + } + }, + "name": "org.lwjgl:lwjgl-glfw-natives-linux-arm64:3.3.3-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm64 support for LWJGL 3.3.3", + "match": ["org.lwjgl:lwjgl-jemalloc:3.3.3"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "eff8b86798191192fe2cba2dc2776109f30c239d", + "size": 209315, + "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-jemalloc/lwjgl-jemalloc-natives-linux-arm64.jar" + } + }, + "name": "org.lwjgl:lwjgl-jemalloc-natives-linux-arm64:3.3.3-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm64 support for LWJGL 3.3.3", + "match": ["org.lwjgl:lwjgl-openal:3.3.3"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "ad8f302118a65bb8d615f8a2a680db58fb8f835e", + "size": 592963, + "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-openal/lwjgl-openal-natives-linux-arm64.jar" + } + }, + "name": "org.lwjgl:lwjgl-openal-natives-linux-arm64:3.3.3-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm64 support for LWJGL 3.3.3", + "match": ["org.lwjgl:lwjgl-opengl:3.3.3"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "2096f6b94b2d68745d858fbfe53aacf5f0c8074c", + "size": 58625, + "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-opengl/lwjgl-opengl-natives-linux-arm64.jar" + } + }, + "name": "org.lwjgl:lwjgl-opengl-natives-linux-arm64:3.3.3-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm64 support for LWJGL 3.3.3", + "match": ["org.lwjgl:lwjgl-stb:3.3.3"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "ddc177afc2be1ee8d93684b11363b80589a13fe1", + "size": 207418, + "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-stb/lwjgl-stb-natives-linux-arm64.jar" + } + }, + "name": "org.lwjgl:lwjgl-stb-natives-linux-arm64:3.3.3-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm64 support for LWJGL 3.3.3", + "match": ["org.lwjgl:lwjgl-tinyfd:3.3.3"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "2823a8c955c758d0954d282888075019ef99cec7", + "size": 43864, + "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-tinyfd/lwjgl-tinyfd-natives-linux-arm64.jar" + } + }, + "name": "org.lwjgl:lwjgl-tinyfd-natives-linux-arm64:3.3.3-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm64 support for LWJGL 3.3.3", + "match": ["org.lwjgl:lwjgl:3.3.3"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "f35d8b6ffe1ac1e3a5eb1d4e33de80f044ad5fd8", + "size": 91294, + "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl/lwjgl-natives-linux-arm64.jar" + } + }, + "name": "org.lwjgl:lwjgl-natives-linux-arm64:3.3.3-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm64" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm32 support for LWJGL 3.3.3", + "match": ["org.lwjgl:lwjgl-freetype:3.3.3"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "7dd3b1f751571adaf2c4dc882bc675a5d1e796e6", + "size": 942636, + "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-freetype/lwjgl-freetype-natives-linux-arm32.jar" + } + }, + "name": "org.lwjgl:lwjgl-freetype-natives-linux-arm32:3.3.3-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm32 support for LWJGL 3.3.3", + "match": ["org.lwjgl:lwjgl-glfw:3.3.3"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "d9af485c32545b37dd5359b163161d42d7534dcf", + "size": 112560, + "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-glfw/lwjgl-glfw-natives-linux-arm32.jar" + } + }, + "name": "org.lwjgl:lwjgl-glfw-natives-linux-arm32:3.3.3-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm32 support for LWJGL 3.3.3", + "match": ["org.lwjgl:lwjgl-jemalloc:3.3.3"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "109b6931880d02d4e65ced38928a16e41d19873e", + "size": 178324, + "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-jemalloc/lwjgl-jemalloc-natives-linux-arm32.jar" + } + }, + "name": "org.lwjgl:lwjgl-jemalloc-natives-linux-arm32:3.3.3-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm32 support for LWJGL 3.3.3", + "match": ["org.lwjgl:lwjgl-openal:3.3.3"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "e1702aa09d20359d6cf5cb2999fa7685a785eca7", + "size": 505618, + "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-openal/lwjgl-openal-natives-linux-arm32.jar" + } + }, + "name": "org.lwjgl:lwjgl-openal-natives-linux-arm32:3.3.3-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm32 support for LWJGL 3.3.3", + "match": ["org.lwjgl:lwjgl-opengl:3.3.3"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "dbba17fc5ac0985d14a57c11f9537617d67b9952", + "size": 59263, + "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-opengl/lwjgl-opengl-natives-linux-arm32.jar" + } + }, + "name": "org.lwjgl:lwjgl-opengl-natives-linux-arm32:3.3.3-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm32 support for LWJGL 3.3.3", + "match": ["org.lwjgl:lwjgl-stb:3.3.3"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "1ae28ff044699ff29b0e980ffabd73fba8a664b3", + "size": 154931, + "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-stb/lwjgl-stb-natives-linux-arm32.jar" + } + }, + "name": "org.lwjgl:lwjgl-stb-natives-linux-arm32:3.3.3-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm32 support for LWJGL 3.3.3", + "match": ["org.lwjgl:lwjgl-tinyfd:3.3.3"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "c2a0a05c82c4b9f69ded0b6ad5f417addea78ce2", + "size": 49495, + "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl-tinyfd/lwjgl-tinyfd-natives-linux-arm32.jar" + } + }, + "name": "org.lwjgl:lwjgl-tinyfd-natives-linux-arm32:3.3.3-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Add linux-arm32 support for LWJGL 3.3.3", + "match": ["org.lwjgl:lwjgl:3.3.3"], + "additionalLibraries": [ + { + "downloads": { + "artifact": { + "sha1": "2075c51a80f0ef0f22ba616ba54007ac2b0debd4", + "size": 89565, + "url": "https://build.lwjgl.org/release/3.3.3/bin/lwjgl/lwjgl-natives-linux-arm32.jar" + } + }, + "name": "org.lwjgl:lwjgl-natives-linux-arm32:3.3.3-lwjgl.1", + "rules": [ + { + "action": "allow", + "os": { + "name": "linux-arm32" + } + } + ] + } + ] + }, + { + "_comment": "Replace glfw from 3.3.1 with version from 3.3.2 to prevent stack smashing", + "match": [ + "org.lwjgl:lwjgl-glfw-natives-linux:3.3.1", + "org.lwjgl:lwjgl-glfw:3.3.1:natives-linux" + ], + "override": { + "downloads": { + "artifact": { + "sha1": "0766bb0e8e829598b1c8052fd8173c62af741c52", + "size": 115553, + "url": "https://build.lwjgl.org/release/3.3.2/bin/lwjgl-glfw/lwjgl-glfw-natives-linux.jar" + } + }, + "name": "org.lwjgl:lwjgl-glfw-natives-linux:3.3.2-lwjgl.1" + } + } ] diff --git a/apps/daedalus_client/package.json b/apps/daedalus_client/package.json index f75b9d768..e7e94f8a6 100644 --- a/apps/daedalus_client/package.json +++ b/apps/daedalus_client/package.json @@ -1,13 +1,15 @@ { - "name": "@modrinth/daedalus_client", - "scripts": { - "build": "cargo build --release", - "lint": "cargo fmt --check && cargo clippy --all-targets", - "fix": "cargo clippy --all-targets --fix --allow-dirty && cargo fmt", - "dev": "cargo run", - "test": "cargo nextest run --all-targets --no-fail-fast" - }, - "dependencies": { - "@modrinth/daedalus": "workspace:*" - } + "name": "@modrinth/daedalus_client", + "scripts": { + "build": "cargo build --release", + "lint": "cargo fmt --check && cargo clippy --all-targets", + "lint:ancillary": "prettier --check .", + "fix": "cargo clippy --all-targets --fix --allow-dirty && cargo fmt", + "fix:ancillary": "prettier --write .", + "dev": "cargo run", + "test": "cargo nextest run --all-targets --no-fail-fast" + }, + "dependencies": { + "@modrinth/daedalus": "workspace:*" + } } diff --git a/apps/docs/.prettierignore b/apps/docs/.prettierignore new file mode 100644 index 000000000..abc768122 --- /dev/null +++ b/apps/docs/.prettierignore @@ -0,0 +1 @@ +**/*.svg diff --git a/apps/docs/.vscode/extensions.json b/apps/docs/.vscode/extensions.json index 22a15055d..3a1c9ecdb 100644 --- a/apps/docs/.vscode/extensions.json +++ b/apps/docs/.vscode/extensions.json @@ -1,4 +1,4 @@ { - "recommendations": ["astro-build.astro-vscode"], - "unwantedRecommendations": [] + "recommendations": ["astro-build.astro-vscode"], + "unwantedRecommendations": [] } diff --git a/apps/docs/.vscode/launch.json b/apps/docs/.vscode/launch.json index d64220976..230708db4 100644 --- a/apps/docs/.vscode/launch.json +++ b/apps/docs/.vscode/launch.json @@ -1,11 +1,11 @@ { - "version": "0.2.0", - "configurations": [ - { - "command": "./node_modules/.bin/astro dev", - "name": "Development server", - "request": "launch", - "type": "node-terminal" - } - ] + "version": "0.2.0", + "configurations": [ + { + "command": "./node_modules/.bin/astro dev", + "name": "Development server", + "request": "launch", + "type": "node-terminal" + } + ] } diff --git a/apps/docs/astro.config.mjs b/apps/docs/astro.config.mjs index 3baeb6f4f..63e97938d 100644 --- a/apps/docs/astro.config.mjs +++ b/apps/docs/astro.config.mjs @@ -4,53 +4,53 @@ import starlightOpenAPI, { openAPISidebarGroups } from 'starlight-openapi' // https://astro.build/config export default defineConfig({ - site: 'https://docs.modrinth.com', - integrations: [ - starlight({ - title: 'Modrinth Documentation', - favicon: '/favicon.ico', - editLink: { - baseUrl: 'https://github.com/modrinth/code/edit/main/apps/docs/', - }, - social: { - github: 'https://github.com/modrinth/code', - discord: 'https://discord.modrinth.com', - 'x.com': 'https://x.com/modrinth', - mastodon: 'https://floss.social/@modrinth', - threads: 'https://threads.net/@modrinth', - }, - logo: { - light: './src/assets/light-logo.svg', - dark: './src/assets/dark-logo.svg', - replacesTitle: true, - }, - customCss: [ - '@modrinth/assets/styles/variables.scss', - '@modrinth/assets/styles/inter.scss', - './src/styles/modrinth.css', - ], - plugins: [ - // Generate the OpenAPI documentation pages. - starlightOpenAPI([ - { - base: 'api', - label: 'Modrinth API', - schema: './public/openapi.yaml', - }, - ]), - ], - sidebar: [ - { - label: 'Contributing to Modrinth', - autogenerate: { directory: 'contributing' }, - }, - { - label: 'Guides', - autogenerate: { directory: 'guide' }, - }, - // Add the generated sidebar group to the sidebar. - ...openAPISidebarGroups, - ], - }), - ], + site: 'https://docs.modrinth.com', + integrations: [ + starlight({ + title: 'Modrinth Documentation', + favicon: '/favicon.ico', + editLink: { + baseUrl: 'https://github.com/modrinth/code/edit/main/apps/docs/', + }, + social: { + github: 'https://github.com/modrinth/code', + discord: 'https://discord.modrinth.com', + 'x.com': 'https://x.com/modrinth', + mastodon: 'https://floss.social/@modrinth', + threads: 'https://threads.net/@modrinth', + }, + logo: { + light: './src/assets/light-logo.svg', + dark: './src/assets/dark-logo.svg', + replacesTitle: true, + }, + customCss: [ + '@modrinth/assets/styles/variables.scss', + '@modrinth/assets/styles/inter.scss', + './src/styles/modrinth.css', + ], + plugins: [ + // Generate the OpenAPI documentation pages. + starlightOpenAPI([ + { + base: 'api', + label: 'Modrinth API', + schema: './public/openapi.yaml', + }, + ]), + ], + sidebar: [ + { + label: 'Contributing to Modrinth', + autogenerate: { directory: 'contributing' }, + }, + { + label: 'Guides', + autogenerate: { directory: 'guide' }, + }, + // Add the generated sidebar group to the sidebar. + ...openAPISidebarGroups, + ], + }), + ], }) diff --git a/apps/docs/package.json b/apps/docs/package.json index 274ddd55c..4dc9a77b2 100644 --- a/apps/docs/package.json +++ b/apps/docs/package.json @@ -1,22 +1,24 @@ { - "name": "@modrinth/docs", - "type": "module", - "version": "0.0.1", - "scripts": { - "dev": "astro dev", - "start": "astro dev", - "lint": "astro check", - "build": "astro build", - "preview": "astro preview", - "astro": "astro" - }, - "dependencies": { - "@astrojs/check": "^0.9.4", - "@astrojs/starlight": "^0.32.2", - "@modrinth/assets": "workspace:*", - "astro": "^5.4.1", - "sharp": "^0.33.5", - "starlight-openapi": "^0.14.0", - "typescript": "^5.8.2" - } + "name": "@modrinth/docs", + "type": "module", + "version": "0.0.1", + "scripts": { + "dev": "astro dev", + "start": "astro dev", + "lint": "astro check", + "lint:ancillary": "prettier --check .", + "fix:ancillary": "prettier --write .", + "build": "astro build", + "preview": "astro preview", + "astro": "astro" + }, + "dependencies": { + "@astrojs/check": "^0.9.4", + "@astrojs/starlight": "^0.32.2", + "@modrinth/assets": "workspace:*", + "astro": "^5.4.1", + "sharp": "^0.33.5", + "starlight-openapi": "^0.14.0", + "typescript": "^5.8.2" + } } diff --git a/apps/docs/src/content.config.ts b/apps/docs/src/content.config.ts index 6a7b7a02b..8fa5a4360 100644 --- a/apps/docs/src/content.config.ts +++ b/apps/docs/src/content.config.ts @@ -1,7 +1,7 @@ -import { defineCollection } from 'astro:content'; -import { docsLoader } from '@astrojs/starlight/loaders'; -import { docsSchema } from '@astrojs/starlight/schema'; +import { defineCollection } from 'astro:content' +import { docsLoader } from '@astrojs/starlight/loaders' +import { docsSchema } from '@astrojs/starlight/schema' export const collections = { - docs: defineCollection({ loader: docsLoader(), schema: docsSchema() }), -}; + docs: defineCollection({ loader: docsLoader(), schema: docsSchema() }), +} diff --git a/apps/docs/src/content/docs/guide/oauth.md b/apps/docs/src/content/docs/guide/oauth.md index a7833b103..33827eb51 100644 --- a/apps/docs/src/content/docs/guide/oauth.md +++ b/apps/docs/src/content/docs/guide/oauth.md @@ -8,7 +8,7 @@ Modrinth allows developers to create applications which, once authorized by a Mo If you're familiar with OAuth 2, these are the URLs you will need: | Name | URL | -|--------------------|--------------------------------------------------| +| ------------------ | ------------------------------------------------ | | Authorization page | `https://modrinth.com/auth/authorize` | | Token exchange | `https://api.modrinth.com/_internal/oauth/token` | @@ -31,7 +31,7 @@ After you've registered your application, it is important that you take note of Once the user is ready to authorize your application, you need to construct a URL to redirect them to. The authorization URL for Modrinth is `https://api.modrinth.com/_internal/oauth/token`. Supply the following query parameters: | Query parameter | Description | -|-----------------|-------------------------------------------------------------------------------------------| +| --------------- | ----------------------------------------------------------------------------------------- | | `response_type` | In Modrinth this always needs to be `code`, since only code grants are supported | | `client_id` | The application identifier found in the settings | | `scope` | The permissions you need access to | @@ -45,7 +45,7 @@ The scope identifiers are currently best found in the backend source code locate The redirect URI is the endpoint on your server that will receive the code which can eventually be used to act on the user's behalf. For security reasons the redirect URI used has to be allowlisted in your application settings. The redirect will contain the following query parameters: | Query parameter | Description | -|-----------------|----------------------------------------------------| +| --------------- | -------------------------------------------------- | | `code` | The code that can be exchanged for an access token | | `client_id` | Your client id | | `redirect_uri` | The redirect URI which was used | @@ -58,7 +58,7 @@ If you've followed the previous section on getting authorization, you should now In the body use these fields: | Field | Description | -|----------------|--------------------------------------------------------------| +| -------------- | ------------------------------------------------------------ | | `code` | The authorization code | | `client_id` | Your client id, the same as in the authorization request | | `redirect_uri` | The redirect URI which was redirected to after authorization | @@ -67,7 +67,7 @@ In the body use these fields: If the request succeeds, you should receive a JSON payload with these fields: | Field | Description | -|----------------|------------------------------------------------------| +| -------------- | ---------------------------------------------------- | | `access_token` | The access token you can use to access the API | | `token_type` | Currently only `Bearer` | | `expires_in` | The amount of seconds until the access token expires | @@ -77,19 +77,11 @@ To use this access token, you attach it to API requests in the `Authorization` h If you have any questions, you're welcome to ask in #api-development in the [Discord guild], or create a ticket on the [support portal]. [RFC 6749]: https://datatracker.ietf.org/doc/html/rfc6749 - [register an application]: https://modrinth.com/settings/applications - [principle of least privilege]: https://en.wikipedia.org/wiki/Principle_of_least_privilege - [`apps/labrinth/src/models/v3/pats.rs`]: https://github.com/modrinth/code/blob/main/apps/labrinth/src/models/v3/pats.rs - [CSRF]: https://en.wikipedia.org/wiki/Cross-site_request_forgery - [Clickjacking]: https://en.wikipedia.org/wiki/Clickjacking - [`/user` endpoint]: https://docs.modrinth.com/api/operations/getuserfromauth/ - [Discord guild]: https://discord.modrinth.com - [support portal]: https://support.modrinth.com/en/ diff --git a/apps/docs/src/styles/modrinth.css b/apps/docs/src/styles/modrinth.css index 4b35aa62f..4f149c26a 100644 --- a/apps/docs/src/styles/modrinth.css +++ b/apps/docs/src/styles/modrinth.css @@ -2,53 +2,53 @@ ::backdrop, :root[data-theme='light'], [data-theme='light'] ::backdrop { - --sl-font-system: Inter, -apple-system, BlinkMacSystemFont, Segoe UI, Oxygen, Ubuntu, Roboto, - Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; + --sl-font-system: Inter, -apple-system, BlinkMacSystemFont, Segoe UI, Oxygen, Ubuntu, Roboto, + Cantarell, Fira Sans, Droid Sans, Helvetica Neue, sans-serif; - --sl-color-white: var(--color-contrast); /* “white” */ - --sl-color-gray-1: var(--color-base); - --sl-color-gray-2: var(--color-base); - --sl-color-gray-3: var(--color-base); - --sl-color-gray-4: var(--color-raised-bg); - --sl-color-gray-5: var(--color-button-bg); - --sl-color-gray-6: var(--color-raised-bg); - --sl-color-black: var(--color-accent-contrast); + --sl-color-white: var(--color-contrast); /* “white” */ + --sl-color-gray-1: var(--color-base); + --sl-color-gray-2: var(--color-base); + --sl-color-gray-3: var(--color-base); + --sl-color-gray-4: var(--color-raised-bg); + --sl-color-gray-5: var(--color-button-bg); + --sl-color-gray-6: var(--color-raised-bg); + --sl-color-black: var(--color-accent-contrast); - --sl-color-accent-low: var(--color-green-highlight); - --sl-color-accent: var(--color-brand); - --sl-color-accent-high: var(--color-brand-highlight); + --sl-color-accent-low: var(--color-green-highlight); + --sl-color-accent: var(--color-brand); + --sl-color-accent-high: var(--color-brand-highlight); - --sl-color-orange-low: var(--color-orange-highlight); - --sl-color-orange: var(--color-orange); - --sl-color-orange-high: var(--color-orange-highlight); + --sl-color-orange-low: var(--color-orange-highlight); + --sl-color-orange: var(--color-orange); + --sl-color-orange-high: var(--color-orange-highlight); - --sl-color-green-low: var(--color-green-highlight); - --sl-color-green: var(--color-green); - --sl-color-green-high: var(--color-green-highlight); + --sl-color-green-low: var(--color-green-highlight); + --sl-color-green: var(--color-green); + --sl-color-green-high: var(--color-green-highlight); - --sl-color-blue-low: var(--color-blue-highlight); - --sl-color-blue: var(--color-blue); - --sl-color-blue-high: var(--color-blue-highlight); + --sl-color-blue-low: var(--color-blue-highlight); + --sl-color-blue: var(--color-blue); + --sl-color-blue-high: var(--color-blue-highlight); - --sl-color-purple-low: var(--color-purple-highlight); - --sl-color-purple: var(--color-purple); - --sl-color-purple-high: var(--color-purple-highlight); + --sl-color-purple-low: var(--color-purple-highlight); + --sl-color-purple: var(--color-purple); + --sl-color-purple-high: var(--color-purple-highlight); - --sl-color-red-low: var(--color-red-highlight); - --sl-color-red: var(--color-red); - --sl-color-red-high: var(--color-red-highlight); + --sl-color-red-low: var(--color-red-highlight); + --sl-color-red: var(--color-red); + --sl-color-red-high: var(--color-red-highlight); - --sl-color-text: var(--color-base); - --sl-color-text-accent: var(--color-brand); - --sl-color-text-invert: var(--color-accent-contrast); - --sl-color-bg: var(--color-bg); - --sl-color-bg-nav: var(--color-raised-bg); - --sl-color-bg-sidebar: var(--color-raised-bg); - --sl-color-bg-inline-code: var(--color-button-bg); - --sl-color-bg-accent: var(--color-brand-highlight); + --sl-color-text: var(--color-base); + --sl-color-text-accent: var(--color-brand); + --sl-color-text-invert: var(--color-accent-contrast); + --sl-color-bg: var(--color-bg); + --sl-color-bg-nav: var(--color-raised-bg); + --sl-color-bg-sidebar: var(--color-raised-bg); + --sl-color-bg-inline-code: var(--color-button-bg); + --sl-color-bg-accent: var(--color-brand-highlight); } :root[data-theme='light'], [data-theme='light'] ::backdrop { - --sl-color-bg: var(--color-raised-bg); + --sl-color-bg: var(--color-raised-bg); } diff --git a/apps/docs/tsconfig.json b/apps/docs/tsconfig.json index bcbf8b509..a3f698102 100644 --- a/apps/docs/tsconfig.json +++ b/apps/docs/tsconfig.json @@ -1,3 +1,3 @@ { - "extends": "astro/tsconfigs/strict" + "extends": "astro/tsconfigs/strict" } diff --git a/apps/frontend/.prettierignore b/apps/frontend/.prettierignore index 6ffea3b77..d4f9ef965 100644 --- a/apps/frontend/.prettierignore +++ b/apps/frontend/.prettierignore @@ -3,3 +3,5 @@ **/.output src/generated/** src/locales/** +src/public/news/feed +src/assets/**/*.svg diff --git a/apps/frontend/package.json b/apps/frontend/package.json index 3627f6913..a4c0fe7ff 100644 --- a/apps/frontend/package.json +++ b/apps/frontend/package.json @@ -72,5 +72,5 @@ "xss": "^1.0.14" }, "web-types": "../../web-types.json", - "prettier": "@modrinth/tooling-config/prettier.nuxt.config.js" + "prettier": "@modrinth/tooling-config/frontend.prettier.config.cjs" } diff --git a/apps/frontend/src/public/news/feed/articles.json b/apps/frontend/src/public/news/feed/articles.json index ba0c02899..2ec116ca1 100644 --- a/apps/frontend/src/public/news/feed/articles.json +++ b/apps/frontend/src/public/news/feed/articles.json @@ -1,186 +1,186 @@ { - "articles": [ - { - "title": "Skins — Now in Modrinth App!", - "summary": "Customize your look, save your favorite skins, and swap them out in a flash, all within Modrinth App.", - "thumbnail": "https://modrinth.com/news/article/skins-now-in-modrinth-app/thumbnail.webp", - "date": "2025-07-06T23:45:00.000Z", - "link": "https://modrinth.com/news/article/skins-now-in-modrinth-app" - }, - { - "title": "Creator Updates, July 2025", - "summary": "Addressing recent growth and growing pains that have been affecting creators.", - "thumbnail": "https://modrinth.com/news/default.webp", - "date": "2025-07-02T04:20:00.000Z", - "link": "https://modrinth.com/news/article/creator-updates-july-2025" - }, - { - "title": "A Pride Month Success: Over $8,400 Raised for The Trevor Project!", - "summary": "Reflecting on our Pride Month fundraiser campaign for LGBTQ+ youth.", - "thumbnail": "https://modrinth.com/news/article/pride-campaign-2025/thumbnail.webp", - "date": "2025-07-01T18:00:00.000Z", - "link": "https://modrinth.com/news/article/pride-campaign-2025" - }, - { - "title": "A New Chapter for Modrinth Servers", - "summary": "Modrinth Servers is now fully operated in-house by the Modrinth Team.", - "thumbnail": "https://modrinth.com/news/article/a-new-chapter-for-modrinth-servers/thumbnail.webp", - "date": "2025-03-13T00:00:00.000Z", - "link": "https://modrinth.com/news/article/a-new-chapter-for-modrinth-servers" - }, - { - "title": "Host your own server with Modrinth Servers — now in beta", - "summary": "Fast, simple, reliable servers directly integrated into Modrinth.", - "thumbnail": "https://modrinth.com/news/article/modrinth-servers-beta/thumbnail.webp", - "date": "2024-11-03T06:00:00.000Z", - "link": "https://modrinth.com/news/article/modrinth-servers-beta" - }, - { - "title": "Quintupling Creator Revenue and Becoming Sustainable", - "summary": "Announcing an update to our monetization program, creator split, and more!", - "thumbnail": "https://modrinth.com/news/article/becoming-sustainable/thumbnail.webp", - "date": "2024-09-13T20:00:00.000Z", - "link": "https://modrinth.com/news/article/becoming-sustainable" - }, - { - "title": "Introducing Modrinth+, a refreshed site look, and a new advertising system!", - "summary": "Learn about this major update to Modrinth.", - "thumbnail": "https://modrinth.com/news/article/design-refresh/thumbnail.webp", - "date": "2024-08-21T20:00:00.000Z", - "link": "https://modrinth.com/news/article/design-refresh" - }, - { - "title": "Malware Discovery Disclosure: \"Windows Borderless\" mod", - "summary": "Threat Analysis and Plan of Action", - "thumbnail": "https://modrinth.com/news/article/windows-borderless-malware-disclosure/thumbnail.webp", - "date": "2024-05-07T20:00:00.000Z", - "link": "https://modrinth.com/news/article/windows-borderless-malware-disclosure" - }, - { - "title": "A Sustainable Path Forward for Modrinth", - "summary": "Our capital return and what’s next.", - "thumbnail": "https://modrinth.com/news/default.webp", - "date": "2024-04-04T20:00:00.000Z", - "link": "https://modrinth.com/news/article/capital-return" - }, - { - "title": "Creator Update: Analytics, Organizations, Collections, and more", - "summary": "December may be over, but we’re not done giving gifts.", - "thumbnail": "https://modrinth.com/news/article/creator-update/thumbnail.webp", - "date": "2024-01-06T20:00:00.000Z", - "link": "https://modrinth.com/news/article/creator-update" - }, - { - "title": "Correcting Inflated Download Counts due to Rate Limiting Issue", - "summary": "A rate limiting issue caused inflated download counts in certain countries.", - "thumbnail": "https://modrinth.com/news/default.webp", - "date": "2023-11-10T20:00:00.000Z", - "link": "https://modrinth.com/news/article/download-adjustment" - }, - { - "title": "Introducing Modrinth App Beta", - "summary": "Changing the modded Minecraft landscape with the new Modrinth App, alongside several other major features.", - "thumbnail": "https://modrinth.com/news/default.webp", - "date": "2023-08-05T20:00:00.000Z", - "link": "https://modrinth.com/news/article/modrinth-app-beta" - }, - { - "title": "(April Fools 2023) Powering up your experience: Modrinth Technologies™️ beta launch!", - "summary": "Welcome to the new era of Modrinth. We can't wait to hear your feedback.", - "thumbnail": "https://modrinth.com/news/article/new-site-beta/thumbnail.webp", - "date": "2023-04-01T08:00:00.000Z", - "link": "https://modrinth.com/news/article/new-site-beta" - }, - { - "title": "Accelerating Modrinth's Development", - "summary": "Our fundraiser and the future of Modrinth!", - "thumbnail": "https://modrinth.com/news/default.webp", - "date": "2023-02-01T20:00:00.000Z", - "link": "https://modrinth.com/news/article/accelerating-development" - }, - { - "title": "Modrinth's Anniversary Update", - "summary": "Marking two years of Modrinth and discussing our New Year's Resolutions for 2023.", - "thumbnail": "https://modrinth.com/news/article/two-years-of-modrinth/thumbnail.webp", - "date": "2023-01-07T00:00:00.000Z", - "link": "https://modrinth.com/news/article/two-years-of-modrinth" - }, - { - "title": "Two years of Modrinth: a retrospective", - "summary": "The history of Modrinth as we know it from December 2020 to December 2022.", - "thumbnail": "https://modrinth.com/news/default.webp", - "date": "2023-01-07T00:00:00.000Z", - "link": "https://modrinth.com/news/article/two-years-of-modrinth-history" - }, - { - "title": "Creators can now make money on Modrinth!", - "summary": "Introducing the Creator Monetization Program allowing creators to earn revenue from their projects.", - "thumbnail": "https://modrinth.com/news/article/creator-monetization/thumbnail.webp", - "date": "2022-11-12T00:00:00.000Z", - "link": "https://modrinth.com/news/article/creator-monetization" - }, - { - "title": "Modrinth's Carbon Ads experiment", - "summary": "Experimenting with a different ad providers to find one which one works for us.", - "thumbnail": "https://modrinth.com/news/article/carbon-ads/thumbnail.webp", - "date": "2022-09-08T00:00:00.000Z", - "link": "https://modrinth.com/news/article/carbon-ads" - }, - { - "title": "Plugins and Resource Packs now have a home on Modrinth", - "summary": "A small update with a big impact: plugins and resource packs are now available on Modrinth!", - "thumbnail": "https://modrinth.com/news/article/plugins-resource-packs/thumbnail.webp", - "date": "2022-08-27T00:00:00.000Z", - "link": "https://modrinth.com/news/article/plugins-resource-packs" - }, - { - "title": "Changes to Modrinth Modpacks", - "summary": "CurseForge CDN links requested to be removed by the end of the month", - "thumbnail": "https://modrinth.com/news/article/modpack-changes/thumbnail.webp", - "date": "2022-05-28T00:00:00.000Z", - "link": "https://modrinth.com/news/article/modpack-changes" - }, - { - "title": "Modrinth Modpacks: Now in alpha testing", - "summary": "After over a year of development, we're happy to announce that modpack support is now in alpha testing.", - "thumbnail": "https://modrinth.com/news/article/modpacks-alpha/thumbnail.webp", - "date": "2022-05-15T00:00:00.000Z", - "link": "https://modrinth.com/news/article/modpacks-alpha" - }, - { - "title": "This week in Modrinth development: Filters and Fixes", - "summary": "Continuing to improve the user interface after a great first week since Modrinth launched out of beta.", - "thumbnail": "https://modrinth.com/news/article/knossos-v2.1.0/thumbnail.webp", - "date": "2022-03-09T00:00:00.000Z", - "link": "https://modrinth.com/news/article/knossos-v2.1.0" - }, - { - "title": "Now showing on Modrinth: A new look!", - "summary": "Releasing many new features and improvements, including a redesign!", - "thumbnail": "https://modrinth.com/news/article/redesign/thumbnail.webp", - "date": "2022-02-27T00:00:00.000Z", - "link": "https://modrinth.com/news/article/redesign" - }, - { - "title": "Beginner's Guide to Licensing your Mods", - "summary": "Software licenses; the nitty-gritty legal aspect of software development. They're more important than you think.", - "thumbnail": "https://modrinth.com/news/article/licensing-guide/thumbnail.webp", - "date": "2021-05-16T00:00:00.000Z", - "link": "https://modrinth.com/news/article/licensing-guide" - }, - { - "title": "Welcome to Modrinth Beta", - "summary": "After six months of work, Modrinth enters Beta, helping modders host their mods with ease!", - "thumbnail": "https://modrinth.com/news/article/modrinth-beta/thumbnail.webp", - "date": "2020-12-01T00:00:00.000Z", - "link": "https://modrinth.com/news/article/modrinth-beta" - }, - { - "title": "What is Modrinth?", - "summary": "Hello, we are Modrinth – an open source mods hosting platform. Sounds dry, doesn't it? So let me tell you our story – and I promise, it won't be boring!", - "thumbnail": "https://modrinth.com/news/default.webp", - "date": "2020-11-27T00:00:00.000Z", - "link": "https://modrinth.com/news/article/whats-modrinth" - } - ] + "articles": [ + { + "title": "Skins — Now in Modrinth App!", + "summary": "Customize your look, save your favorite skins, and swap them out in a flash, all within Modrinth App.", + "thumbnail": "https://modrinth.com/news/article/skins-now-in-modrinth-app/thumbnail.webp", + "date": "2025-07-06T23:45:00.000Z", + "link": "https://modrinth.com/news/article/skins-now-in-modrinth-app" + }, + { + "title": "Creator Updates, July 2025", + "summary": "Addressing recent growth and growing pains that have been affecting creators.", + "thumbnail": "https://modrinth.com/news/default.webp", + "date": "2025-07-02T04:20:00.000Z", + "link": "https://modrinth.com/news/article/creator-updates-july-2025" + }, + { + "title": "A Pride Month Success: Over $8,400 Raised for The Trevor Project!", + "summary": "Reflecting on our Pride Month fundraiser campaign for LGBTQ+ youth.", + "thumbnail": "https://modrinth.com/news/article/pride-campaign-2025/thumbnail.webp", + "date": "2025-07-01T18:00:00.000Z", + "link": "https://modrinth.com/news/article/pride-campaign-2025" + }, + { + "title": "A New Chapter for Modrinth Servers", + "summary": "Modrinth Servers is now fully operated in-house by the Modrinth Team.", + "thumbnail": "https://modrinth.com/news/article/a-new-chapter-for-modrinth-servers/thumbnail.webp", + "date": "2025-03-13T00:00:00.000Z", + "link": "https://modrinth.com/news/article/a-new-chapter-for-modrinth-servers" + }, + { + "title": "Host your own server with Modrinth Servers — now in beta", + "summary": "Fast, simple, reliable servers directly integrated into Modrinth.", + "thumbnail": "https://modrinth.com/news/article/modrinth-servers-beta/thumbnail.webp", + "date": "2024-11-03T06:00:00.000Z", + "link": "https://modrinth.com/news/article/modrinth-servers-beta" + }, + { + "title": "Quintupling Creator Revenue and Becoming Sustainable", + "summary": "Announcing an update to our monetization program, creator split, and more!", + "thumbnail": "https://modrinth.com/news/article/becoming-sustainable/thumbnail.webp", + "date": "2024-09-13T20:00:00.000Z", + "link": "https://modrinth.com/news/article/becoming-sustainable" + }, + { + "title": "Introducing Modrinth+, a refreshed site look, and a new advertising system!", + "summary": "Learn about this major update to Modrinth.", + "thumbnail": "https://modrinth.com/news/article/design-refresh/thumbnail.webp", + "date": "2024-08-21T20:00:00.000Z", + "link": "https://modrinth.com/news/article/design-refresh" + }, + { + "title": "Malware Discovery Disclosure: \"Windows Borderless\" mod", + "summary": "Threat Analysis and Plan of Action", + "thumbnail": "https://modrinth.com/news/article/windows-borderless-malware-disclosure/thumbnail.webp", + "date": "2024-05-07T20:00:00.000Z", + "link": "https://modrinth.com/news/article/windows-borderless-malware-disclosure" + }, + { + "title": "A Sustainable Path Forward for Modrinth", + "summary": "Our capital return and what’s next.", + "thumbnail": "https://modrinth.com/news/default.webp", + "date": "2024-04-04T20:00:00.000Z", + "link": "https://modrinth.com/news/article/capital-return" + }, + { + "title": "Creator Update: Analytics, Organizations, Collections, and more", + "summary": "December may be over, but we’re not done giving gifts.", + "thumbnail": "https://modrinth.com/news/article/creator-update/thumbnail.webp", + "date": "2024-01-06T20:00:00.000Z", + "link": "https://modrinth.com/news/article/creator-update" + }, + { + "title": "Correcting Inflated Download Counts due to Rate Limiting Issue", + "summary": "A rate limiting issue caused inflated download counts in certain countries.", + "thumbnail": "https://modrinth.com/news/default.webp", + "date": "2023-11-10T20:00:00.000Z", + "link": "https://modrinth.com/news/article/download-adjustment" + }, + { + "title": "Introducing Modrinth App Beta", + "summary": "Changing the modded Minecraft landscape with the new Modrinth App, alongside several other major features.", + "thumbnail": "https://modrinth.com/news/default.webp", + "date": "2023-08-05T20:00:00.000Z", + "link": "https://modrinth.com/news/article/modrinth-app-beta" + }, + { + "title": "(April Fools 2023) Powering up your experience: Modrinth Technologies™️ beta launch!", + "summary": "Welcome to the new era of Modrinth. We can't wait to hear your feedback.", + "thumbnail": "https://modrinth.com/news/article/new-site-beta/thumbnail.webp", + "date": "2023-04-01T08:00:00.000Z", + "link": "https://modrinth.com/news/article/new-site-beta" + }, + { + "title": "Accelerating Modrinth's Development", + "summary": "Our fundraiser and the future of Modrinth!", + "thumbnail": "https://modrinth.com/news/default.webp", + "date": "2023-02-01T20:00:00.000Z", + "link": "https://modrinth.com/news/article/accelerating-development" + }, + { + "title": "Modrinth's Anniversary Update", + "summary": "Marking two years of Modrinth and discussing our New Year's Resolutions for 2023.", + "thumbnail": "https://modrinth.com/news/article/two-years-of-modrinth/thumbnail.webp", + "date": "2023-01-07T00:00:00.000Z", + "link": "https://modrinth.com/news/article/two-years-of-modrinth" + }, + { + "title": "Two years of Modrinth: a retrospective", + "summary": "The history of Modrinth as we know it from December 2020 to December 2022.", + "thumbnail": "https://modrinth.com/news/default.webp", + "date": "2023-01-07T00:00:00.000Z", + "link": "https://modrinth.com/news/article/two-years-of-modrinth-history" + }, + { + "title": "Creators can now make money on Modrinth!", + "summary": "Introducing the Creator Monetization Program allowing creators to earn revenue from their projects.", + "thumbnail": "https://modrinth.com/news/article/creator-monetization/thumbnail.webp", + "date": "2022-11-12T00:00:00.000Z", + "link": "https://modrinth.com/news/article/creator-monetization" + }, + { + "title": "Modrinth's Carbon Ads experiment", + "summary": "Experimenting with a different ad providers to find one which one works for us.", + "thumbnail": "https://modrinth.com/news/article/carbon-ads/thumbnail.webp", + "date": "2022-09-08T00:00:00.000Z", + "link": "https://modrinth.com/news/article/carbon-ads" + }, + { + "title": "Plugins and Resource Packs now have a home on Modrinth", + "summary": "A small update with a big impact: plugins and resource packs are now available on Modrinth!", + "thumbnail": "https://modrinth.com/news/article/plugins-resource-packs/thumbnail.webp", + "date": "2022-08-27T00:00:00.000Z", + "link": "https://modrinth.com/news/article/plugins-resource-packs" + }, + { + "title": "Changes to Modrinth Modpacks", + "summary": "CurseForge CDN links requested to be removed by the end of the month", + "thumbnail": "https://modrinth.com/news/article/modpack-changes/thumbnail.webp", + "date": "2022-05-28T00:00:00.000Z", + "link": "https://modrinth.com/news/article/modpack-changes" + }, + { + "title": "Modrinth Modpacks: Now in alpha testing", + "summary": "After over a year of development, we're happy to announce that modpack support is now in alpha testing.", + "thumbnail": "https://modrinth.com/news/article/modpacks-alpha/thumbnail.webp", + "date": "2022-05-15T00:00:00.000Z", + "link": "https://modrinth.com/news/article/modpacks-alpha" + }, + { + "title": "This week in Modrinth development: Filters and Fixes", + "summary": "Continuing to improve the user interface after a great first week since Modrinth launched out of beta.", + "thumbnail": "https://modrinth.com/news/article/knossos-v2.1.0/thumbnail.webp", + "date": "2022-03-09T00:00:00.000Z", + "link": "https://modrinth.com/news/article/knossos-v2.1.0" + }, + { + "title": "Now showing on Modrinth: A new look!", + "summary": "Releasing many new features and improvements, including a redesign!", + "thumbnail": "https://modrinth.com/news/article/redesign/thumbnail.webp", + "date": "2022-02-27T00:00:00.000Z", + "link": "https://modrinth.com/news/article/redesign" + }, + { + "title": "Beginner's Guide to Licensing your Mods", + "summary": "Software licenses; the nitty-gritty legal aspect of software development. They're more important than you think.", + "thumbnail": "https://modrinth.com/news/article/licensing-guide/thumbnail.webp", + "date": "2021-05-16T00:00:00.000Z", + "link": "https://modrinth.com/news/article/licensing-guide" + }, + { + "title": "Welcome to Modrinth Beta", + "summary": "After six months of work, Modrinth enters Beta, helping modders host their mods with ease!", + "thumbnail": "https://modrinth.com/news/article/modrinth-beta/thumbnail.webp", + "date": "2020-12-01T00:00:00.000Z", + "link": "https://modrinth.com/news/article/modrinth-beta" + }, + { + "title": "What is Modrinth?", + "summary": "Hello, we are Modrinth – an open source mods hosting platform. Sounds dry, doesn't it? So let me tell you our story – and I promise, it won't be boring!", + "thumbnail": "https://modrinth.com/news/default.webp", + "date": "2020-11-27T00:00:00.000Z", + "link": "https://modrinth.com/news/article/whats-modrinth" + } + ] } diff --git a/apps/frontend/src/public/opensearch.xml b/apps/frontend/src/public/opensearch.xml index 398bfe845..ff7cd73b8 100644 --- a/apps/frontend/src/public/opensearch.xml +++ b/apps/frontend/src/public/opensearch.xml @@ -1,11 +1,14 @@ - - - Modrinth mods - Search for mods on Modrinth, the open source modding platform. - UTF-8 - https://modrinth.com/favicon.ico - - Rinth, Inc. - Rinth, Inc. - https://modrinth.com/mods + + + Modrinth mods + Search for mods on Modrinth, the open source modding platform. + UTF-8 + https://modrinth.com/favicon.ico + + Rinth, Inc. + Rinth, Inc. + https://modrinth.com/mods diff --git a/apps/labrinth/.prettierignore b/apps/labrinth/.prettierignore new file mode 100644 index 000000000..ffe984b7a --- /dev/null +++ b/apps/labrinth/.prettierignore @@ -0,0 +1,119 @@ +**/*.rs +**/*.svg +.sqlx + +# Migrations existing before Prettier formatted them shall always be ignored, +# as any changes to them will break existing deployments +migrations/20200716160921_init.sql +migrations/20200717192808_Make_categories_non-null.sql +migrations/20200722031742_initial-release-channels.sql +migrations/20200722033157_rename-release-channels.sql +migrations/20200722153930_version-filename.sql +migrations/20200730223151_more-not-null.sql +migrations/20200812183213_unique-loaders.sql +migrations/20200928020509_states.sql +migrations/20200928033759_edit-states.sql +migrations/20200928053955_make-url-not-null.sql +migrations/20200928170310_create-users.sql +migrations/20200928195220_add-roles-to-users.sql +migrations/20200929034101_add-author-to-versions.sql +migrations/20201001015631_not-null-github-avatar.sql +migrations/20201003211651_make-name-null.sql +migrations/20201014165954_create-statuses.sql +migrations/20201021214908_extend-game-version.sql +migrations/20201029190804_add-game-version-datetime.sql +migrations/20201109200208_edit-teams.sql +migrations/20201112052516_moderation.sql +migrations/20201122043349_more-mod-data.sql +migrations/20201213013358_remove-member-name.sql +migrations/20210113202021_add-descriptions.sql +migrations/20210118161307_remove-version-access.sql +migrations/20210129224854_dependency-types.sql +migrations/20210201001429_reports.sql +migrations/20210224174945_notifications.sql +migrations/20210301041252_follows.sql +migrations/20210509010206_project_types.sql +migrations/20210611024943_archived-status-notifications-icon-rejection-reasons.sql +migrations/20210718223710_gallery.sql +migrations/20210727160151_gallery_featuring_rejection_rename.sql +migrations/20210805044459_more_gallery_info.sql +migrations/20210820053031_version-optimization.sql +migrations/20220210032959_remove-categories-unique.sql +migrations/20220220035037_remove_downloads_table.sql +migrations/20220329182356_file-sizes.sql +migrations/20220526040434_dep-file-names.sql +migrations/20220725204351_more-project-data.sql +migrations/20220801184215_banned-users.sql +migrations/20220902025606_initial-payouts.sql +migrations/20220928044123_payouts-scheduling.sql +migrations/20221107171016_payouts-overhaul.sql +migrations/20221111163753_fix-precision.sql +migrations/20221111202802_fix-precision-again.sql +migrations/20221116200727_flame-anvil-integration.sql +migrations/20221126222222_spdx-licenses.sql +migrations/20221129161609_status-types-changes.sql +migrations/20221206221021_webhook-sent.sql +migrations/20221217041358_ordering-galore.sql +migrations/20221217215337_drop-body_url-changelog_url.sql +migrations/20221223192812_file-labels.sql +migrations/20221227010515_project-colors.sql +migrations/20230104214503_random-projects.sql +migrations/20230127233123_loader-gv-mod.sql +migrations/20230221212958_queue-date.sql +migrations/20230324202117_messaging.sql +migrations/20230414203933_threads-fix.sql +migrations/20230416033024_deps-project-mandatory.sql +migrations/20230421174120_remove-threads-ref.sql +migrations/20230502141522_minos-support.sql +migrations/20230628180115_kill-ory.sql +migrations/20230710034250_flows.sql +migrations/20230711004131_2fa.sql +migrations/20230714235551_fix-2fa-type.sql +migrations/20230808043323_threads-index.sql +migrations/20230808162652_gv-loader-fixes.sql +migrations/20230816085700_collections_and_more.sql +migrations/20230913024611_organizations.sql +migrations/20231005230721_dynamic-fields.sql +migrations/20231016190056_oauth_provider.sql +migrations/20231027195838_version_ordering.sql +migrations/20231110010322_adds_game_version_minmax.sql +migrations/20231113104902_games_metadata.sql +migrations/20231114175920_new-payment-methods.sql +migrations/20231115105022_plugins_datapacks_v3.sql +migrations/20231116112800_side_types_overhaul.sql +migrations/20231117073600_links_overhaul.sql +migrations/20231122230639_oauth_client_metadata.sql +migrations/20231124070100_renaming_consistency.sql +migrations/20231125080100_drops_mods_dp_plugins.sql +migrations/20231130153100_loader_fields_loaders.sql +migrations/20231205095400_remaining_loader_field_loaders.sql +migrations/20231211184922_collections_description_nullable.sql +migrations/20231213103100_enforces-owner-unique.sql +migrations/20240104203711_orgs-names.sql +migrations/20240115052708_base62-helper-functions.sql +migrations/20240131224610_moderation_packs.sql +migrations/20240221215354_moderation_pack_fixes.sql +migrations/20240319195753_threads-updates.sql +migrations/20240701213559_remove-user-names.sql +migrations/20240702213250_subscriptions.sql +migrations/20240907192840_raw-images.sql +migrations/20240911044738_payouts-updates.sql +migrations/20240923163452_charges-fix.sql +migrations/20241121232522_friends.sql +migrations/20241204190127_revenue_updates.sql +migrations/20241224001114_teams-precision-fix.sql +migrations/20250117013050_missing-primary-keys.sql +migrations/20250519184051_shared-instances.sql +migrations/20250523174544_project-versions-environments.sql +migrations/20250608183828_random-project-index.sql +migrations/20250609134334_spatial-random-project-index.sql +migrations/20250611164523_lowercase-user-email-index.sql +migrations/20250628213541_payout-sources-recording.sql +migrations/20250725230041_reports-closed-status-index.sql +migrations/20250727184120_user-newsletter-subscription-column.sql +migrations/20250804221014_users-redeemals.sql +migrations/20250805001654_product-prices-public.sql + +# Prettier reformats some of the PostgreSQL-specific COPY syntax here, +# which is very likely to break things +fixtures/labrinth-seed-data-202508052143.sql diff --git a/apps/labrinth/Cargo.toml b/apps/labrinth/Cargo.toml index a046293f5..c0dc09a90 100644 --- a/apps/labrinth/Cargo.toml +++ b/apps/labrinth/Cargo.toml @@ -76,19 +76,16 @@ thiserror.workspace = true either.workspace = true sqlx = { workspace = true, features = [ - "runtime-tokio", - "tls-rustls-ring", - "postgres", - "chrono", - "macros", - "migrate", - "rust_decimal", - "json", -] } -rust_decimal = { workspace = true, features = [ - "serde-with-float", - "serde-with-str", + "runtime-tokio", + "tls-rustls-ring", + "postgres", + "chrono", + "macros", + "migrate", + "rust_decimal", + "json", ] } +rust_decimal = { workspace = true, features = ["serde-with-float", "serde-with-str"] } redis = { workspace = true, features = ["tokio-comp", "ahash", "r2d2"] } deadpool-redis.workspace = true clickhouse = { workspace = true, features = ["uuid", "time"] } @@ -101,7 +98,23 @@ tar.workspace = true sentry.workspace = true sentry-actix.workspace = true -image = { workspace = true, features = ["avif", "bmp", "dds", "exr", "ff", "gif", "hdr", "ico", "jpeg", "png", "pnm", "qoi", "tga", "tiff", "webp"] } +image = { workspace = true, features = [ + "avif", + "bmp", + "dds", + "exr", + "ff", + "gif", + "hdr", + "ico", + "jpeg", + "png", + "pnm", + "qoi", + "tga", + "tiff", + "webp", +] } color-thief.workspace = true webp.workspace = true @@ -120,7 +133,10 @@ ariadne.workspace = true clap = { workspace = true, features = ["derive"] } [target.'cfg(target_os = "linux")'.dependencies] -tikv-jemallocator = { workspace = true, features = ["profiling", "unprefixed_malloc_on_supported_platforms"] } +tikv-jemallocator = { workspace = true, features = [ + "profiling", + "unprefixed_malloc_on_supported_platforms", +] } tikv-jemalloc-ctl = { workspace = true, features = ["stats"] } jemalloc_pprof = { workspace = true, features = ["flamegraph"] } diff --git a/apps/labrinth/assets/auth/style.css b/apps/labrinth/assets/auth/style.css index d64e6a96a..029168e54 100644 --- a/apps/labrinth/assets/auth/style.css +++ b/apps/labrinth/assets/auth/style.css @@ -1,78 +1,78 @@ :root { - --color-bg: #16181c; - --color-fg: #b0bac5; - --color-section-bg: #26292f; + --color-bg: #16181c; + --color-fg: #b0bac5; + --color-section-bg: #26292f; - --content-width: 30%; - --content-max-width: 300px; - --content-padding: 1.5rem; - --edge-rounding: 1rem; + --content-width: 30%; + --content-max-width: 300px; + --content-padding: 1.5rem; + --edge-rounding: 1rem; } html, body { - height: 100%; - overflow: hidden; + height: 100%; + overflow: hidden; } body { - color: var(--color-fg); - background-color: var(--color-bg); - display: flex; - justify-content: center; - align-items: center; - font-family: - Inter, - -apple-system, - BlinkMacSystemFont, - 'Segoe UI', - Helvetica Neue, - Helvetica, - Oxygen, - Ubuntu, - Roboto, - Cantarell, - Fira Sans, - Droid Sans, - 'Apple Color Emoji', - 'Segoe UI Emoji', - Arial, - sans-serif; + color: var(--color-fg); + background-color: var(--color-bg); + display: flex; + justify-content: center; + align-items: center; + font-family: + Inter, + -apple-system, + BlinkMacSystemFont, + 'Segoe UI', + Helvetica Neue, + Helvetica, + Oxygen, + Ubuntu, + Roboto, + Cantarell, + Fira Sans, + Droid Sans, + 'Apple Color Emoji', + 'Segoe UI Emoji', + Arial, + sans-serif; } .content { - background-color: var(--color-section-bg); - width: var(--content-width); - max-width: var(--content-max-width); - border-radius: var(--edge-rounding); - padding: var(--content-padding); - justify-content: center; - align-items: center; - box-sizing: border-box; + background-color: var(--color-section-bg); + width: var(--content-width); + max-width: var(--content-max-width); + border-radius: var(--edge-rounding); + padding: var(--content-padding); + justify-content: center; + align-items: center; + box-sizing: border-box; } .content h2 { - margin-bottom: 0; + margin-bottom: 0; } .logo { - display: block; - width: 100%; - margin-left: auto; - margin-right: auto; - margin-bottom: 2rem; - border-radius: 1.5rem; + display: block; + width: 100%; + margin-left: auto; + margin-right: auto; + margin-bottom: 2rem; + border-radius: 1.5rem; } a { - color: #4f9cff; - text-decoration: underline; + color: #4f9cff; + text-decoration: underline; } a:visited { - color: #4f9cff; + color: #4f9cff; } img { - image-rendering: pixelated; + image-rendering: pixelated; } diff --git a/apps/labrinth/package.json b/apps/labrinth/package.json index a19b84644..40873a2bc 100644 --- a/apps/labrinth/package.json +++ b/apps/labrinth/package.json @@ -1,14 +1,17 @@ { - "name": "@modrinth/labrinth", - "scripts": { - "build": "cargo build --release", - "lint": "cargo fmt --check && cargo clippy --all-targets", - "fix": "cargo clippy --all-targets --fix --allow-dirty && cargo fmt", - "dev": "cargo run", - "//": "labrinth integration tests require a lot of disk space, so in the standard GitHub Actions", - "//": "runners we must remove useless development tools from the base image, which frees up ~20 GiB.", - "//": "The command commented out below can be used in CI to debug what is taking up space:", - "//": "sudo du -xh --max-depth=4 / | sort -rh | curl -X POST --data-urlencode content@/dev/fd/0 https://api.mclo.gs/1/log", - "test": "if-ci sudo rm -rf /usr/local/lib/android /usr/local/.ghcup /opt/hostedtoolcache/CodeQL /usr/share/swift && cargo nextest run --all-targets --no-fail-fast" - } + "name": "@modrinth/labrinth", + "scripts": { + "build": "cargo build --release", + "lint": "cargo fmt --check && cargo clippy --all-targets", + "lint:ancillary": "prettier --check .", + "fix": "cargo clippy --all-targets --fix --allow-dirty && cargo fmt", + "fix:ancillary": "prettier --write .", + "dev": "cargo run", + "//": "labrinth integration tests require a lot of disk space, so in the standard GitHub Actions", + "//": "runners we must remove useless development tools from the base image, which frees up ~20 GiB.", + "//": "The command commented out below can be used in CI to debug what is taking up space:", + "//": "sudo du -xh --max-depth=4 / | sort -rh | curl -X POST --data-urlencode content@/dev/fd/0 https://api.mclo.gs/1/log", + "test": "if-ci sudo rm -rf /usr/local/lib/android /usr/local/.ghcup /opt/hostedtoolcache/CodeQL /usr/share/swift && cargo nextest run --all-targets --no-fail-fast" + }, + "prettier": "@modrinth/tooling-config/labrinth.prettier.config.cjs" } diff --git a/apps/labrinth/src/auth/email/auth_notif.html b/apps/labrinth/src/auth/email/auth_notif.html index 45a9e95a6..7564466fd 100644 --- a/apps/labrinth/src/auth/email/auth_notif.html +++ b/apps/labrinth/src/auth/email/auth_notif.html @@ -1,1634 +1,1635 @@ - - {{ email_title }} - - - - - - - - - - - - - - - - - - - - - -
- {{ email_description }}͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏  ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏  ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏  ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏  ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏  ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏  ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏  ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏  ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏  ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏  -
-
- + + + + + + + + + + + + + + + + + + + + +
+ {{ email_description + }}͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏  ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏  ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏  ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏  ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏  ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏  ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏  ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏  ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏  ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏  +
+
+ -
- - - - - - -
- -
- - - - - - - - - -
- - - - - - -
- -
-
- - - - - - -
- -
-
-
- -
-
- -
- - - - - - -
- -
- - - - - - - - - -
-
-

- {{ email_title }} -

-
-
-
-

- {{ line_one }} -

-

-   -

-

- {{ line_two }} -

-
-
-
- -
-
- -
- - - - - - -
- -
- -
- - - - - - - - - - - - - - - -
- - - - - - -
- - modrinth logo -
-
- - - - - - -
- - modrinth logo -
-
-
-

- Rinth, Inc. -

-
-
-
-

- 410 N Scottsdale Road -

-

- Suite 1000 -

-

- Tempe, AZ 85281 -

-
-
-
- -
- - - - - - -
- - -
-
-
- -
- - - - - - -
- - - - - - - -
- - - - - - -
- - Discord -
-
- - - - - - - -
- - - - - - -
- - Twitter -
-
- - - - - - - -
- - - - - - -
- - Mastodon -
-
- - - - - - - -
- - - - - - -
- - GitHub -
-
- - - - - - - -
- - - - - - -
- - YouTube -
-
- - - - - - - -
- - - - - - - -
- - - - - - - -
- - - - - - - -
- - - - - - - -
- -
-
- -
- -
-
- -
- +
+ diff --git a/apps/labrinth/src/auth/email/button_notif.html b/apps/labrinth/src/auth/email/button_notif.html index 2c7e9d56d..2865a485b 100644 --- a/apps/labrinth/src/auth/email/button_notif.html +++ b/apps/labrinth/src/auth/email/button_notif.html @@ -1,1732 +1,1733 @@ - - {{ email_title }} - - - - - - - - - - - - - - - - - - - - - -
- {{ email_description }}͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏  ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏  ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏  ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏  ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏  ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏  ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏  ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏  ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏  ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏  -
-
- + + + + + + + + + + + + + + + + + + + + +
+ {{ email_description + }}͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏  ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏  ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏  ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏  ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏  ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏  ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏  ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏  ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏  ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏ ͏  +
+
+ -
- - - - - - -
- -
- - - - - - - - - -
- - - - - - -
- -
-
- - - - - - -
- -
-
-
- -
-
- -
- - - - - - -
- -
- - - - - - - - - - - - - - - - - - -
-
-

- {{ email_title }} -

-
-
-
-

- {{ line_one }} -

-

-   -

-

- {{ line_two }} -

-
-
- - - - - - -
- - {{ button_title }} -
-
-
-

- {{ button_link }} -

-
-
-
- -
-
- -
- - - - - - -
- -
- -
- - - - - - - - - - - - - - - -
- - - - - - -
- - modrinth logo -
-
- - - - - - -
- - modrinth logo -
-
-
-

- Rinth, Inc. -

-
-
-
-

- 410 N Scottsdale Road -

-

- Suite 1000 -

-

- Tempe, AZ 85281 -

-
-
-
- -
- - - - - - -
- - -
-
-
- -
- - - - - - -
- - - - - - - -
- - - - - - -
- - Discord -
-
- - - - - - - -
- - - - - - -
- - Twitter -
-
- - - - - - - -
- - - - - - -
- - Mastodon -
-
- - - - - - - -
- - - - - - -
- - GitHub -
-
- - - - - - - -
- - - - - - -
- - YouTube -
-
- - - - - - - -
- - - - - - - -
- - - - - - - -
- - - - - - - -
- - - - - - - -
- -
-
- -
- -
-
- -
- +
+ diff --git a/apps/labrinth/src/auth/templates/error.html b/apps/labrinth/src/auth/templates/error.html index e896da7e2..51224ddc3 100644 --- a/apps/labrinth/src/auth/templates/error.html +++ b/apps/labrinth/src/auth/templates/error.html @@ -1,22 +1,22 @@ - - - - Error - Modrinth - + + + + Error - Modrinth + - -
- -

{{ code }}

-

An error has occurred during the authentication process.

-

- Try closing this window and signing in again. Join - our Discord server to get help if this error - persists after three attempts. -

-

Debug information: {{ message }}

-
- + +
+ +

{{ code }}

+

An error has occurred during the authentication process.

+

+ Try closing this window and signing in again. Join + our Discord server to get help if this error + persists after three attempts. +

+

Debug information: {{ message }}

+
+ diff --git a/apps/labrinth/src/auth/templates/success.html b/apps/labrinth/src/auth/templates/success.html index 8360f5a68..e29ba47bd 100644 --- a/apps/labrinth/src/auth/templates/success.html +++ b/apps/labrinth/src/auth/templates/success.html @@ -1,16 +1,16 @@ - - - - Login - Modrinth - + + + + Login - Modrinth + - -
- -

Login Successful

-

Hey, {{ name }}! You can now safely close this tab.

-
- + +
+ +

Login Successful

+

Hey, {{ name }}! You can now safely close this tab.

+
+ diff --git a/apps/labrinth/tests/fixtures/dummy_data.sql b/apps/labrinth/tests/fixtures/dummy_data.sql index 9866a9d45..a60edfd5c 100644 --- a/apps/labrinth/tests/fixtures/dummy_data.sql +++ b/apps/labrinth/tests/fixtures/dummy_data.sql @@ -5,10 +5,13 @@ -- 'Friend' and 'enemy' function like 'user', but we can use them to simulate 'other' users that may or may not be able to access certain things -- IDs 1-5, 1-5 INSERT INTO users (id, username, email, role) VALUES (1, 'Admin', 'admin@modrinth.com', 'admin'); -INSERT INTO users (id, username, email, role) VALUES (2, 'Moderator', 'moderator@modrinth.com', 'moderator'); +INSERT INTO users (id, username, email, role) +VALUES (2, 'Moderator', 'moderator@modrinth.com', 'moderator'); INSERT INTO users (id, username, email, role) VALUES (3, 'User', 'user@modrinth.com', 'developer'); -INSERT INTO users (id, username, email, role) VALUES (4, 'Friend', 'friend@modrinth.com', 'developer'); -INSERT INTO users (id, username, email, role) VALUES (5, 'Enemy', 'enemy@modrinth.com', 'developer'); +INSERT INTO users (id, username, email, role) +VALUES (4, 'Friend', 'friend@modrinth.com', 'developer'); +INSERT INTO users (id, username, email, role) +VALUES (5, 'Enemy', 'enemy@modrinth.com', 'developer'); -- Full PATs for each user, with different scopes -- These are not legal PATs, as they contain all scopes- they mimic permissions of a logged in user @@ -20,73 +23,88 @@ INSERT INTO pats (id, user_id, name, access_token, scopes, expires) VALUES (53, INSERT INTO pats (id, user_id, name, access_token, scopes, expires) VALUES (54, 5, 'enemy-pat', 'mrp_patenemy', $1, '2030-08-18 15:48:58.435729+00'); INSERT INTO loaders (id, loader) VALUES (5, 'fabric'); -INSERT INTO loaders_project_types (joining_loader_id, joining_project_type_id) VALUES (5,1); +INSERT INTO loaders_project_types (joining_loader_id, joining_project_type_id) VALUES (5, 1); INSERT INTO loaders (id, loader) VALUES (6, 'forge'); -INSERT INTO loaders_project_types (joining_loader_id, joining_project_type_id) VALUES (6,1); +INSERT INTO loaders_project_types (joining_loader_id, joining_project_type_id) VALUES (6, 1); -INSERT INTO loaders (id, loader, metadata) VALUES (7, 'bukkit', '{"platform":false}'::jsonb); -INSERT INTO loaders (id, loader, metadata) VALUES (8, 'waterfall', '{"platform":true}'::jsonb); +INSERT INTO loaders (id, loader, metadata) VALUES (7, 'bukkit', '{"platform":false}'::JSONB); +INSERT INTO loaders (id, loader, metadata) VALUES (8, 'waterfall', '{"platform":true}'::JSONB); -- Adds dummies to mrpack_loaders -INSERT INTO loader_field_enum_values (enum_id, value) SELECT id, 'fabric' FROM loader_field_enums WHERE enum_name = 'mrpack_loaders'; -INSERT INTO loader_field_enum_values (enum_id, value) SELECT id, 'forge' FROM loader_field_enums WHERE enum_name = 'mrpack_loaders'; +INSERT INTO loader_field_enum_values (enum_id, value) +SELECT id, 'fabric' FROM loader_field_enums WHERE enum_name = 'mrpack_loaders'; +INSERT INTO loader_field_enum_values (enum_id, value) +SELECT id, 'forge' FROM loader_field_enums WHERE enum_name = 'mrpack_loaders'; -INSERT INTO loaders_project_types_games (loader_id, project_type_id, game_id) SELECT joining_loader_id, joining_project_type_id, 1 FROM loaders_project_types WHERE joining_loader_id = 5; -INSERT INTO loaders_project_types_games (loader_id, project_type_id, game_id) SELECT joining_loader_id, joining_project_type_id, 1 FROM loaders_project_types WHERE joining_loader_id = 6; +INSERT INTO loaders_project_types_games (loader_id, project_type_id, game_id) +SELECT joining_loader_id, joining_project_type_id, 1 +FROM loaders_project_types +WHERE joining_loader_id = 5; +INSERT INTO loaders_project_types_games (loader_id, project_type_id, game_id) +SELECT joining_loader_id, joining_project_type_id, 1 +FROM loaders_project_types +WHERE joining_loader_id = 6; -- Dummy-data only optional field, as we don't have any yet -INSERT INTO loader_fields ( - field, - field_type, - optional -) VALUES ( - 'test_fabric_optional', - 'integer', - true -); -INSERT INTO loader_fields_loaders(loader_id, loader_field_id) -SELECT l.id, lf.id FROM loaders l CROSS JOIN loader_fields lf WHERE lf.field = 'test_fabric_optional' AND l.loader = 'fabric' ON CONFLICT DO NOTHING; +INSERT INTO loader_fields + (field, field_type, optional) +VALUES + ('test_fabric_optional', 'integer', TRUE); +INSERT INTO loader_fields_loaders (loader_id, loader_field_id) +SELECT l.id, lf.id +FROM + loaders AS l + CROSS JOIN loader_fields AS lf +WHERE lf.field = 'test_fabric_optional' AND l.loader = 'fabric' +ON CONFLICT DO NOTHING; -- Sample game versions, loaders, categories -- Game versions is '2' -INSERT INTO loader_field_enum_values(enum_id, value, metadata, created) +INSERT INTO loader_field_enum_values (enum_id, value, metadata, created) VALUES (2, '1.20.1', '{"type":"release","major":false}', '2021-08-18 15:48:58.435729+00'); -INSERT INTO loader_field_enum_values(enum_id, value, metadata, created) +INSERT INTO loader_field_enum_values (enum_id, value, metadata, created) VALUES (2, '1.20.2', '{"type":"release","major":false}', '2021-08-18 15:48:59.435729+00'); -INSERT INTO loader_field_enum_values(enum_id, value, metadata, created) +INSERT INTO loader_field_enum_values (enum_id, value, metadata, created) VALUES (2, '1.20.3', '{"type":"release","major":false}', '2021-08-18 15:49:00.435729+00'); -INSERT INTO loader_field_enum_values(enum_id, value, metadata, created) +INSERT INTO loader_field_enum_values (enum_id, value, metadata, created) VALUES (2, '1.20.4', '{"type":"beta","major":false}', '2021-08-18 15:49:01.435729+00'); -INSERT INTO loader_field_enum_values(enum_id, value, metadata, created) +INSERT INTO loader_field_enum_values (enum_id, value, metadata, created) VALUES (2, '1.20.5', '{"type":"release","major":true}', '2061-08-18 15:49:02.435729+00'); -- Also add 'Ordering_Negative1' and 'Ordering_Positive100' to game versions (to test ordering override) -INSERT INTO loader_field_enum_values(enum_id, value, metadata, ordering) +INSERT INTO loader_field_enum_values (enum_id, value, metadata, ordering) VALUES (2, 'Ordering_Negative1', '{"type":"release","major":false}', -1); -INSERT INTO loader_field_enum_values(enum_id, value, metadata, ordering) +INSERT INTO loader_field_enum_values (enum_id, value, metadata, ordering) VALUES (2, 'Ordering_Positive100', '{"type":"release","major":false}', 100); -INSERT INTO loader_fields_loaders(loader_id, loader_field_id) -SELECT l.id, lf.id FROM loaders l CROSS JOIN loader_fields lf WHERE lf.field IN ('game_versions','environment') ON CONFLICT DO NOTHING; +INSERT INTO loader_fields_loaders (loader_id, loader_field_id) +SELECT l.id, lf.id +FROM + loaders AS l + CROSS JOIN loader_fields AS lf +WHERE lf.field IN ('game_versions', 'environment') +ON CONFLICT DO NOTHING; -INSERT INTO categories (id, category, project_type) VALUES - (51, 'combat', 1), - (52, 'decoration', 1), - (53, 'economy', 1), - (54, 'food', 1), - (55, 'magic', 1), - (56, 'mobs', 1), - (57, 'optimization', 1); +INSERT INTO categories (id, category, project_type) +VALUES + (51, 'combat', 1), + (52, 'decoration', 1), + (53, 'economy', 1), + (54, 'food', 1), + (55, 'magic', 1), + (56, 'mobs', 1), + (57, 'optimization', 1); -INSERT INTO categories (id, category, project_type) VALUES - (101, 'combat', 2), - (102, 'decoration', 2), - (103, 'economy', 2), - (104, 'food', 2), - (105, 'magic', 2), - (106, 'mobs', 2), - (107, 'optimization', 2); +INSERT INTO categories (id, category, project_type) +VALUES + (101, 'combat', 2), + (102, 'decoration', 2), + (103, 'economy', 2), + (104, 'food', 2), + (105, 'magic', 2), + (106, 'mobs', 2), + (107, 'optimization', 2); -- Create dummy oauth client, secret_hash is SHA512 hash of full lowercase alphabet INSERT INTO oauth_clients ( @@ -105,9 +123,10 @@ VALUES ( '4dbff86cc2ca1bae1e16468a05cb9881c97f1753bce3619034898faa1aabe429955a1bf8ec483d7421fe3c1646613a59ed5441fb0f321389f77f48a879c7b1f1', 3 ); -INSERT INTO oauth_client_redirect_uris (id, client_id, uri) VALUES (1, 1, 'https://modrinth.com/oauth_callback'); +INSERT INTO oauth_client_redirect_uris (id, client_id, uri) +VALUES (1, 1, 'https://modrinth.com/oauth_callback'); -- Create dummy data table to mark that this file has been run CREATE TABLE dummy_data ( - update_id bigint PRIMARY KEY - ); + update_id BIGINT PRIMARY KEY +); diff --git a/package.json b/package.json index 193c35021..6a6968493 100644 --- a/package.json +++ b/package.json @@ -18,9 +18,11 @@ "moderation:fix": "turbo run fix --filter=@modrinth/moderation", "moderation:intl:extract": "pnpm run --filter=@modrinth/moderation intl:extract", "build": "turbo run build --continue", - "lint": "turbo run lint --continue", + "lint": "turbo run lint lint:ancillary --continue", + "lint:ancillary": "prettier --check .github *.*", "test": "turbo run test --continue", - "fix": "turbo run fix --continue", + "fix": "turbo run fix fix:ancillary --continue", + "fix:ancillary": "prettier --write .github *.*", "ci": "turbo run lint test --continue", "intl:extract": "pnpm ui:intl:extract && pnpm web:intl:extract && pnpm app:intl:extract && pnpm moderation:intl:extract" }, @@ -37,5 +39,5 @@ "readable-stream@2.3.8": "patches/readable-stream@2.3.8.patch" } }, - "prettier": "@modrinth/tooling-config/prettier.config.js" + "prettier": "@modrinth/tooling-config/prettier.config.cjs" } diff --git a/packages/app-lib/.prettierignore b/packages/app-lib/.prettierignore new file mode 100644 index 000000000..9237fdf3b --- /dev/null +++ b/packages/app-lib/.prettierignore @@ -0,0 +1,15 @@ +**/*.rs +.sqlx + +# Migrations existing before Prettier formatted them shall always be ignored, +# as any changes to them will break existing deployments +migrations/20240711194701_init.sql +migrations/20240813205023_drop-active-unique.sql +migrations/20240930001852_disable-personalized-ads.sql +migrations/20241222013857_feature-flags.sql +migrations/20250318160526_protocol-versions.sql +migrations/20250408181656_add-join-log.sql +migrations/20250413162050_skin-selector.sql +migrations/20250428171350_add-profile-feature-version.sql +migrations/20250429150111_add-attached-world-data.sql +migrations/20250514181748_skin_nametag_setting.sql diff --git a/packages/app-lib/Cargo.toml b/packages/app-lib/Cargo.toml index 932c3f0d7..256e3b44a 100644 --- a/packages/app-lib/Cargo.toml +++ b/packages/app-lib/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "theseus" -version = "1.0.0-local" # The actual version is set by the theseus-build workflow on tagging +version = "1.0.0-local" # The actual version is set by the theseus-build workflow on tagging authors = ["Jai A "] edition.workspace = true @@ -15,7 +15,14 @@ sha2.workspace = true url = { workspace = true, features = ["serde"] } uuid = { workspace = true, features = ["serde", "v4"] } zip.workspace = true -async_zip = { workspace = true, features = ["chrono", "tokio-fs", "deflate", "bzip2", "zstd", "deflate64"] } +async_zip = { workspace = true, features = [ + "chrono", + "tokio-fs", + "deflate", + "bzip2", + "zstd", + "deflate64", +] } flate2.workspace = true tempfile.workspace = true dashmap = { workspace = true, features = ["serde"] } @@ -51,8 +58,27 @@ indicatif = { workspace = true, optional = true } async-tungstenite = { workspace = true, features = ["tokio-runtime", "tokio-rustls-webpki-roots"] } futures = { workspace = true, features = ["async-await", "alloc"] } -reqwest = { workspace = true, features = ["json", "stream", "deflate", "gzip", "brotli", "rustls-tls-webpki-roots", "charset", "http2", "macos-system-configuration", "multipart"] } -tokio = { workspace = true, features = ["time", "io-util", "net", "sync", "fs", "macros", "process"] } +reqwest = { workspace = true, features = [ + "json", + "stream", + "deflate", + "gzip", + "brotli", + "rustls-tls-webpki-roots", + "charset", + "http2", + "macos-system-configuration", + "multipart", +] } +tokio = { workspace = true, features = [ + "time", + "io-util", + "net", + "sync", + "fs", + "macros", + "process", +] } tokio-util = { workspace = true, features = ["compat", "io", "io-util"] } async-recursion.workspace = true fs4 = { workspace = true, features = ["tokio"] } @@ -72,7 +98,14 @@ p256 = { workspace = true, features = ["ecdsa"] } rand.workspace = true base64.workspace = true -sqlx = { workspace = true, features = ["runtime-tokio", "sqlite", "macros", "migrate", "json", "uuid"] } +sqlx = { workspace = true, features = [ + "runtime-tokio", + "sqlite", + "macros", + "migrate", + "json", + "uuid", +] } quartz_nbt = { workspace = true, features = ["serde"] } hickory-resolver.workspace = true diff --git a/packages/app-lib/package.json b/packages/app-lib/package.json index d1213bbaa..c887cdffc 100644 --- a/packages/app-lib/package.json +++ b/packages/app-lib/package.json @@ -1,9 +1,12 @@ { - "name": "@modrinth/app-lib", - "scripts": { - "build": "cargo build --release", - "lint": "cargo fmt --check && cargo clippy --all-targets", - "fix": "cargo clippy --all-targets --fix --allow-dirty && cargo fmt", - "test": "cargo nextest run --all-targets --no-fail-fast" - } + "name": "@modrinth/app-lib", + "scripts": { + "build": "cargo build --release", + "lint": "cargo fmt --check && cargo clippy --all-targets", + "lint:ancillary": "prettier --check .", + "fix": "cargo clippy --all-targets --fix --allow-dirty && cargo fmt", + "fix:ancillary": "prettier --write .", + "test": "cargo nextest run --all-targets --no-fail-fast" + }, + "prettier": "@modrinth/tooling-config/app-lib.prettier.config.cjs" } diff --git a/packages/ariadne/.prettierignore b/packages/ariadne/.prettierignore new file mode 100644 index 000000000..ecc487ec4 --- /dev/null +++ b/packages/ariadne/.prettierignore @@ -0,0 +1 @@ +**/*.rs diff --git a/packages/assets/.prettierignore b/packages/assets/.prettierignore new file mode 100644 index 000000000..abc768122 --- /dev/null +++ b/packages/assets/.prettierignore @@ -0,0 +1 @@ +**/*.svg diff --git a/packages/assets/generated-icons.ts b/packages/assets/generated-icons.ts index f0f66b100..1ba6182da 100644 --- a/packages/assets/generated-icons.ts +++ b/packages/assets/generated-icons.ts @@ -8,26 +8,26 @@ import _ArrowBigUpDashIcon from './icons/arrow-big-up-dash.svg?component' import _AsteriskIcon from './icons/asterisk.svg?component' import _BadgeCheckIcon from './icons/badge-check.svg?component' import _BanIcon from './icons/ban.svg?component' -import _BellIcon from './icons/bell.svg?component' import _BellRingIcon from './icons/bell-ring.svg?component' +import _BellIcon from './icons/bell.svg?component' import _BlocksIcon from './icons/blocks.svg?component' import _BoldIcon from './icons/bold.svg?component' -import _BookIcon from './icons/book.svg?component' import _BookOpenIcon from './icons/book-open.svg?component' import _BookTextIcon from './icons/book-text.svg?component' +import _BookIcon from './icons/book.svg?component' import _BookmarkIcon from './icons/bookmark.svg?component' import _BotIcon from './icons/bot.svg?component' -import _BoxIcon from './icons/box.svg?component' import _BoxImportIcon from './icons/box-import.svg?component' +import _BoxIcon from './icons/box.svg?component' import _BracesIcon from './icons/braces.svg?component' import _BrushCleaningIcon from './icons/brush-cleaning.svg?component' import _CalendarIcon from './icons/calendar.svg?component' import _CardIcon from './icons/card.svg?component' import _ChangeSkinIcon from './icons/change-skin.svg?component' import _ChartIcon from './icons/chart.svg?component' -import _CheckIcon from './icons/check.svg?component' import _CheckCheckIcon from './icons/check-check.svg?component' import _CheckCircleIcon from './icons/check-circle.svg?component' +import _CheckIcon from './icons/check.svg?component' import _ChevronLeftIcon from './icons/chevron-left.svg?component' import _ChevronRightIcon from './icons/chevron-right.svg?component' import _ClearIcon from './icons/clear.svg?component' @@ -56,13 +56,13 @@ import _EditIcon from './icons/edit.svg?component' import _EllipsisVerticalIcon from './icons/ellipsis-vertical.svg?component' import _ExpandIcon from './icons/expand.svg?component' import _ExternalIcon from './icons/external.svg?component' -import _EyeIcon from './icons/eye.svg?component' import _EyeOffIcon from './icons/eye-off.svg?component' -import _FileIcon from './icons/file.svg?component' +import _EyeIcon from './icons/eye.svg?component' import _FileArchiveIcon from './icons/file-archive.svg?component' import _FileTextIcon from './icons/file-text.svg?component' -import _FilterIcon from './icons/filter.svg?component' +import _FileIcon from './icons/file.svg?component' import _FilterXIcon from './icons/filter-x.svg?component' +import _FilterIcon from './icons/filter.svg?component' import _FolderArchiveIcon from './icons/folder-archive.svg?component' import _FolderOpenIcon from './icons/folder-open.svg?component' import _FolderSearchIcon from './icons/folder-search.svg?component' @@ -79,8 +79,8 @@ import _HashIcon from './icons/hash.svg?component' import _Heading1Icon from './icons/heading-1.svg?component' import _Heading2Icon from './icons/heading-2.svg?component' import _Heading3Icon from './icons/heading-3.svg?component' -import _HeartIcon from './icons/heart.svg?component' import _HeartHandshakeIcon from './icons/heart-handshake.svg?component' +import _HeartIcon from './icons/heart.svg?component' import _HistoryIcon from './icons/history.svg?component' import _HomeIcon from './icons/home.svg?component' import _ImageIcon from './icons/image.svg?component' @@ -96,13 +96,13 @@ import _LeftArrowIcon from './icons/left-arrow.svg?component' import _LibraryIcon from './icons/library.svg?component' import _LightBulbIcon from './icons/light-bulb.svg?component' import _LinkIcon from './icons/link.svg?component' -import _ListIcon from './icons/list.svg?component' import _ListBulletedIcon from './icons/list-bulleted.svg?component' import _ListEndIcon from './icons/list-end.svg?component' import _ListOrderedIcon from './icons/list-ordered.svg?component' +import _ListIcon from './icons/list.svg?component' import _LoaderIcon from './icons/loader.svg?component' -import _LockIcon from './icons/lock.svg?component' import _LockOpenIcon from './icons/lock-open.svg?component' +import _LockIcon from './icons/lock.svg?component' import _LogInIcon from './icons/log-in.svg?component' import _LogOutIcon from './icons/log-out.svg?component' import _MailIcon from './icons/mail.svg?component' @@ -113,8 +113,8 @@ import _MessageIcon from './icons/message.svg?component' import _MicrophoneIcon from './icons/microphone.svg?component' import _MinimizeIcon from './icons/minimize.svg?component' import _MinusIcon from './icons/minus.svg?component' -import _MonitorIcon from './icons/monitor.svg?component' import _MonitorSmartphoneIcon from './icons/monitor-smartphone.svg?component' +import _MonitorIcon from './icons/monitor.svg?component' import _MoonIcon from './icons/moon.svg?component' import _MoreHorizontalIcon from './icons/more-horizontal.svg?component' import _MoreVerticalIcon from './icons/more-vertical.svg?component' @@ -123,16 +123,16 @@ import _NoSignalIcon from './icons/no-signal.svg?component' import _NotepadTextIcon from './icons/notepad-text.svg?component' import _OmorphiaIcon from './icons/omorphia.svg?component' import _OrganizationIcon from './icons/organization.svg?component' -import _PackageIcon from './icons/package.svg?component' import _PackageClosedIcon from './icons/package-closed.svg?component' import _PackageOpenIcon from './icons/package-open.svg?component' +import _PackageIcon from './icons/package.svg?component' import _PaintbrushIcon from './icons/paintbrush.svg?component' import _PickaxeIcon from './icons/pickaxe.svg?component' import _PlayIcon from './icons/play.svg?component' import _PlugIcon from './icons/plug.svg?component' import _PlusIcon from './icons/plus.svg?component' -import _RadioButtonIcon from './icons/radio-button.svg?component' import _RadioButtonCheckedIcon from './icons/radio-button-checked.svg?component' +import _RadioButtonIcon from './icons/radio-button.svg?component' import _ReceiptTextIcon from './icons/receipt-text.svg?component' import _RedoIcon from './icons/redo.svg?component' import _ReplyIcon from './icons/reply.svg?component' @@ -147,8 +147,8 @@ import _ScaleIcon from './icons/scale.svg?component' import _ScanEyeIcon from './icons/scan-eye.svg?component' import _SearchIcon from './icons/search.svg?component' import _SendIcon from './icons/send.svg?component' -import _ServerIcon from './icons/server.svg?component' import _ServerPlusIcon from './icons/server-plus.svg?component' +import _ServerIcon from './icons/server.svg?component' import _SettingsIcon from './icons/settings.svg?component' import _ShareIcon from './icons/share.svg?component' import _ShieldIcon from './icons/shield.svg?component' @@ -177,23 +177,23 @@ import _TrashIcon from './icons/trash.svg?component' import _TriangleAlertIcon from './icons/triangle-alert.svg?component' import _UnderlineIcon from './icons/underline.svg?component' import _UndoIcon from './icons/undo.svg?component' -import _UnknownIcon from './icons/unknown.svg?component' import _UnknownDonationIcon from './icons/unknown-donation.svg?component' +import _UnknownIcon from './icons/unknown.svg?component' import _UnlinkIcon from './icons/unlink.svg?component' import _UnplugIcon from './icons/unplug.svg?component' import _UpdatedIcon from './icons/updated.svg?component' import _UploadIcon from './icons/upload.svg?component' -import _UserIcon from './icons/user.svg?component' import _UserPlusIcon from './icons/user-plus.svg?component' import _UserXIcon from './icons/user-x.svg?component' +import _UserIcon from './icons/user.svg?component' import _UsersIcon from './icons/users.svg?component' import _VersionIcon from './icons/version.svg?component' import _WikiIcon from './icons/wiki.svg?component' import _WindowIcon from './icons/window.svg?component' import _WorldIcon from './icons/world.svg?component' import _WrenchIcon from './icons/wrench.svg?component' -import _XIcon from './icons/x.svg?component' import _XCircleIcon from './icons/x-circle.svg?component' +import _XIcon from './icons/x.svg?component' import _ZoomInIcon from './icons/zoom-in.svg?component' import _ZoomOutIcon from './icons/zoom-out.svg?component' diff --git a/packages/blog/.prettierignore b/packages/blog/.prettierignore new file mode 100644 index 000000000..65f13b43b --- /dev/null +++ b/packages/blog/.prettierignore @@ -0,0 +1,2 @@ +# Autogenerated files +compiled diff --git a/packages/blog/compiled/a_new_chapter_for_modrinth_servers.content.ts b/packages/blog/compiled/a_new_chapter_for_modrinth_servers.content.ts index d6cb247c8..97319f2b5 100644 --- a/packages/blog/compiled/a_new_chapter_for_modrinth_servers.content.ts +++ b/packages/blog/compiled/a_new_chapter_for_modrinth_servers.content.ts @@ -1,2 +1,2 @@ // AUTO-GENERATED FILE - DO NOT EDIT -export const html = `

Over the few months, Modrinth has seen incredible interest towards our Servers product, and with significant growth, our vision for what Modrinth Servers can be has evolved alongside it. To continue striving towards our goal of providing the best place to get your own Minecraft multiplayer server, we’ve made the decision to bring our server hosting fully in-house.

Why We're Making This Change

Modrinth has some ambitious goals for the next year. We want to create the best possible way for all Java players play Minecraft, and to host and play their favorite modpacks and custom servers. To achieve this, it’s clear that Modrinth Servers needs to be built and scaled on our own infrastructure.

By running every aspect of our hosting platform, we gain the flexibility to tailor the experience to our community’s needs—whether that means deeper integrations with Modrinth’s ecosystem, better performance, or more innovative features. This also allows us to invest in the long-term sustainability of Modrinth Servers, ensuring that we can scale seamlessly and avoid running out of available servers stock.

A Thank You to Pyro

This change is purely a logistical step forward and does not reflect negatively on our partnership with Pyro. In fact, Pyro has been an incredible partner in getting Modrinth Servers off the ground and we are very grateful for their collaboration. We completely support Pyro and their future, and we know they’re working on some exciting new products of their own, which we can’t wait to check out!

What This Means for You

We know you may have questions, and we want to make this transition as smooth as possible.

  • What part of my server was being run by Pyro?

    Until this point, Pyro has been responsible for the physical server machines that run your Modrinth servers. This means that they have been responsible for the hardware that powers your server, as well as the files and data for them. Moving forward, all of this will exist under Modrinth.

  • What happens to my running servers?

    Your current servers will continue running, and we’ll provide a clear migration path if any action is needed on your part. You can expect a follow up soon, however our goal is to do this with 0 downtime or impact to you if possible.

  • Will anything else change that impacts me?

    Modrinth Servers will remain the same great experience its has been, you likely won’t notice any changes right away. Long term, this means we’ll be able to improve both the stability of servers as well as the features that make managing your server a breeze.

This is an exciting step toward a future where Modrinth is the go-to destination for Java Minecraft players—not just for mods and mod-packs, but for hosting and playing too. We appreciate your support and can’t wait to share more soon!

` +export const html = `

Over the few months, Modrinth has seen incredible interest towards our Servers product, and with significant growth, our vision for what Modrinth Servers can be has evolved alongside it. To continue striving towards our goal of providing the best place to get your own Minecraft multiplayer server, we’ve made the decision to bring our server hosting fully in-house.

Why We're Making This Change

Modrinth has some ambitious goals for the next year. We want to create the best possible way for all Java players play Minecraft, and to host and play their favorite modpacks and custom servers. To achieve this, it’s clear that Modrinth Servers needs to be built and scaled on our own infrastructure.

By running every aspect of our hosting platform, we gain the flexibility to tailor the experience to our community’s needs—whether that means deeper integrations with Modrinth’s ecosystem, better performance, or more innovative features. This also allows us to invest in the long-term sustainability of Modrinth Servers, ensuring that we can scale seamlessly and avoid running out of available servers stock.

A Thank You to Pyro

This change is purely a logistical step forward and does not reflect negatively on our partnership with Pyro. In fact, Pyro has been an incredible partner in getting Modrinth Servers off the ground and we are very grateful for their collaboration. We completely support Pyro and their future, and we know they’re working on some exciting new products of their own, which we can’t wait to check out!

What This Means for You

We know you may have questions, and we want to make this transition as smooth as possible.

  • What part of my server was being run by Pyro?

    Until this point, Pyro has been responsible for the physical server machines that run your Modrinth servers. This means that they have been responsible for the hardware that powers your server, as well as the files and data for them. Moving forward, all of this will exist under Modrinth.

  • What happens to my running servers?

    Your current servers will continue running, and we’ll provide a clear migration path if any action is needed on your part. You can expect a follow up soon, however our goal is to do this with 0 downtime or impact to you if possible.

  • Will anything else change that impacts me?

    Modrinth Servers will remain the same great experience its has been, you likely won’t notice any changes right away. Long term, this means we’ll be able to improve both the stability of servers as well as the features that make managing your server a breeze.

This is an exciting step toward a future where Modrinth is the go-to destination for Java Minecraft players—not just for mods and mod-packs, but for hosting and playing too. We appreciate your support and can’t wait to share more soon!

`; diff --git a/packages/blog/compiled/a_new_chapter_for_modrinth_servers.ts b/packages/blog/compiled/a_new_chapter_for_modrinth_servers.ts index 29cc32b64..e9a5e9484 100644 --- a/packages/blog/compiled/a_new_chapter_for_modrinth_servers.ts +++ b/packages/blog/compiled/a_new_chapter_for_modrinth_servers.ts @@ -1,10 +1,11 @@ // AUTO-GENERATED FILE - DO NOT EDIT export const article = { - html: () => import(`./a_new_chapter_for_modrinth_servers.content`).then((m) => m.html), - title: 'A New Chapter for Modrinth Servers', - summary: 'Modrinth Servers is now fully operated in-house by the Modrinth Team.', - date: '2025-03-13T00:00:00.000Z', - slug: 'a-new-chapter-for-modrinth-servers', - authors: ['MpxzqsyW', 'Dc7EYhxG'], - thumbnail: true, -} + html: () => import(`./a_new_chapter_for_modrinth_servers.content`).then(m => m.html), + title: "A New Chapter for Modrinth Servers", + summary: "Modrinth Servers is now fully operated in-house by the Modrinth Team.", + date: "2025-03-13T00:00:00.000Z", + slug: "a-new-chapter-for-modrinth-servers", + authors: ["MpxzqsyW","Dc7EYhxG"], + thumbnail: true, + +}; diff --git a/packages/blog/compiled/accelerating_development.content.ts b/packages/blog/compiled/accelerating_development.content.ts index 0f1e1ed22..e2a00ce2d 100644 --- a/packages/blog/compiled/accelerating_development.content.ts +++ b/packages/blog/compiled/accelerating_development.content.ts @@ -1,2 +1,2 @@ // AUTO-GENERATED FILE - DO NOT EDIT -export const html = `

Update: On April 4, 2024 we announced that we had returned the remaining $800k in investor capital back to our investors to take a different path. Read that announcement here. This article remains here for archival purposes.


There are over 3 billion gamers worldwide, but only a small fraction ever go further and mod the games they play. Modrinth is here to bring modding to every player on the planet—all the while allowing mod creators to make a living off of it.

Since our founding in 2020 and up until a few months ago, Modrinth has been a purely volunteer project. In the past couple months, the Modrinth team has been more productive than ever. We've released the Anniversary Update, we're actively working on the launcher once more, and we're laying out plans for how to multiply Modrinth creator payouts.

The vision we have for the future of Modrinth is great, and right alongside that is the need for an amazing team to build out this vision. That's why we recently announced that we're hiring—we've already come so far on just volunteer work, but for Modrinth to be sustainable and for its growth to be sustainable, we need to pick up the pace.

That's why we're excited to announce that we've raised a pre-seed round of funding led by Makers Fund, with investors including Ryan Johnson, Stephen Cole, Pim de Witte, Chris Lee, and Andreas Thorstensson to accelerate development and expand to new horizons for Modrinth.

What's next?

We're thrilled to keep on building and iterating on Modrinth over the next few years. Here's a look into what we have in store over the next few months for Modrinth:

  • A feature-packed launcher
  • Creator organizations (like GitHub), wikis, graphs (with playtime, views, downloads, etc)
  • More creator payouts, through the growth of Adrinth
  • Discovery/recommendation of mods (especially up-and-coming content)
  • Comments (with built-in moderation and spam protection)
  • [Redacted]

Support for new games!

We are excited that we are able to build a product that will manage to grow us to sustainability and create the best modding experience for creators and users. Being able to pay ourselves and bring on new people is a big step in making that happen. There is still a lot to do, so let's get to it!

Q&A:

We know there might be some concerns so we included a short Q&A section below for some common ones. Feel free to ask in our Discord if you have any more questions!

Why does Modrinth need funding?

Our main expense is and will continue to be salaries. The labor cost has always been the main bottleneck for Modrinth. Having paid employees will allow us to develop Modrinth faster, bringing Modrinth to a point of sustainability and growing the platform. For example, we're planning to release our launcher this year, and eventually we're hoping to expand into more games. Those won't be possible without having paid employees.

Is Modrinth still community-first?

We started and always will have the goal of creating a community-oriented, open-source modding platform. Simply put, there isn't any reason for us not to be. It's clear that the previous impersonal, corporate approaches to video game modding have not worked, and Modrinth is excited to change that.

Will Modrinth still be open-source?

Yes! We are committed to having all (when possible) our current code and future code we write to be open-source. Copyright is held by the contributors as we have no CLA, so we cannot make it closed-source (even if we wanted to) without, well, violating the law.

Who's behind Modrinth?

The Modrinth team (currently consisting of Prospector, Emma, and Geometrically) is behind Modrinth. We've been modding Minecraft for years, with connections extending back to grade school. Investors have a minority stake in the company, and have no control or say in our decisions.

Is Modrinth going to adopt web3/cryptocurrency?

No. We have no plans to adopt or explore web3 for Modrinth.

Will investment money be used to fund creator payouts?

Not directly. Hiring more people will allow us to build up the infrastructure that can increase payouts, but the money we pay out to creators will always come from sustainable sources such as advertising and never from investment funds.

` +export const html = `

Update: On April 4, 2024 we announced that we had returned the remaining $800k in investor capital back to our investors to take a different path. Read that announcement here. This article remains here for archival purposes.


There are over 3 billion gamers worldwide, but only a small fraction ever go further and mod the games they play. Modrinth is here to bring modding to every player on the planet—all the while allowing mod creators to make a living off of it.

Since our founding in 2020 and up until a few months ago, Modrinth has been a purely volunteer project. In the past couple months, the Modrinth team has been more productive than ever. We've released the Anniversary Update, we're actively working on the launcher once more, and we're laying out plans for how to multiply Modrinth creator payouts.

The vision we have for the future of Modrinth is great, and right alongside that is the need for an amazing team to build out this vision. That's why we recently announced that we're hiring—we've already come so far on just volunteer work, but for Modrinth to be sustainable and for its growth to be sustainable, we need to pick up the pace.

That's why we're excited to announce that we've raised a pre-seed round of funding led by Makers Fund, with investors including Ryan Johnson, Stephen Cole, Pim de Witte, Chris Lee, and Andreas Thorstensson to accelerate development and expand to new horizons for Modrinth.

What's next?

We're thrilled to keep on building and iterating on Modrinth over the next few years. Here's a look into what we have in store over the next few months for Modrinth:

  • A feature-packed launcher
  • Creator organizations (like GitHub), wikis, graphs (with playtime, views, downloads, etc)
  • More creator payouts, through the growth of Adrinth
  • Discovery/recommendation of mods (especially up-and-coming content)
  • Comments (with built-in moderation and spam protection)
  • [Redacted]

Support for new games!

We are excited that we are able to build a product that will manage to grow us to sustainability and create the best modding experience for creators and users. Being able to pay ourselves and bring on new people is a big step in making that happen. There is still a lot to do, so let's get to it!

Q&A:

We know there might be some concerns so we included a short Q&A section below for some common ones. Feel free to ask in our Discord if you have any more questions!

Why does Modrinth need funding?

Our main expense is and will continue to be salaries. The labor cost has always been the main bottleneck for Modrinth. Having paid employees will allow us to develop Modrinth faster, bringing Modrinth to a point of sustainability and growing the platform. For example, we're planning to release our launcher this year, and eventually we're hoping to expand into more games. Those won't be possible without having paid employees.

Is Modrinth still community-first?

We started and always will have the goal of creating a community-oriented, open-source modding platform. Simply put, there isn't any reason for us not to be. It's clear that the previous impersonal, corporate approaches to video game modding have not worked, and Modrinth is excited to change that.

Will Modrinth still be open-source?

Yes! We are committed to having all (when possible) our current code and future code we write to be open-source. Copyright is held by the contributors as we have no CLA, so we cannot make it closed-source (even if we wanted to) without, well, violating the law.

Who's behind Modrinth?

The Modrinth team (currently consisting of Prospector, Emma, and Geometrically) is behind Modrinth. We've been modding Minecraft for years, with connections extending back to grade school. Investors have a minority stake in the company, and have no control or say in our decisions.

Is Modrinth going to adopt web3/cryptocurrency?

No. We have no plans to adopt or explore web3 for Modrinth.

Will investment money be used to fund creator payouts?

Not directly. Hiring more people will allow us to build up the infrastructure that can increase payouts, but the money we pay out to creators will always come from sustainable sources such as advertising and never from investment funds.

`; diff --git a/packages/blog/compiled/accelerating_development.ts b/packages/blog/compiled/accelerating_development.ts index 5f45cda45..6bc205671 100644 --- a/packages/blog/compiled/accelerating_development.ts +++ b/packages/blog/compiled/accelerating_development.ts @@ -1,10 +1,11 @@ // AUTO-GENERATED FILE - DO NOT EDIT export const article = { - html: () => import(`./accelerating_development.content`).then((m) => m.html), - title: "Accelerating Modrinth's Development", - summary: 'Our fundraiser and the future of Modrinth!', - date: '2023-02-01T20:00:00.000Z', - slug: 'accelerating-development', - authors: ['MpxzqsyW', 'Dc7EYhxG', '6plzAzU4'], - thumbnail: false, -} + html: () => import(`./accelerating_development.content`).then(m => m.html), + title: "Accelerating Modrinth's Development", + summary: "Our fundraiser and the future of Modrinth!", + date: "2023-02-01T20:00:00.000Z", + slug: "accelerating-development", + authors: ["MpxzqsyW","Dc7EYhxG","6plzAzU4"], + thumbnail: false, + +}; diff --git a/packages/blog/compiled/becoming_sustainable.content.ts b/packages/blog/compiled/becoming_sustainable.content.ts index 7a7c4760d..6aa531b46 100644 --- a/packages/blog/compiled/becoming_sustainable.content.ts +++ b/packages/blog/compiled/becoming_sustainable.content.ts @@ -1,2 +1,2 @@ // AUTO-GENERATED FILE - DO NOT EDIT -export const html = `

Just over 3 weeks ago, we launched our new ads powered by Aditude. These ads have allowed us to improve creator revenue drastically and become sustainable. Read on for more info!

Creator Revenue

We’re excited to share we have been able to increase creator revenue by 5-8x what it was before!

There’s a couple changes to how revenue is distributed out to creators coming with this increase.

First, revenue is no longer entirely paid out the day they are earned. Previously, we used our own in-house advertisement deal which paid us in advance for the entire month, and we divided that among each day in the month, as the month progressed. With the switch to a more traditional ad network, we are paid on a NET 60 basis, which is fairly standard with ad networks. What this means is that some of your revenue may be pending until the ad network pays us out. Exactly how this works is explained further here.

Second, the revenue split between Modrinth and Creators has changed. See the next section on sustainability for more on this.

Some creators have wondered if the new revenue is a bug because it’s gone up so much!

Becoming Sustainable

We have updated the Modrinth creator revenue split from 90/10 to 75/25. However, all of the increases listed above are with the new rate included, so while the percentage is lower, the overall revenue is much, much higher.

While 90% is a more remarkable figure, we changed it in order to ensure we can keep running Modrinth and continue to grow creator revenue without having to worry about losing money on operational costs.

Through these changes, we are proud to announce Modrinth is now fully sustainable with the new income, with all hosting and operational costs accounted for (including paying our developers, moderators, and support staff!) With the new revenue, users will see reduced support times and we will be able to ship bigger and better updates quicker to you all!

In an effort to be more transparent with our community than ever before, we are opening up as many of our finances as possible so you all can know how we’re doing and where all the money is going. We’re working to develop a transparency page on our website for you to view all the graphs and numbers, but it wasn’t ready in time for this blog post (for now, you can view our site-wide ad revenue in the API here. We also plan to publish monthly transparency reports with more details about our revenue and expenses, the first of which should be available in early October, so keep an eye out for that.

For now, we can tell you that creators on Modrinth have earned a total of $160,868 on Modrinth to date (as of September 13, 2024), and here’s a graph of our revenue from the past 30 days:

Modrinth Advertising Revenue (last 30 days)

We have a lot of exciting things coming up still, and of course, we greatly appreciate all of your support!

` +export const html = `

Just over 3 weeks ago, we launched our new ads powered by Aditude. These ads have allowed us to improve creator revenue drastically and become sustainable. Read on for more info!

Creator Revenue

We’re excited to share we have been able to increase creator revenue by 5-8x what it was before!

There’s a couple changes to how revenue is distributed out to creators coming with this increase.

First, revenue is no longer entirely paid out the day they are earned. Previously, we used our own in-house advertisement deal which paid us in advance for the entire month, and we divided that among each day in the month, as the month progressed. With the switch to a more traditional ad network, we are paid on a NET 60 basis, which is fairly standard with ad networks. What this means is that some of your revenue may be pending until the ad network pays us out. Exactly how this works is explained further here.

Second, the revenue split between Modrinth and Creators has changed. See the next section on sustainability for more on this.

Some creators have wondered if the new revenue is a bug because it’s gone up so much!

Becoming Sustainable

We have updated the Modrinth creator revenue split from 90/10 to 75/25. However, all of the increases listed above are with the new rate included, so while the percentage is lower, the overall revenue is much, much higher.

While 90% is a more remarkable figure, we changed it in order to ensure we can keep running Modrinth and continue to grow creator revenue without having to worry about losing money on operational costs.

Through these changes, we are proud to announce Modrinth is now fully sustainable with the new income, with all hosting and operational costs accounted for (including paying our developers, moderators, and support staff!) With the new revenue, users will see reduced support times and we will be able to ship bigger and better updates quicker to you all!

In an effort to be more transparent with our community than ever before, we are opening up as many of our finances as possible so you all can know how we’re doing and where all the money is going. We’re working to develop a transparency page on our website for you to view all the graphs and numbers, but it wasn’t ready in time for this blog post (for now, you can view our site-wide ad revenue in the API here. We also plan to publish monthly transparency reports with more details about our revenue and expenses, the first of which should be available in early October, so keep an eye out for that.

For now, we can tell you that creators on Modrinth have earned a total of $160,868 on Modrinth to date (as of September 13, 2024), and here’s a graph of our revenue from the past 30 days:

Modrinth Advertising Revenue (last 30 days)

We have a lot of exciting things coming up still, and of course, we greatly appreciate all of your support!

`; diff --git a/packages/blog/compiled/becoming_sustainable.ts b/packages/blog/compiled/becoming_sustainable.ts index b7d3db520..d0a2ac19e 100644 --- a/packages/blog/compiled/becoming_sustainable.ts +++ b/packages/blog/compiled/becoming_sustainable.ts @@ -1,12 +1,12 @@ // AUTO-GENERATED FILE - DO NOT EDIT export const article = { - html: () => import(`./becoming_sustainable.content`).then((m) => m.html), - title: 'Quintupling Creator Revenue and Becoming Sustainable', - summary: 'Announcing an update to our monetization program, creator split, and more!', - date: '2024-09-13T20:00:00.000Z', - slug: 'becoming-sustainable', - authors: ['MpxzqsyW', 'Dc7EYhxG'], - thumbnail: true, - short_title: 'Becoming Sustainable', - short_summary: 'Announcing 5x creator revenue and updates to the monetization program.', -} + html: () => import(`./becoming_sustainable.content`).then(m => m.html), + title: "Quintupling Creator Revenue and Becoming Sustainable", + summary: "Announcing an update to our monetization program, creator split, and more!", + date: "2024-09-13T20:00:00.000Z", + slug: "becoming-sustainable", + authors: ["MpxzqsyW","Dc7EYhxG"], + thumbnail: true, + short_title: "Becoming Sustainable", + short_summary: "Announcing 5x creator revenue and updates to the monetization program.", +}; diff --git a/packages/blog/compiled/capital_return.content.ts b/packages/blog/compiled/capital_return.content.ts index 801927642..78be51abc 100644 --- a/packages/blog/compiled/capital_return.content.ts +++ b/packages/blog/compiled/capital_return.content.ts @@ -1,2 +1,2 @@ // AUTO-GENERATED FILE - DO NOT EDIT -export const html = `

Over three years ago, I started Modrinth: a new Minecraft modding platform built on community principles, a fully open-source codebase, and a focus on creators.

What started as a hobby project quickly grew into something much bigger, with over twelve thousand creators and millions of players modding their game with Modrinth! Running Modrinth quickly evolved into a full-time job as we worked to scale the platform, develop new features, and fix bugs.

As our small project that originated in the Fabric Discord server started to get more and more serious, we decided to seek funding to accelerate growth and keep up with the competition. A year and a half ago, we raised a $1.2 million pre-seed round of investor capital. With the money, we hired full-time developers and part-time community members, some of whom have supported Modrinth since the very beginning. With all this support, we launched creator monetization, authentication, analytics, organizations, collections, the Modrinth App, and support for more project types, growing Modrinth’s user base fifteen-fold!

But, this rapid growth came at some costs. We let sustainable infrastructure for moderation slip to the back-burner since we could just hire extra moderators to compensate, and more and more of my time as the founder was taken up by things that didn’t make Modrinth better. Bugs and technical debt also gradually infected our codebase as we focused on hyper-growth over maintenance.

Alongside this, as we looked more into the future, we saw that the venture-backed cycle wouldn’t be the right path for Modrinth. Every investor invests in a company with the expectation of a return on their investment, and while all of our backers have been incredibly supportive, we wanted to be able to work on Modrinth at our own pace and terms. We’ve seen other companies in this space prioritize profits and growth at the expense of the community and creators, and we didn’t want this to happen to Modrinth.

In short, forgoing the venture route would allow us to build Modrinth independently at a sustainable pace and put our creators, community, open-source nature, and values first, without having to worry about expectations of profit or growth.

In the end, as of February 1st, 2024, I decided to return $800k in remaining investor capital back to our investors.

This decision was not an easy one, as without this funding, we would be unable to support the Modrinth team as it previously existed. With this reality, I made the difficult decision to significantly reduce the size of our team to match our goals of sustainable growth.

I also owe a huge debt of gratitude to everyone on the team affected by all of this–Emma, Wyatt, Maya, Coolbot, Jade, Carter, and Prospector–for everything they have done to help make Modrinth what it is today.

I want to take a moment to highlight each of their contributions:

  • Emma was our lead moderator, social media manager, overall marketing lead, blog post writer, documentation maintainer, Minotaur maintainer, and support manager since joining the team in April 2021
  • Wyatt was a full-time backend developer that worked on our authentication system, analytics, collections, organizations, and tons of work on API v3, and more, since joining the team in February 2023
  • Maya was our first exclusive moderator hire, and despite a rough onboarding due to a lack of internal documentation and procedures on our side, had reviewed thousands of projects since joining the team in April 2023
  • Coolbot was another one of our moderators who especially helped us establish new procedures and improved internal documentation for moderators and had also reviewed thousands of projects since they joined the team in August 2023
  • Jade was also a moderator and had reviewed thousands of projects since joining the team in August 2023
  • Carter was a full-time frontend developer that worked on OAuth, analytics, collections, organizations, and more, since joining the team in October 2023
  • Prospector is our frontend developer and lead designer, who has been with us since September 2020 and has spearheaded multiple site redesigns, developed the frontend for core parts of the site, and more

This transition was challenging, causing significant delays in project reviews and support ticket resolution, not to mention the stress for the former team. While project review and support times have returned to normal, this was not the experience we wanted for our creators or users to have. I sincerely apologize that you all had to experience this transition, and I wish that it had been executed more smoothly.

I would also like to apologize for how long this post has taken to come out. It took longer than I expected to do all the legal work and coordination necessary to return the remaining money to the investors, but it has finally been finished.

Going forward, we will be continuing to build a platform that is sustainable for both the creators and all the people who work on making the platform what it is. Hosting Modrinth is already sustainable, and we are working to make developing Modrinth sustainable as well.

We’ve made great strides in this already with new moderation infrastructure including AutoMod and a built-in moderator checklist, greatly reducing moderator time per project. We’re also focused on increased transparency, through providing consistent updates on Modrinth’s development and making it easier to contribute to Modrinth with better documentation and contribution cycle.

We started Modrinth to serve the community, and are taking this path so we can continue to. We hope you all will continue to support us as the newly independent Modrinth.

Jai (aka Geometrically)
Founder of Modrinth

` +export const html = `

Over three years ago, I started Modrinth: a new Minecraft modding platform built on community principles, a fully open-source codebase, and a focus on creators.

What started as a hobby project quickly grew into something much bigger, with over twelve thousand creators and millions of players modding their game with Modrinth! Running Modrinth quickly evolved into a full-time job as we worked to scale the platform, develop new features, and fix bugs.

As our small project that originated in the Fabric Discord server started to get more and more serious, we decided to seek funding to accelerate growth and keep up with the competition. A year and a half ago, we raised a $1.2 million pre-seed round of investor capital. With the money, we hired full-time developers and part-time community members, some of whom have supported Modrinth since the very beginning. With all this support, we launched creator monetization, authentication, analytics, organizations, collections, the Modrinth App, and support for more project types, growing Modrinth’s user base fifteen-fold!

But, this rapid growth came at some costs. We let sustainable infrastructure for moderation slip to the back-burner since we could just hire extra moderators to compensate, and more and more of my time as the founder was taken up by things that didn’t make Modrinth better. Bugs and technical debt also gradually infected our codebase as we focused on hyper-growth over maintenance.

Alongside this, as we looked more into the future, we saw that the venture-backed cycle wouldn’t be the right path for Modrinth. Every investor invests in a company with the expectation of a return on their investment, and while all of our backers have been incredibly supportive, we wanted to be able to work on Modrinth at our own pace and terms. We’ve seen other companies in this space prioritize profits and growth at the expense of the community and creators, and we didn’t want this to happen to Modrinth.

In short, forgoing the venture route would allow us to build Modrinth independently at a sustainable pace and put our creators, community, open-source nature, and values first, without having to worry about expectations of profit or growth.

In the end, as of February 1st, 2024, I decided to return $800k in remaining investor capital back to our investors.

This decision was not an easy one, as without this funding, we would be unable to support the Modrinth team as it previously existed. With this reality, I made the difficult decision to significantly reduce the size of our team to match our goals of sustainable growth.

I also owe a huge debt of gratitude to everyone on the team affected by all of this–Emma, Wyatt, Maya, Coolbot, Jade, Carter, and Prospector–for everything they have done to help make Modrinth what it is today.

I want to take a moment to highlight each of their contributions:

  • Emma was our lead moderator, social media manager, overall marketing lead, blog post writer, documentation maintainer, Minotaur maintainer, and support manager since joining the team in April 2021
  • Wyatt was a full-time backend developer that worked on our authentication system, analytics, collections, organizations, and tons of work on API v3, and more, since joining the team in February 2023
  • Maya was our first exclusive moderator hire, and despite a rough onboarding due to a lack of internal documentation and procedures on our side, had reviewed thousands of projects since joining the team in April 2023
  • Coolbot was another one of our moderators who especially helped us establish new procedures and improved internal documentation for moderators and had also reviewed thousands of projects since they joined the team in August 2023
  • Jade was also a moderator and had reviewed thousands of projects since joining the team in August 2023
  • Carter was a full-time frontend developer that worked on OAuth, analytics, collections, organizations, and more, since joining the team in October 2023
  • Prospector is our frontend developer and lead designer, who has been with us since September 2020 and has spearheaded multiple site redesigns, developed the frontend for core parts of the site, and more

This transition was challenging, causing significant delays in project reviews and support ticket resolution, not to mention the stress for the former team. While project review and support times have returned to normal, this was not the experience we wanted for our creators or users to have. I sincerely apologize that you all had to experience this transition, and I wish that it had been executed more smoothly.

I would also like to apologize for how long this post has taken to come out. It took longer than I expected to do all the legal work and coordination necessary to return the remaining money to the investors, but it has finally been finished.

Going forward, we will be continuing to build a platform that is sustainable for both the creators and all the people who work on making the platform what it is. Hosting Modrinth is already sustainable, and we are working to make developing Modrinth sustainable as well.

We’ve made great strides in this already with new moderation infrastructure including AutoMod and a built-in moderator checklist, greatly reducing moderator time per project. We’re also focused on increased transparency, through providing consistent updates on Modrinth’s development and making it easier to contribute to Modrinth with better documentation and contribution cycle.

We started Modrinth to serve the community, and are taking this path so we can continue to. We hope you all will continue to support us as the newly independent Modrinth.

Jai (aka Geometrically)
Founder of Modrinth

`; diff --git a/packages/blog/compiled/capital_return.ts b/packages/blog/compiled/capital_return.ts index a9f714667..9abf9822b 100644 --- a/packages/blog/compiled/capital_return.ts +++ b/packages/blog/compiled/capital_return.ts @@ -1,10 +1,11 @@ // AUTO-GENERATED FILE - DO NOT EDIT export const article = { - html: () => import(`./capital_return.content`).then((m) => m.html), - title: 'A Sustainable Path Forward for Modrinth', - summary: 'Our capital return and what’s next.', - date: '2024-04-04T20:00:00.000Z', - slug: 'capital-return', - authors: ['MpxzqsyW'], - thumbnail: false, -} + html: () => import(`./capital_return.content`).then(m => m.html), + title: "A Sustainable Path Forward for Modrinth", + summary: "Our capital return and what’s next.", + date: "2024-04-04T20:00:00.000Z", + slug: "capital-return", + authors: ["MpxzqsyW"], + thumbnail: false, + +}; diff --git a/packages/blog/compiled/carbon_ads.content.ts b/packages/blog/compiled/carbon_ads.content.ts index 0e2fd8a74..5927d4ca0 100644 --- a/packages/blog/compiled/carbon_ads.content.ts +++ b/packages/blog/compiled/carbon_ads.content.ts @@ -1,2 +1,2 @@ // AUTO-GENERATED FILE - DO NOT EDIT -export const html = `

Update 10/24: A month and a half ago we began testing Carbon Ads on Modrinth, and in the end, using Carbon did not work out. After disabling ads with tracking in them, the revenue was about equal to or worse than what we were generating previously with EthicalAds. Effective today, we are switching our ads provider back to EthicalAds for the time being.

As a step towards implementing author payouts, we're experimenting with a couple different ad providers to see which one works the best for us. We've been using EthicalAds for a long time now, but we'd like to now try out CarbonAds.

In most respects, this is a temporary experiment, but we're hoping that Carbon will become our primary ad provider in the near future.

Over the past week and a half, we've garnered a lot of useful feedback in the #devlog channel of our Discord. Over those 1,300 or so messages of open discussion and debate, there were also a lot of questions, concerns, and misconceptions. This blog post aims to address the most frequent of those.

FAQ

Is Carbon GDPR and CCPA compliant?

Yes. This was confirmed to us via email by a Carbon representative.

Are the ads intrusive?

No. They fall under the Acceptable Ads Standard; that is, there is only ever one per page, they are less than 120 pixels tall, and they are separate and distinguishable from actual site content.

Where did the privacy settings go?

Alongside the introduction of Carbon, we have removed the privacy settings that we previously had. These privacy settings controlled whether PII would be sent in our internal analytics and whether you wanted personalized ads to show up. Our analytics do not contain PII and Modrinth does not show personalized ads. Both of those would be intense breaches of your privacy, opt-in or not, and Modrinth intends to respect your privacy.

Why are you switching before you've released payouts?

We have been using ariadne to take note of page views and ad revenue since August 1st, 2022. While creator payouts cannot yet be claimed, all ad revenue from this date forward will be claimable once payouts are released!

Payouts are not yet done, but this switch is one of the largest things that needs to be done prior to its release.

Why does Modrinth need to switch away from Ethical?

There are quite a number of reasons why it's not feasible for us to continue using Ethical. In order to be fully transparent, let's go into detail about each of them.

In-house ads

Over half of the ads shown by Ethical are their so-called "in-house ads". That is, Ethical does not have enough inventory to always be showing an ad, so instead it shows an advertisement for itself. These self-advertisements make a whopping $0 for Modrinth.

Ethical does provide an option to replace these self-advertisements with our own fallback ads, which we've done for the past month or so. However, negotiating those sorts of deals takes an excruciating amount of time, time that we would rather be spending on developing Modrinth to make it better.

Carbon allows us to have a more hands-off approach with advertising, which is most ideal for us right now.

Poor CPM

Ethical gives us an average of $0.24 for every thousand page views (also known as CPM) after taking into account the aforementioned in-house ads. Anyone who knows anything about the advertising business knows that this figure is abysmally low. With Modrinth getting over four million page views in a month's timespan, we make an average of less than $1000 per month with Ethical. This simply isn't sustainable for the thousands of creators on Modrinth.

While we can't quite be sure what our CPM with Carbon will be -- again, this is only a temporary experiment for now -- we have reason to believe that it will be considerably greater than what Ethical can provide.

Network in decline

Over the time that Modrinth has used Ethical, we have found that the diversity of the advertisers shown has declined at a rate greater than is sustainable. The vast majority of the ads shown by Ethical, excluding its in-house ads, are for DigitalOcean. If DigitalOcean decided to withdraw from Ethical, that would end up toppling our entire system. Modrinth's payouts simply cannot rest on this house of cards if we wish to grow in any capacity.

Can I still use my adblocker?

You are still able to access Modrinth using an adblocker, and Modrinth will not force you to disable it to access the site. However, Modrinth's ads are unintrusive and take up no more space than it would otherwise.

When you turn off your adblocker for Modrinth, you are supporting both Modrinth and its creators in the process. 100% of the ad revenue from creator pages, including projects, versions, and users, go directly to creators. The ad revenue from other pages, including search, pay for Modrinth's upkeep costs and allow us to continue to exist.

For the benefit of everyone involved, we humbly request that you turn off your adblocker for Modrinth. We have a full guide for how to turn off your adblocker located on our docs site.

Conclusion

In conclusion, we hope you're as excited about our upcoming release of payouts as we are. Exploring our options for ad providers is quintessential if we wish to be sustainable for payouts, and the best time to do this is now. As always, though, no release ETAs!

Please note that this blog post was not editorialized or reviewed by Carbon prior to publishing. These are the findings and words of Modrinth and Modrinth alone. What's said here about CPMs and other statistics will not be true of other sites, but they are true for Modrinth.

` +export const html = `

Update 10/24: A month and a half ago we began testing Carbon Ads on Modrinth, and in the end, using Carbon did not work out. After disabling ads with tracking in them, the revenue was about equal to or worse than what we were generating previously with EthicalAds. Effective today, we are switching our ads provider back to EthicalAds for the time being.

As a step towards implementing author payouts, we're experimenting with a couple different ad providers to see which one works the best for us. We've been using EthicalAds for a long time now, but we'd like to now try out CarbonAds.

In most respects, this is a temporary experiment, but we're hoping that Carbon will become our primary ad provider in the near future.

Over the past week and a half, we've garnered a lot of useful feedback in the #devlog channel of our Discord. Over those 1,300 or so messages of open discussion and debate, there were also a lot of questions, concerns, and misconceptions. This blog post aims to address the most frequent of those.

FAQ

Is Carbon GDPR and CCPA compliant?

Yes. This was confirmed to us via email by a Carbon representative.

Are the ads intrusive?

No. They fall under the Acceptable Ads Standard; that is, there is only ever one per page, they are less than 120 pixels tall, and they are separate and distinguishable from actual site content.

Where did the privacy settings go?

Alongside the introduction of Carbon, we have removed the privacy settings that we previously had. These privacy settings controlled whether PII would be sent in our internal analytics and whether you wanted personalized ads to show up. Our analytics do not contain PII and Modrinth does not show personalized ads. Both of those would be intense breaches of your privacy, opt-in or not, and Modrinth intends to respect your privacy.

Why are you switching before you've released payouts?

We have been using ariadne to take note of page views and ad revenue since August 1st, 2022. While creator payouts cannot yet be claimed, all ad revenue from this date forward will be claimable once payouts are released!

Payouts are not yet done, but this switch is one of the largest things that needs to be done prior to its release.

Why does Modrinth need to switch away from Ethical?

There are quite a number of reasons why it's not feasible for us to continue using Ethical. In order to be fully transparent, let's go into detail about each of them.

In-house ads

Over half of the ads shown by Ethical are their so-called "in-house ads". That is, Ethical does not have enough inventory to always be showing an ad, so instead it shows an advertisement for itself. These self-advertisements make a whopping $0 for Modrinth.

Ethical does provide an option to replace these self-advertisements with our own fallback ads, which we've done for the past month or so. However, negotiating those sorts of deals takes an excruciating amount of time, time that we would rather be spending on developing Modrinth to make it better.

Carbon allows us to have a more hands-off approach with advertising, which is most ideal for us right now.

Poor CPM

Ethical gives us an average of $0.24 for every thousand page views (also known as CPM) after taking into account the aforementioned in-house ads. Anyone who knows anything about the advertising business knows that this figure is abysmally low. With Modrinth getting over four million page views in a month's timespan, we make an average of less than $1000 per month with Ethical. This simply isn't sustainable for the thousands of creators on Modrinth.

While we can't quite be sure what our CPM with Carbon will be -- again, this is only a temporary experiment for now -- we have reason to believe that it will be considerably greater than what Ethical can provide.

Network in decline

Over the time that Modrinth has used Ethical, we have found that the diversity of the advertisers shown has declined at a rate greater than is sustainable. The vast majority of the ads shown by Ethical, excluding its in-house ads, are for DigitalOcean. If DigitalOcean decided to withdraw from Ethical, that would end up toppling our entire system. Modrinth's payouts simply cannot rest on this house of cards if we wish to grow in any capacity.

Can I still use my adblocker?

You are still able to access Modrinth using an adblocker, and Modrinth will not force you to disable it to access the site. However, Modrinth's ads are unintrusive and take up no more space than it would otherwise.

When you turn off your adblocker for Modrinth, you are supporting both Modrinth and its creators in the process. 100% of the ad revenue from creator pages, including projects, versions, and users, go directly to creators. The ad revenue from other pages, including search, pay for Modrinth's upkeep costs and allow us to continue to exist.

For the benefit of everyone involved, we humbly request that you turn off your adblocker for Modrinth. We have a full guide for how to turn off your adblocker located on our docs site.

Conclusion

In conclusion, we hope you're as excited about our upcoming release of payouts as we are. Exploring our options for ad providers is quintessential if we wish to be sustainable for payouts, and the best time to do this is now. As always, though, no release ETAs!

Please note that this blog post was not editorialized or reviewed by Carbon prior to publishing. These are the findings and words of Modrinth and Modrinth alone. What's said here about CPMs and other statistics will not be true of other sites, but they are true for Modrinth.

`; diff --git a/packages/blog/compiled/carbon_ads.ts b/packages/blog/compiled/carbon_ads.ts index bc13c7ffb..95c3a21aa 100644 --- a/packages/blog/compiled/carbon_ads.ts +++ b/packages/blog/compiled/carbon_ads.ts @@ -1,10 +1,11 @@ // AUTO-GENERATED FILE - DO NOT EDIT export const article = { - html: () => import(`./carbon_ads.content`).then((m) => m.html), - title: "Modrinth's Carbon Ads experiment", - summary: 'Experimenting with a different ad providers to find one which one works for us.', - date: '2022-09-08T00:00:00.000Z', - slug: 'carbon-ads', - authors: ['6plzAzU4'], - thumbnail: true, -} + html: () => import(`./carbon_ads.content`).then(m => m.html), + title: "Modrinth's Carbon Ads experiment", + summary: "Experimenting with a different ad providers to find one which one works for us.", + date: "2022-09-08T00:00:00.000Z", + slug: "carbon-ads", + authors: ["6plzAzU4"], + thumbnail: true, + +}; diff --git a/packages/blog/compiled/creator_monetization.content.ts b/packages/blog/compiled/creator_monetization.content.ts index 5e48f5f88..f5c1104f6 100644 --- a/packages/blog/compiled/creator_monetization.content.ts +++ b/packages/blog/compiled/creator_monetization.content.ts @@ -1,2 +1,2 @@ // AUTO-GENERATED FILE - DO NOT EDIT -export const html = `

Yes, you read the title correctly: Modrinth's Creator Monetization Program, also known as payouts, is now in an open beta phase. All of the money that project owners have earned since August 1st is available to claim right now!

This includes even projects other than mods! Modpacks, plugins, and resource packs also generate payouts for creators to claim.

Alongside this, the frontend also got a facelift across the entire site, most notably on the settings, notifications, and user profile pages.

Motivation

Since the start, Modrinth has been a platform created by Minecraft content creators for Minecraft content creators. Allowing creators to earn a bit of money for their hard work and dedication to their content has been a goal since we started, and we are so incredibly ecstatic to finally be able to release this for everyone.

Whether it's used for buying coffee, paying for server costs, or to get that luxury pair of socks, we hope that creators will be able to use their payouts on whatever keeps them running. We want to encourage creators to keep making content for everyone to enjoy, with the hope that everyone will eventually be able to call Modrinth their go-to destination for Minecraft modded content.

How it works

For every project uploaded to Modrinth, we keep track of its page views and downloads through an internal system we call ariadne. Through our payouts algorithm (source code), we distribute 100% of ad revenue earned from creator pages to the creators behind these projects. Project owners can decide how to split it (or how not to split it) between their team members.

Modpacks are a bit different, with revenue split 80% to the Modrinth dependencies on the pack and 20% to the modpack author. This split is subject to change and will be evaluated periodically to ensure the split is reasonably fair.

After taking the search pages into account, around 10% of the site's ad revenue ends up going to us, mainly to cover hosting and personnel expenses, and 90% to creators.

While payouts will be small at first, we're working on improving our ads system to better fund the program. We've also got big projects coming soon to continue our trajectory of making the monetization program and the site better!

How do I earn money?

When a project of yours on Modrinth gets approved, you are automatically enrolled into the program. You will start to incur a balance, which you can view from the Monetization dashboard. You can claim your first payout via PayPal or Venmo as soon as you enter your credentials and have the minimum balance of 0.26 USD.

Even though the minimum is low, you will want to wait some time to allow your balance to build up before claiming. Each payment processor has its own fees which depend upon whether you're within the United States, which are detailed on the dashboard's revenue tab.

Once you request a transfer, you may have to confirm the transfer via email if you don't already have a PayPal account. If you do not confirm using the link in the email within 30 days, or the transfer fails for whatever reason, the amount requested will be returned to your Modrinth balance, though the processor's fees may already have been deducted by that point.

For residents outside the United States

Since Modrinth is a US-based company, all amounts are stored, displayed, and paid out in US dollars. PayPal will convert the amount to your local currency once you begin the process of transferring from your Modrinth balance to your PayPal account.

We're aware of some extenuating circumstances for creators living in areas affected by geopolitical conflict. As such, we are looking into alternative ways to allow payouts to continue in these regions.

At the moment, there are no mechanisms in place to make your Modrinth balance expire after some time, though this is likely to be added in the future for creators who do not claim their balance after several years. Rest assured, we will have processes in place to make sure that your money doesn't go poof just because you weren't able to claim it in time.

Frontend facelift

The website frontend has had some "small" changes of around 12,322 lines of code to accommodate payouts and many other changes. Many of these changes were inspired by the experiments done on the SvelteKit Rewrite, progress on which is paused for the time being. Navigate around the main site for a bit to discover some of these changes! Highlights include:

  • Improved project creation and report filing workflow via modals
  • Improved 404 page
  • Deduplicate identical version changelogs
  • Cleaner user profile pages
  • Easier to navigate settings and notifications
  • Spacing, font, and accessibility tweaks
  • And plenty more!

Conclusion

This is a jam-packed update, and it would be impossible to list all the changes in this post. Feel free to explore the site, claim your funds, and give us feedback on Discord. If you suspect you've found any critical bugs or exploits, please email us immediately at support@modrinth.com - otherwise, for non-critical bugs, report them on GitHub.

👑

` +export const html = `

Yes, you read the title correctly: Modrinth's Creator Monetization Program, also known as payouts, is now in an open beta phase. All of the money that project owners have earned since August 1st is available to claim right now!

This includes even projects other than mods! Modpacks, plugins, and resource packs also generate payouts for creators to claim.

Alongside this, the frontend also got a facelift across the entire site, most notably on the settings, notifications, and user profile pages.

Motivation

Since the start, Modrinth has been a platform created by Minecraft content creators for Minecraft content creators. Allowing creators to earn a bit of money for their hard work and dedication to their content has been a goal since we started, and we are so incredibly ecstatic to finally be able to release this for everyone.

Whether it's used for buying coffee, paying for server costs, or to get that luxury pair of socks, we hope that creators will be able to use their payouts on whatever keeps them running. We want to encourage creators to keep making content for everyone to enjoy, with the hope that everyone will eventually be able to call Modrinth their go-to destination for Minecraft modded content.

How it works

For every project uploaded to Modrinth, we keep track of its page views and downloads through an internal system we call ariadne. Through our payouts algorithm (source code), we distribute 100% of ad revenue earned from creator pages to the creators behind these projects. Project owners can decide how to split it (or how not to split it) between their team members.

Modpacks are a bit different, with revenue split 80% to the Modrinth dependencies on the pack and 20% to the modpack author. This split is subject to change and will be evaluated periodically to ensure the split is reasonably fair.

After taking the search pages into account, around 10% of the site's ad revenue ends up going to us, mainly to cover hosting and personnel expenses, and 90% to creators.

While payouts will be small at first, we're working on improving our ads system to better fund the program. We've also got big projects coming soon to continue our trajectory of making the monetization program and the site better!

How do I earn money?

When a project of yours on Modrinth gets approved, you are automatically enrolled into the program. You will start to incur a balance, which you can view from the Monetization dashboard. You can claim your first payout via PayPal or Venmo as soon as you enter your credentials and have the minimum balance of 0.26 USD.

Even though the minimum is low, you will want to wait some time to allow your balance to build up before claiming. Each payment processor has its own fees which depend upon whether you're within the United States, which are detailed on the dashboard's revenue tab.

Once you request a transfer, you may have to confirm the transfer via email if you don't already have a PayPal account. If you do not confirm using the link in the email within 30 days, or the transfer fails for whatever reason, the amount requested will be returned to your Modrinth balance, though the processor's fees may already have been deducted by that point.

For residents outside the United States

Since Modrinth is a US-based company, all amounts are stored, displayed, and paid out in US dollars. PayPal will convert the amount to your local currency once you begin the process of transferring from your Modrinth balance to your PayPal account.

We're aware of some extenuating circumstances for creators living in areas affected by geopolitical conflict. As such, we are looking into alternative ways to allow payouts to continue in these regions.

At the moment, there are no mechanisms in place to make your Modrinth balance expire after some time, though this is likely to be added in the future for creators who do not claim their balance after several years. Rest assured, we will have processes in place to make sure that your money doesn't go poof just because you weren't able to claim it in time.

Frontend facelift

The website frontend has had some "small" changes of around 12,322 lines of code to accommodate payouts and many other changes. Many of these changes were inspired by the experiments done on the SvelteKit Rewrite, progress on which is paused for the time being. Navigate around the main site for a bit to discover some of these changes! Highlights include:

  • Improved project creation and report filing workflow via modals
  • Improved 404 page
  • Deduplicate identical version changelogs
  • Cleaner user profile pages
  • Easier to navigate settings and notifications
  • Spacing, font, and accessibility tweaks
  • And plenty more!

Conclusion

This is a jam-packed update, and it would be impossible to list all the changes in this post. Feel free to explore the site, claim your funds, and give us feedback on Discord. If you suspect you've found any critical bugs or exploits, please email us immediately at support@modrinth.com - otherwise, for non-critical bugs, report them on GitHub.

👑

`; diff --git a/packages/blog/compiled/creator_monetization.ts b/packages/blog/compiled/creator_monetization.ts index 34a08e2c1..51cbef7f4 100644 --- a/packages/blog/compiled/creator_monetization.ts +++ b/packages/blog/compiled/creator_monetization.ts @@ -1,11 +1,11 @@ // AUTO-GENERATED FILE - DO NOT EDIT export const article = { - html: () => import(`./creator_monetization.content`).then((m) => m.html), - title: 'Creators can now make money on Modrinth!', - summary: - 'Introducing the Creator Monetization Program allowing creators to earn revenue from their projects.', - date: '2022-11-12T00:00:00.000Z', - slug: 'creator-monetization', - authors: ['6plzAzU4'], - thumbnail: true, -} + html: () => import(`./creator_monetization.content`).then(m => m.html), + title: "Creators can now make money on Modrinth!", + summary: "Introducing the Creator Monetization Program allowing creators to earn revenue from their projects.", + date: "2022-11-12T00:00:00.000Z", + slug: "creator-monetization", + authors: ["6plzAzU4"], + thumbnail: true, + +}; diff --git a/packages/blog/compiled/creator_update.content.ts b/packages/blog/compiled/creator_update.content.ts index 424d28762..bf636ccff 100644 --- a/packages/blog/compiled/creator_update.content.ts +++ b/packages/blog/compiled/creator_update.content.ts @@ -1,2 +1,2 @@ // AUTO-GENERATED FILE - DO NOT EDIT -export const html = `

December may be over, but that doesn’t mean we’re done giving gifts here at Modrinth. Over the past few months, we’ve been cooking up a whole bunch of new features for everyone to enjoy. Now seems like as good of a time as ever to bring you our Creator Update! Buckle up, because this is a big one.

The headlining features include:

  • Analytics - Allowing Modrinth creators to see statistics from their projects.
  • Organizations - Better tools to manage shared ownership over multiple projects.
  • Collections - A system for putting together shared sets of projects, similar to Spotify playlists.
  • New payouts system - Updates to the existing Creator Monetization Program to better serve creators around the world.
  • New Markdown editor - Explore a complete reworking of our text editor, making it easy even for those unfamiliar with Markdown.
  • OAuth integrations - Our own implementation of the OAuth specification, allowing external applications to “log in with Modrinth”.

Analytics

The long-awaited addition of analytics is here for creators! You can view analytics over time for your projects, including downloads, page views, and revenue, all in an effortlessly easy-to-use dashboard.

The analytics for a project, showing downloads, page views, and revenue, with a breakdown by country.

A screenshot of the analytics for a user, showing multiple different projects.

The data for analytics have been collected over the course of many months. In fact, the data for revenue goes all the way back to August 2022, and the data for downloads and views back to February 2023.

You can view the analytics for an individual project by going to the settings and clicking “Analytics”. You can view analytics for all of your projects in the analytics dashboard.

Organizations

Isn’t managing permissions across a bunch of different projects pretty tedious? We sure thought so. Just like on GitHub, you can now create organizations on Modrinth to manage permissions across multiple projects.

A screenshot of the organizations section of the Modrinth dashboard.

You can create organizations from the organizations dashboard. Each organization has a name, a brief summary, and an icon. Just like project members, organization members have a role, a monetization weight, and project permissions, plus permissions for the organization as a whole. Roles, monetization weights, and project permissions can be overridden on a per-project basis.

A screenshot of a user page, with two organizations shown at the very bottom.

Unlike GitHub, usernames and organization names on Modrinth do not conflict with one another. If you want to have an organization named after yourself, feel free to do so!

Collections

Just like how Spotify has playlists or how Goodreads has shelves, Modrinth now has collections! Collections are lists of Modrinth projects put together for a common purpose. You can then share these collections with others to view.

A screenshot of the Project Odyssey suite of mods as a collection.

Your followed projects now make up an automatically generated private collection, which you can access from the “Your collections” section of the dashboard.

Wait… aren’t those just modpacks?

Not quite! Modpacks are much more complex than collections. Collections are simply lists of projects. Here’s a quick comparison:

ModpacksCollections
Created through a launcher, such as the Modrinth App.Created on the Modrinth website.
Contains options files, configuration files, and optionally files from outside of Modrinth, wrapped together in a .mrpack file.Contains a list of Modrinth projects (mods, plugins, data packs, resource packs, shaders, and modpacks).
Has individual releases with version history.Instantly updates whenever a project is added or removed.
Must be reviewed by Modrinth’s staff and approved per Modrinth’s rules before it can be published.Does not need to be reviewed by Modrinth’s staff. Can go public at any time.
After approval, can be listed in search, archived, unlisted, or private.Can be public (shows up on your Modrinth profile), unlisted (only accessible by direct URL), or private (only you can access it).

All in all, collections are handy for easily grouping together and sharing Modrinth projects. If you’re bored on the subway heading home, you can look for new mods on your phone and quickly add them to a Modrinth collection. However, for many use cases, spending the time to create a modpack might make more sense. Collections and modpacks are both here to stay—one is not going to replace the other.

New payouts system

PayPal and Venmo are so 2023. To enter 2024, we are adding support for a bunch of different new payout methods, including ACH (available for direct transfer to a United States bank account) and a couple thousand gift cards. You know, just “a few”.

The withdrawal screen, with PayPal, Venmo, ACH, Visa, and a preview of two of the available options for the United States (AMC and Airbnb)

Whether you want Applebee’s in America, Boek & Bladkado in Belgium, or Cineplex in Canada, we’ve got them all and plenty more. Prepaid Visa cards, Amazon gift cards, and Steam gift cards are among the available options. Does anyone want a Home Depot gift card? We’ve got those, too.

New Markdown editor

For the longest time, Modrinth’s text editor for descriptions, changelogs, reports, and more has just been a box to enter Markdown syntax. What about people who don’t know Markdown, though? Even for those who do, writing it out by hand gets tedious after a while. That’s why we rebuilt it from the ground up to make it far easier to use.

Among its features are standard shortcuts (like Ctrl+B for bold), a monospace font in the editor itself, and buttons for inserting headers, basic formatting, lists, spoilers, block quotes, links, images, and YouTube videos.

Using the image button, you can also now upload images directly, instead of having to use an external host or the Gallery tab of a project. You can still insert images from outside sources, though certain sources (such as the Discord CDN) are blocked. We will notify authors using these blocked sources to replace the images.

OAuth integrations

Wouldn’t it be nice if other websites or apps could add a “Sign in with Modrinth” feature? We asked ourselves this and thought, yes, it would be nice to add. So we added it.

The OAuth2 protocol allows other services to gain a limited amount of access to your Modrinth account without compromising your login information. Maybe you want to create your own analytics dashboard? Or maybe you want to make your own way to add content to collections? How about connecting organization permissions to roles in a Discord server? The possibilities are endless.

A screenshot of an OAuth app requesting permission to your user profile.

You can create a new OAuth application in the Applications section of your settings. You can see which applications you’ve granted access to in the Authorizations section.

Conclusion

Want to hear more from us on a regular basis? Check us out on our social media pages; we post often on both Mastodon and X/Twitter. You can also chat with us on Discord if you like that.

Thanks to intergrav for making the banner image.

` +export const html = `

December may be over, but that doesn’t mean we’re done giving gifts here at Modrinth. Over the past few months, we’ve been cooking up a whole bunch of new features for everyone to enjoy. Now seems like as good of a time as ever to bring you our Creator Update! Buckle up, because this is a big one.

The headlining features include:

  • Analytics - Allowing Modrinth creators to see statistics from their projects.
  • Organizations - Better tools to manage shared ownership over multiple projects.
  • Collections - A system for putting together shared sets of projects, similar to Spotify playlists.
  • New payouts system - Updates to the existing Creator Monetization Program to better serve creators around the world.
  • New Markdown editor - Explore a complete reworking of our text editor, making it easy even for those unfamiliar with Markdown.
  • OAuth integrations - Our own implementation of the OAuth specification, allowing external applications to “log in with Modrinth”.

Analytics

The long-awaited addition of analytics is here for creators! You can view analytics over time for your projects, including downloads, page views, and revenue, all in an effortlessly easy-to-use dashboard.

The analytics for a project, showing downloads, page views, and revenue, with a breakdown by country.

A screenshot of the analytics for a user, showing multiple different projects.

The data for analytics have been collected over the course of many months. In fact, the data for revenue goes all the way back to August 2022, and the data for downloads and views back to February 2023.

You can view the analytics for an individual project by going to the settings and clicking “Analytics”. You can view analytics for all of your projects in the analytics dashboard.

Organizations

Isn’t managing permissions across a bunch of different projects pretty tedious? We sure thought so. Just like on GitHub, you can now create organizations on Modrinth to manage permissions across multiple projects.

A screenshot of the organizations section of the Modrinth dashboard.

You can create organizations from the organizations dashboard. Each organization has a name, a brief summary, and an icon. Just like project members, organization members have a role, a monetization weight, and project permissions, plus permissions for the organization as a whole. Roles, monetization weights, and project permissions can be overridden on a per-project basis.

A screenshot of a user page, with two organizations shown at the very bottom.

Unlike GitHub, usernames and organization names on Modrinth do not conflict with one another. If you want to have an organization named after yourself, feel free to do so!

Collections

Just like how Spotify has playlists or how Goodreads has shelves, Modrinth now has collections! Collections are lists of Modrinth projects put together for a common purpose. You can then share these collections with others to view.

A screenshot of the Project Odyssey suite of mods as a collection.

Your followed projects now make up an automatically generated private collection, which you can access from the “Your collections” section of the dashboard.

Wait… aren’t those just modpacks?

Not quite! Modpacks are much more complex than collections. Collections are simply lists of projects. Here’s a quick comparison:

ModpacksCollections
Created through a launcher, such as the Modrinth App.Created on the Modrinth website.
Contains options files, configuration files, and optionally files from outside of Modrinth, wrapped together in a .mrpack file.Contains a list of Modrinth projects (mods, plugins, data packs, resource packs, shaders, and modpacks).
Has individual releases with version history.Instantly updates whenever a project is added or removed.
Must be reviewed by Modrinth’s staff and approved per Modrinth’s rules before it can be published.Does not need to be reviewed by Modrinth’s staff. Can go public at any time.
After approval, can be listed in search, archived, unlisted, or private.Can be public (shows up on your Modrinth profile), unlisted (only accessible by direct URL), or private (only you can access it).

All in all, collections are handy for easily grouping together and sharing Modrinth projects. If you’re bored on the subway heading home, you can look for new mods on your phone and quickly add them to a Modrinth collection. However, for many use cases, spending the time to create a modpack might make more sense. Collections and modpacks are both here to stay—one is not going to replace the other.

New payouts system

PayPal and Venmo are so 2023. To enter 2024, we are adding support for a bunch of different new payout methods, including ACH (available for direct transfer to a United States bank account) and a couple thousand gift cards. You know, just “a few”.

The withdrawal screen, with PayPal, Venmo, ACH, Visa, and a preview of two of the available options for the United States (AMC and Airbnb)

Whether you want Applebee’s in America, Boek & Bladkado in Belgium, or Cineplex in Canada, we’ve got them all and plenty more. Prepaid Visa cards, Amazon gift cards, and Steam gift cards are among the available options. Does anyone want a Home Depot gift card? We’ve got those, too.

New Markdown editor

For the longest time, Modrinth’s text editor for descriptions, changelogs, reports, and more has just been a box to enter Markdown syntax. What about people who don’t know Markdown, though? Even for those who do, writing it out by hand gets tedious after a while. That’s why we rebuilt it from the ground up to make it far easier to use.

Among its features are standard shortcuts (like Ctrl+B for bold), a monospace font in the editor itself, and buttons for inserting headers, basic formatting, lists, spoilers, block quotes, links, images, and YouTube videos.

Using the image button, you can also now upload images directly, instead of having to use an external host or the Gallery tab of a project. You can still insert images from outside sources, though certain sources (such as the Discord CDN) are blocked. We will notify authors using these blocked sources to replace the images.

OAuth integrations

Wouldn’t it be nice if other websites or apps could add a “Sign in with Modrinth” feature? We asked ourselves this and thought, yes, it would be nice to add. So we added it.

The OAuth2 protocol allows other services to gain a limited amount of access to your Modrinth account without compromising your login information. Maybe you want to create your own analytics dashboard? Or maybe you want to make your own way to add content to collections? How about connecting organization permissions to roles in a Discord server? The possibilities are endless.

A screenshot of an OAuth app requesting permission to your user profile.

You can create a new OAuth application in the Applications section of your settings. You can see which applications you’ve granted access to in the Authorizations section.

Conclusion

Want to hear more from us on a regular basis? Check us out on our social media pages; we post often on both Mastodon and X/Twitter. You can also chat with us on Discord if you like that.

Thanks to intergrav for making the banner image.

`; diff --git a/packages/blog/compiled/creator_update.ts b/packages/blog/compiled/creator_update.ts index dbe85ad48..8931a0e11 100644 --- a/packages/blog/compiled/creator_update.ts +++ b/packages/blog/compiled/creator_update.ts @@ -1,12 +1,12 @@ // AUTO-GENERATED FILE - DO NOT EDIT export const article = { - html: () => import(`./creator_update.content`).then((m) => m.html), - title: 'Creator Update: Analytics, Organizations, Collections, and more', - summary: 'December may be over, but we’re not done giving gifts.', - date: '2024-01-06T20:00:00.000Z', - slug: 'creator-update', - authors: ['6plzAzU4'], - thumbnail: true, - short_title: 'The Creator Update', - short_summary: 'Adding analytics, orgs, collections, and more!', -} + html: () => import(`./creator_update.content`).then(m => m.html), + title: "Creator Update: Analytics, Organizations, Collections, and more", + summary: "December may be over, but we’re not done giving gifts.", + date: "2024-01-06T20:00:00.000Z", + slug: "creator-update", + authors: ["6plzAzU4"], + thumbnail: true, + short_title: "The Creator Update", + short_summary: "Adding analytics, orgs, collections, and more!", +}; diff --git a/packages/blog/compiled/creator_updates_july_2025.content.ts b/packages/blog/compiled/creator_updates_july_2025.content.ts index 9d682f2b5..dc3f1dec4 100644 --- a/packages/blog/compiled/creator_updates_july_2025.content.ts +++ b/packages/blog/compiled/creator_updates_july_2025.content.ts @@ -1,2 +1,2 @@ // AUTO-GENERATED FILE - DO NOT EDIT -export const html = `

Hey all,

The last few months have been quite hectic for Modrinth. We've experienced all-time highs in both traffic and new creators and have outgrown a lot of our existing systems, which has led to a lot of issues plaguing creators, especially.

The team has been super hard at work at this, and I'm really glad to announce that we've fixed most of these issues long term.

  1. Upload issues (inputs not showing up, instability, etc)

    We've tracked these issues down to conflicting code between our ad provider and Modrinth's. For now, we've disabled ads for all logged in users across the site while we work on resolving these long term. Both web users and logged-in web users make a very small percentage of our ad revenue (7% for web and 0.05% for logged-in web users) so creators should see a very minimal revenue drop from this, and have a much better experience navigating and uploading to the site.

  2. Moderation and report response times

    Creators have had to wait, in some cases, weeks to get their projects reviewed. This is unacceptable on our part and we are actively overhauling our moderation tooling to improve the moderation experience (and lowering time spent per project). We've also hired 3 additional moderators/support staff (bringing our total to 7 and the total team to 17 people!). We're hoping to see a significant reduction in queue times over the coming weeks.

  3. Ad revenue instability

    While ad revenue is generally out of our control and tends to fluctuate a lot, on June 4th we noticed a sharp decrease in creator revenue (~35% less than normal levels). While our ad provider initially thought this was a display issue, after further inquiry there were 2 causes: 1) Google AdExchange falsely flagging our traffic as invalid 2) Amazon banning many gaming publishers from their network due to panic in the gaming ads space. While the Amazon ban is now resolved, we no longer are running Google AdExchange in the desktop app due to invalid traffic issues. This will lead to a permanent revenue decrease (AdX contributed to ~20% of our ad revenue). We also updated our prebid version (the underlying tech used to run ad auctions) which has shown a measurable increase, bringing revenue back to "normal" levels. Overall, we are closely monitoring and will keep you all posted. However, despite all the issues, due to some end-of-quarter campaigns, revenue in June was an all time high, at $227k ($170k paid to creators)!

  4. Payout outages

    Creators should be able to withdraw their revenue at all times, but due to slow PayPal clearing times and poor planning by us, we've had multiple week long outages in withdrawals. While we do store funds 1:1, these "outages" happen because we primarily store creator funds in an FDIC-insured bank account, as we wouldn't want a PayPal/Tremendous account suspension to cause creators to lose funds. We've now set up internal reporting which should never cause this to happen again (or, if it does, drastically reduce the time payout outages happen)

  5. Platform Revenue Route

    Due to some unannounced breaking changes in Aditude's API, the platform revenue API was broken. It is now working. You can also use start and end fields to filter any date range!

  6. API and Uptime

    We've migrated our infrastructure for the website, app, and servers to OVH over our existing non-redundant AWS system. We've hit 99.96% uptime on our API and 99.98% on Modrinth Servers!

Thank you all for your patience! If you are having any more issues or have any questions about all of this, feel free to DM @geometrically on Discord or start a support chat and we will be happy to help!

` +export const html = `

Hey all,

The last few months have been quite hectic for Modrinth. We've experienced all-time highs in both traffic and new creators and have outgrown a lot of our existing systems, which has led to a lot of issues plaguing creators, especially.

The team has been super hard at work at this, and I'm really glad to announce that we've fixed most of these issues long term.

  1. Upload issues (inputs not showing up, instability, etc)

    We've tracked these issues down to conflicting code between our ad provider and Modrinth's. For now, we've disabled ads for all logged in users across the site while we work on resolving these long term. Both web users and logged-in web users make a very small percentage of our ad revenue (7% for web and 0.05% for logged-in web users) so creators should see a very minimal revenue drop from this, and have a much better experience navigating and uploading to the site.

  2. Moderation and report response times

    Creators have had to wait, in some cases, weeks to get their projects reviewed. This is unacceptable on our part and we are actively overhauling our moderation tooling to improve the moderation experience (and lowering time spent per project). We've also hired 3 additional moderators/support staff (bringing our total to 7 and the total team to 17 people!). We're hoping to see a significant reduction in queue times over the coming weeks.

  3. Ad revenue instability

    While ad revenue is generally out of our control and tends to fluctuate a lot, on June 4th we noticed a sharp decrease in creator revenue (~35% less than normal levels). While our ad provider initially thought this was a display issue, after further inquiry there were 2 causes: 1) Google AdExchange falsely flagging our traffic as invalid 2) Amazon banning many gaming publishers from their network due to panic in the gaming ads space. While the Amazon ban is now resolved, we no longer are running Google AdExchange in the desktop app due to invalid traffic issues. This will lead to a permanent revenue decrease (AdX contributed to ~20% of our ad revenue). We also updated our prebid version (the underlying tech used to run ad auctions) which has shown a measurable increase, bringing revenue back to "normal" levels. Overall, we are closely monitoring and will keep you all posted. However, despite all the issues, due to some end-of-quarter campaigns, revenue in June was an all time high, at $227k ($170k paid to creators)!

  4. Payout outages

    Creators should be able to withdraw their revenue at all times, but due to slow PayPal clearing times and poor planning by us, we've had multiple week long outages in withdrawals. While we do store funds 1:1, these "outages" happen because we primarily store creator funds in an FDIC-insured bank account, as we wouldn't want a PayPal/Tremendous account suspension to cause creators to lose funds. We've now set up internal reporting which should never cause this to happen again (or, if it does, drastically reduce the time payout outages happen)

  5. Platform Revenue Route

    Due to some unannounced breaking changes in Aditude's API, the platform revenue API was broken. It is now working. You can also use start and end fields to filter any date range!

  6. API and Uptime

    We've migrated our infrastructure for the website, app, and servers to OVH over our existing non-redundant AWS system. We've hit 99.96% uptime on our API and 99.98% on Modrinth Servers!

Thank you all for your patience! If you are having any more issues or have any questions about all of this, feel free to DM @geometrically on Discord or start a support chat and we will be happy to help!

`; diff --git a/packages/blog/compiled/creator_updates_july_2025.ts b/packages/blog/compiled/creator_updates_july_2025.ts index f4977e9ce..2937a1d2b 100644 --- a/packages/blog/compiled/creator_updates_july_2025.ts +++ b/packages/blog/compiled/creator_updates_july_2025.ts @@ -1,10 +1,11 @@ // AUTO-GENERATED FILE - DO NOT EDIT export const article = { - html: () => import(`./creator_updates_july_2025.content`).then((m) => m.html), - title: 'Creator Updates, July 2025', - summary: 'Addressing recent growth and growing pains that have been affecting creators.', - date: '2025-07-02T04:20:00.000Z', - slug: 'creator-updates-july-2025', - authors: ['MpxzqsyW'], - thumbnail: false, -} + html: () => import(`./creator_updates_july_2025.content`).then(m => m.html), + title: "Creator Updates, July 2025", + summary: "Addressing recent growth and growing pains that have been affecting creators.", + date: "2025-07-02T04:20:00.000Z", + slug: "creator-updates-july-2025", + authors: ["MpxzqsyW"], + thumbnail: false, + +}; diff --git a/packages/blog/compiled/design_refresh.content.ts b/packages/blog/compiled/design_refresh.content.ts index c63e4c231..933617129 100644 --- a/packages/blog/compiled/design_refresh.content.ts +++ b/packages/blog/compiled/design_refresh.content.ts @@ -1,2 +1,2 @@ // AUTO-GENERATED FILE - DO NOT EDIT -export const html = `

We’ve got a big launch with tons of new stuff today and some important updates about Modrinth. Read on, because we have a lot to cover!

Modrinth+

First off, we’re launching Modrinth+, a monthly subscription to help support Modrinth and all of the creators on it directly!

As a Modrinth+ subscriber, you will get:

  • Ad-free browsing on the Modrinth App and website
  • An exclusive badge on your profile
  • Half of your subscription will go to creators on the site!
  • …and more coming soon!

Pricing starts at $5/month, with discounts depending on what region you live in and if you opt for an annual plan.

We created Modrinth+ so people could help support Modrinth and creators on the site. We have no plans to paywall any content on Modrinth, and creator features will never cost money. We started Modrinth as a free and open-source platform, and we intend to keep it that way.

If you do have a few extra dollars a month and want to help support Modrinth, this is a great way to do it!

New Site Design: Stage One

We’re launching Stage One of Modrinth’s refreshed look to Modrinth.com today as well. I want to stress that it’s not fully complete and we’re going to be continuing to refine and finish updating the rest of the pages over the coming weeks. However, it has enough significant usability improvements and new features that we’re launching it broadly now. Please bear with us while we work to complete it promptly!

A screenshot of the new project page

Key new features include:

  • New download interface to ensure users get the correct version for the Minecraft version and mod loader they’re using
  • New versions list page built from the ground up with a clean new look and tons of shortcuts to make navigation easier
  • New “compatibility” widget on project pages to see what game versions, platforms, and environments each mod supports at a glance
  • Exclusion filters in search pages
  • Improved support for vertical desktop displays

We know there will be some minor hiccups and disruptions of workflows, but we’d really appreciate it if you could gently let us know how a particular change has affected you on GitHub here (or upvote/comment on an existing issue) rather than declaring it’s the end of the world.

New Advertising

In the last few months, Modrinth has grown an incredible amount. We are now serving over a petabyte of data per month (that is, 1,000 terabytes!) to over 20 million unique IP addresses. It’s almost unfathomable how large we have become since we started from nothing just four years ago.

However, with growth like this, our costs have also grown drastically—primarily in bandwidth. This, unfortunately, means that we’ve grown well beyond what a single advertiser could support.

Our original plan was to build out our own ad network (Adrinth) where we could cut out the middleman and provide highly targeted ads without the need for tracking to our gaming-specific audience. Unfortunately, we’ve grown too quickly (a very good problem to have!) and don’t have the immediate resources to do this at this time.

This leaves us with no choice but to switch to a more traditional programmatic ads setup powered by Aditude for the time being. We're not making this decision lightly, and we understand that some folks will not be happy about this change. Rest assured, we've made sure that our new ad network partner meets our requirements, such as compliance with all local regulations such as GDPR and CCPA, and that the new ads remain as unobstructive as possible with this format.

These changes bring Modrinth back to sustainability as well as conservatively increasing creator revenue by three-fold! Along with paying hosting bills, the new income will also be used for more support staff and paid team members, decreasing ticket time and speeding up our development.

We also want to thank our friends over at BisectHosting for supporting us with our ad deal for the past year.

Modrinth App 0.8.1

Over the last few months, we’ve been overhauling the internals of the Modrinth App to drastically improve performance and stability. Over one hundred issues have been closed with this update alone! Here’s a short list of the major changes:

  • Newer versions of Forge and NeoForge now work!
  • Migrated internal launcher data to use SQLite. The app now loads in <40ms on average (compared to ~2.5s before)!
  • Fixed issues where profiles could disappear in the UI
  • Fixed random cases of the UI freezing up during actions
  • Fixed directory changes being very inconsistent
  • Drastically improved offline mode
  • Fix freezing and include crash reports logs tab
  • And over one hundred more fixes!

Don’t have the Modrinth App? Check it out here!

Conclusion

Want to hear more from us on a regular basis? Check us out on our social media pages; we post often on both Mastodon and X/Twitter. You can also chat with us on Discord if you like that.

Thanks to intergrav for making the banner image.

` +export const html = `

We’ve got a big launch with tons of new stuff today and some important updates about Modrinth. Read on, because we have a lot to cover!

Modrinth+

First off, we’re launching Modrinth+, a monthly subscription to help support Modrinth and all of the creators on it directly!

As a Modrinth+ subscriber, you will get:

  • Ad-free browsing on the Modrinth App and website
  • An exclusive badge on your profile
  • Half of your subscription will go to creators on the site!
  • …and more coming soon!

Pricing starts at $5/month, with discounts depending on what region you live in and if you opt for an annual plan.

We created Modrinth+ so people could help support Modrinth and creators on the site. We have no plans to paywall any content on Modrinth, and creator features will never cost money. We started Modrinth as a free and open-source platform, and we intend to keep it that way.

If you do have a few extra dollars a month and want to help support Modrinth, this is a great way to do it!

New Site Design: Stage One

We’re launching Stage One of Modrinth’s refreshed look to Modrinth.com today as well. I want to stress that it’s not fully complete and we’re going to be continuing to refine and finish updating the rest of the pages over the coming weeks. However, it has enough significant usability improvements and new features that we’re launching it broadly now. Please bear with us while we work to complete it promptly!

A screenshot of the new project page

Key new features include:

  • New download interface to ensure users get the correct version for the Minecraft version and mod loader they’re using
  • New versions list page built from the ground up with a clean new look and tons of shortcuts to make navigation easier
  • New “compatibility” widget on project pages to see what game versions, platforms, and environments each mod supports at a glance
  • Exclusion filters in search pages
  • Improved support for vertical desktop displays

We know there will be some minor hiccups and disruptions of workflows, but we’d really appreciate it if you could gently let us know how a particular change has affected you on GitHub here (or upvote/comment on an existing issue) rather than declaring it’s the end of the world.

New Advertising

In the last few months, Modrinth has grown an incredible amount. We are now serving over a petabyte of data per month (that is, 1,000 terabytes!) to over 20 million unique IP addresses. It’s almost unfathomable how large we have become since we started from nothing just four years ago.

However, with growth like this, our costs have also grown drastically—primarily in bandwidth. This, unfortunately, means that we’ve grown well beyond what a single advertiser could support.

Our original plan was to build out our own ad network (Adrinth) where we could cut out the middleman and provide highly targeted ads without the need for tracking to our gaming-specific audience. Unfortunately, we’ve grown too quickly (a very good problem to have!) and don’t have the immediate resources to do this at this time.

This leaves us with no choice but to switch to a more traditional programmatic ads setup powered by Aditude for the time being. We're not making this decision lightly, and we understand that some folks will not be happy about this change. Rest assured, we've made sure that our new ad network partner meets our requirements, such as compliance with all local regulations such as GDPR and CCPA, and that the new ads remain as unobstructive as possible with this format.

These changes bring Modrinth back to sustainability as well as conservatively increasing creator revenue by three-fold! Along with paying hosting bills, the new income will also be used for more support staff and paid team members, decreasing ticket time and speeding up our development.

We also want to thank our friends over at BisectHosting for supporting us with our ad deal for the past year.

Modrinth App 0.8.1

Over the last few months, we’ve been overhauling the internals of the Modrinth App to drastically improve performance and stability. Over one hundred issues have been closed with this update alone! Here’s a short list of the major changes:

  • Newer versions of Forge and NeoForge now work!
  • Migrated internal launcher data to use SQLite. The app now loads in <40ms on average (compared to ~2.5s before)!
  • Fixed issues where profiles could disappear in the UI
  • Fixed random cases of the UI freezing up during actions
  • Fixed directory changes being very inconsistent
  • Drastically improved offline mode
  • Fix freezing and include crash reports logs tab
  • And over one hundred more fixes!

Don’t have the Modrinth App? Check it out here!

Conclusion

Want to hear more from us on a regular basis? Check us out on our social media pages; we post often on both Mastodon and X/Twitter. You can also chat with us on Discord if you like that.

Thanks to intergrav for making the banner image.

`; diff --git a/packages/blog/compiled/design_refresh.ts b/packages/blog/compiled/design_refresh.ts index 4e6ab7067..81aaeb30c 100644 --- a/packages/blog/compiled/design_refresh.ts +++ b/packages/blog/compiled/design_refresh.ts @@ -1,13 +1,12 @@ // AUTO-GENERATED FILE - DO NOT EDIT export const article = { - html: () => import(`./design_refresh.content`).then((m) => m.html), - title: 'Introducing Modrinth+, a refreshed site look, and a new advertising system!', - summary: 'Learn about this major update to Modrinth.', - date: '2024-08-21T20:00:00.000Z', - slug: 'design-refresh', - authors: ['MpxzqsyW', 'Dc7EYhxG'], - thumbnail: true, - short_title: 'Modrinth+ and New Ads', - short_summary: - 'Introducing a new ad system, a subscription to remove ads, and a redesign of the website!', -} + html: () => import(`./design_refresh.content`).then(m => m.html), + title: "Introducing Modrinth+, a refreshed site look, and a new advertising system!", + summary: "Learn about this major update to Modrinth.", + date: "2024-08-21T20:00:00.000Z", + slug: "design-refresh", + authors: ["MpxzqsyW","Dc7EYhxG"], + thumbnail: true, + short_title: "Modrinth+ and New Ads", + short_summary: "Introducing a new ad system, a subscription to remove ads, and a redesign of the website!", +}; diff --git a/packages/blog/compiled/download_adjustment.content.ts b/packages/blog/compiled/download_adjustment.content.ts index d77095cf9..d57c04f2f 100644 --- a/packages/blog/compiled/download_adjustment.content.ts +++ b/packages/blog/compiled/download_adjustment.content.ts @@ -1,2 +1,2 @@ // AUTO-GENERATED FILE - DO NOT EDIT -export const html = `

While working on the upcoming analytics update for Modrinth, our team found an issue leading to higher download counts from specific countries. This was caused by an oversight with regards to rate limiting, or in other words, certain files being downloaded over and over again. Importantly, this did not affect creator payouts; only our analytics. Approximately 15.4% of Modrinth downloads were found to be over-counted. These duplicates have been identified and are being removed from project download counts and analytics. Read on to learn about the cause of this error and how we fixed it.

A graph of many Modrinth projects and their download counts, showing a disproportionate amount of downloads from China.

Notice anything out of the ordinary?

More specifically, the issue we encountered is that the download counts from China were through the roof compared to the page view statistics.

A graph of many Modrinth projects and their page views, showing a relatively even distribution across countries.

Upon further investigation, there was one specific launcher that was repeatedly downloading the same files from Modrinth over and over again within a very short time span.

A table of downloads split into several parts.

Notice how the downloads in each section (delineated by the bold line) have the same path and were created within the same second.

This, to say the least, baffled us. We already had code called Sisyphus in place to limit the number of downloads that a single source can make over a given span of time. So what gives?

As it turns out, the issue lay in the underlying technology used by Sisyphus. It uses Cloudflare Workers in order to intercept the request each time that a file is requested to be downloaded. Essentially, it acted like so:

  1. A source (whether this be a launcher, someone clicking the download button on the website, etc.) would request a file from Modrinth.
  2. Sisyphus would take note of this source’s information, including what it requested, its IP address, and its request headers, and write it to a small database. If this source had not requested this path before, it would add one download to this file. If it had already requested it, it would not.
  3. Sisyphus would then give the file that the source requested. It gives the file regardless of whether the download counted or not.

For the most part, this system works fairly well. The main issue comes in step 2: it takes a little while for different Sisyphus instances to sync up with each other. One of the benefits of Cloudflare Workers is that the code is deployed to hundreds of different servers around the world. When multiple requests come in at the same time, they can get routed to different servers in order to allow each request to be handled faster. Cloudflare Workers, however, takes up to 60 seconds for each server’s information to sync up with each other. A server in Australia might know that a given source has already downloaded something, but a server in Turkey might not. As a result, multiple downloads from the same source might all get counted if they are handled by different servers.

In order to fix this, we entirely rewrote Sisyphus. It still uses Cloudflare Workers, but all of the processing of step 2 has been offloaded to the main Modrinth backend. This not only speeds up downloads (even if only briefly), but also makes download counts more reliable. Over the past few days, we've already implemented the necessary adjustments. Our observations have shown that the results are significantly more consistent in their accuracy. Instead of having strange spikes in activity, the graph of new downloads now follows the expected pattern.

A graph that is split up into two parts: on the left, a spiky graph with the text "old sisyphus". On the right, a graph with consistent dips and peaks.

Notice the spikes on the left? Compare that to the silky-smooth sinusoidal satisfaction on the right!

To reiterate, the issue is now resolved and payouts were not affected. Payouts do not take into account downloads from launchers other than the Modrinth App; therefore, this adjustment has no bearing on payouts.

P.S. Are you curious about why our download counter is called Sisyphus? In Greek mythology, Sisyphus rolls a boulder up a hill for the rest of eternity. Like Sisyphus, our download counter has no point other than to keep increasing for as long as Modrinth exists.

` +export const html = `

While working on the upcoming analytics update for Modrinth, our team found an issue leading to higher download counts from specific countries. This was caused by an oversight with regards to rate limiting, or in other words, certain files being downloaded over and over again. Importantly, this did not affect creator payouts; only our analytics. Approximately 15.4% of Modrinth downloads were found to be over-counted. These duplicates have been identified and are being removed from project download counts and analytics. Read on to learn about the cause of this error and how we fixed it.

A graph of many Modrinth projects and their download counts, showing a disproportionate amount of downloads from China.

Notice anything out of the ordinary?

More specifically, the issue we encountered is that the download counts from China were through the roof compared to the page view statistics.

A graph of many Modrinth projects and their page views, showing a relatively even distribution across countries.

Upon further investigation, there was one specific launcher that was repeatedly downloading the same files from Modrinth over and over again within a very short time span.

A table of downloads split into several parts.

Notice how the downloads in each section (delineated by the bold line) have the same path and were created within the same second.

This, to say the least, baffled us. We already had code called Sisyphus in place to limit the number of downloads that a single source can make over a given span of time. So what gives?

As it turns out, the issue lay in the underlying technology used by Sisyphus. It uses Cloudflare Workers in order to intercept the request each time that a file is requested to be downloaded. Essentially, it acted like so:

  1. A source (whether this be a launcher, someone clicking the download button on the website, etc.) would request a file from Modrinth.
  2. Sisyphus would take note of this source’s information, including what it requested, its IP address, and its request headers, and write it to a small database. If this source had not requested this path before, it would add one download to this file. If it had already requested it, it would not.
  3. Sisyphus would then give the file that the source requested. It gives the file regardless of whether the download counted or not.

For the most part, this system works fairly well. The main issue comes in step 2: it takes a little while for different Sisyphus instances to sync up with each other. One of the benefits of Cloudflare Workers is that the code is deployed to hundreds of different servers around the world. When multiple requests come in at the same time, they can get routed to different servers in order to allow each request to be handled faster. Cloudflare Workers, however, takes up to 60 seconds for each server’s information to sync up with each other. A server in Australia might know that a given source has already downloaded something, but a server in Turkey might not. As a result, multiple downloads from the same source might all get counted if they are handled by different servers.

In order to fix this, we entirely rewrote Sisyphus. It still uses Cloudflare Workers, but all of the processing of step 2 has been offloaded to the main Modrinth backend. This not only speeds up downloads (even if only briefly), but also makes download counts more reliable. Over the past few days, we've already implemented the necessary adjustments. Our observations have shown that the results are significantly more consistent in their accuracy. Instead of having strange spikes in activity, the graph of new downloads now follows the expected pattern.

A graph that is split up into two parts: on the left, a spiky graph with the text "old sisyphus". On the right, a graph with consistent dips and peaks.

Notice the spikes on the left? Compare that to the silky-smooth sinusoidal satisfaction on the right!

To reiterate, the issue is now resolved and payouts were not affected. Payouts do not take into account downloads from launchers other than the Modrinth App; therefore, this adjustment has no bearing on payouts.

P.S. Are you curious about why our download counter is called Sisyphus? In Greek mythology, Sisyphus rolls a boulder up a hill for the rest of eternity. Like Sisyphus, our download counter has no point other than to keep increasing for as long as Modrinth exists.

`; diff --git a/packages/blog/compiled/download_adjustment.ts b/packages/blog/compiled/download_adjustment.ts index 3fa19aab7..d6ee3eee6 100644 --- a/packages/blog/compiled/download_adjustment.ts +++ b/packages/blog/compiled/download_adjustment.ts @@ -1,11 +1,11 @@ // AUTO-GENERATED FILE - DO NOT EDIT export const article = { - html: () => import(`./download_adjustment.content`).then((m) => m.html), - title: 'Correcting Inflated Download Counts due to Rate Limiting Issue', - summary: 'A rate limiting issue caused inflated download counts in certain countries.', - date: '2023-11-10T20:00:00.000Z', - slug: 'download-adjustment', - authors: ['6plzAzU4', 'MpxzqsyW'], - thumbnail: false, - short_title: 'Correcting Inflated Download Counts', -} + html: () => import(`./download_adjustment.content`).then(m => m.html), + title: "Correcting Inflated Download Counts due to Rate Limiting Issue", + summary: "A rate limiting issue caused inflated download counts in certain countries.", + date: "2023-11-10T20:00:00.000Z", + slug: "download-adjustment", + authors: ["6plzAzU4","MpxzqsyW"], + thumbnail: false, + short_title: "Correcting Inflated Download Counts", +}; diff --git a/packages/blog/compiled/index.ts b/packages/blog/compiled/index.ts index 0f8a40b44..617be851e 100644 --- a/packages/blog/compiled/index.ts +++ b/packages/blog/compiled/index.ts @@ -1,56 +1,56 @@ // AUTO-GENERATED FILE - DO NOT EDIT -import { article as a_new_chapter_for_modrinth_servers } from './a_new_chapter_for_modrinth_servers' -import { article as accelerating_development } from './accelerating_development' -import { article as becoming_sustainable } from './becoming_sustainable' -import { article as capital_return } from './capital_return' -import { article as carbon_ads } from './carbon_ads' -import { article as creator_monetization } from './creator_monetization' -import { article as creator_update } from './creator_update' -import { article as creator_updates_july_2025 } from './creator_updates_july_2025' -import { article as design_refresh } from './design_refresh' -import { article as download_adjustment } from './download_adjustment' -import { article as knossos_v2_1_0 } from './knossos_v2_1_0' -import { article as licensing_guide } from './licensing_guide' -import { article as modpack_changes } from './modpack_changes' -import { article as modpacks_alpha } from './modpacks_alpha' -import { article as modrinth_app_beta } from './modrinth_app_beta' -import { article as modrinth_beta } from './modrinth_beta' -import { article as modrinth_servers_beta } from './modrinth_servers_beta' -import { article as new_site_beta } from './new_site_beta' -import { article as plugins_resource_packs } from './plugins_resource_packs' -import { article as pride_campaign_2025 } from './pride_campaign_2025' -import { article as redesign } from './redesign' -import { article as skins_now_in_modrinth_app } from './skins_now_in_modrinth_app' -import { article as two_years_of_modrinth } from './two_years_of_modrinth' -import { article as two_years_of_modrinth_history } from './two_years_of_modrinth_history' -import { article as whats_modrinth } from './whats_modrinth' -import { article as windows_borderless_malware_disclosure } from './windows_borderless_malware_disclosure' +import { article as windows_borderless_malware_disclosure } from "./windows_borderless_malware_disclosure"; +import { article as whats_modrinth } from "./whats_modrinth"; +import { article as two_years_of_modrinth } from "./two_years_of_modrinth"; +import { article as two_years_of_modrinth_history } from "./two_years_of_modrinth_history"; +import { article as skins_now_in_modrinth_app } from "./skins_now_in_modrinth_app"; +import { article as redesign } from "./redesign"; +import { article as pride_campaign_2025 } from "./pride_campaign_2025"; +import { article as plugins_resource_packs } from "./plugins_resource_packs"; +import { article as new_site_beta } from "./new_site_beta"; +import { article as modrinth_servers_beta } from "./modrinth_servers_beta"; +import { article as modrinth_beta } from "./modrinth_beta"; +import { article as modrinth_app_beta } from "./modrinth_app_beta"; +import { article as modpacks_alpha } from "./modpacks_alpha"; +import { article as modpack_changes } from "./modpack_changes"; +import { article as licensing_guide } from "./licensing_guide"; +import { article as knossos_v2_1_0 } from "./knossos_v2_1_0"; +import { article as download_adjustment } from "./download_adjustment"; +import { article as design_refresh } from "./design_refresh"; +import { article as creator_updates_july_2025 } from "./creator_updates_july_2025"; +import { article as creator_update } from "./creator_update"; +import { article as creator_monetization } from "./creator_monetization"; +import { article as carbon_ads } from "./carbon_ads"; +import { article as capital_return } from "./capital_return"; +import { article as becoming_sustainable } from "./becoming_sustainable"; +import { article as accelerating_development } from "./accelerating_development"; +import { article as a_new_chapter_for_modrinth_servers } from "./a_new_chapter_for_modrinth_servers"; export const articles = [ - windows_borderless_malware_disclosure, - whats_modrinth, - two_years_of_modrinth, - two_years_of_modrinth_history, - skins_now_in_modrinth_app, - redesign, - pride_campaign_2025, - plugins_resource_packs, - new_site_beta, - modrinth_servers_beta, - modrinth_beta, - modrinth_app_beta, - modpacks_alpha, - modpack_changes, - licensing_guide, - knossos_v2_1_0, - download_adjustment, - design_refresh, - creator_updates_july_2025, - creator_update, - creator_monetization, - carbon_ads, - capital_return, - becoming_sustainable, - accelerating_development, - a_new_chapter_for_modrinth_servers, -] + windows_borderless_malware_disclosure, + whats_modrinth, + two_years_of_modrinth, + two_years_of_modrinth_history, + skins_now_in_modrinth_app, + redesign, + pride_campaign_2025, + plugins_resource_packs, + new_site_beta, + modrinth_servers_beta, + modrinth_beta, + modrinth_app_beta, + modpacks_alpha, + modpack_changes, + licensing_guide, + knossos_v2_1_0, + download_adjustment, + design_refresh, + creator_updates_july_2025, + creator_update, + creator_monetization, + carbon_ads, + capital_return, + becoming_sustainable, + accelerating_development, + a_new_chapter_for_modrinth_servers +]; diff --git a/packages/blog/compiled/knossos_v2_1_0.content.ts b/packages/blog/compiled/knossos_v2_1_0.content.ts index e131389c9..385d0f64e 100644 --- a/packages/blog/compiled/knossos_v2_1_0.content.ts +++ b/packages/blog/compiled/knossos_v2_1_0.content.ts @@ -1,2 +1,2 @@ // AUTO-GENERATED FILE - DO NOT EDIT -export const html = `

It's officially been a bit over a week since Modrinth launched out of beta. We have continued to make improvements to the user experience on the website.

New features

We've added a number of new features to improve your experience.

Click to expand gallery images

The new expanding gallery images

In the gallery page of a project, you can now click on the images to expand the image and view it more closely. You can also use the left arrow, right arrow, and Escape keyboard keys to aid navigation.

Filters for the 'Changelog' and 'Versions' pages

The new changelog and versions filtering options

Versions on the Changelog and Versions page can now be filtered by mod loader and Minecraft version.

More easily access the list of projects you follow

The new 'Following' button in the profile dropdown

The link to the list of your followed projects is now listed in your profile dropdown.

Fixes and Changes

While new features are great, we've also been working on a bunch of bugfixes. Below is a list of some of the notable fixes, but it is not a comprehensive list.

  • Improved the layout of the search page's search bar and options card to more dynamically adjust to screen size
  • Changed the tab indicator to be rounded
  • Changed the download icon to be more recognizable
  • Changed the profile dropdown caret to use an SVG instead of a text symbol for better font support
  • Changed the styling on text fields to be more consistent with the design language of the site
  • Changed the styling on disabled buttons to use an outline to reduce confusion
  • Changed the styling on links to be more consistent and obvious
  • Changed the wording of the options that move the sidebars to the right
  • Changed the green syntax highlighting in code blocks to match the brand color
  • Fixed the styling on various buttons and links that were missing hover or active states
  • Fixed the inconsistent rounding of the information card on the home page
  • [GH-370] Fixed download buttons in the changelog page
  • [GH-384] Fixed selecting too many Minecraft versions in the search page covering the license dropdown
  • [GH-390] Fixed the hover state of checkboxes not updating when clicking on the label
  • [GH-393] Fixed the padding of the donation link area when creating or editing a project
  • [GH-394] Fixed the rounding radius of dropdowns when opening upwards

Minotaur fixes

Minotaur, our Gradle plugin, has also received a few fixes. This isn't going to be relevant to most people, but is relevant to some developers using this tool to deploy their mods.

  • Debug mode (enabled through debugMode = true) allows previewing the data to be uploaded before uploading
  • Fix edge case with ForgeGradle due to broken publishing metadata
  • Fix game version detection on Fabric Loom 0.11
  • Fix doLast and related methods not being usable because the task was registered in afterEvaluate

These fixes should have been automatically pulled in, assuming you're using Minotaur 2.+. If not, you should be upgrading to 2.0.2.

Need a guide to migrate from Minotaur v1 to v2? Check the migration guide on the redesign post.

` +export const html = `

It's officially been a bit over a week since Modrinth launched out of beta. We have continued to make improvements to the user experience on the website.

New features

We've added a number of new features to improve your experience.

Click to expand gallery images

The new expanding gallery images

In the gallery page of a project, you can now click on the images to expand the image and view it more closely. You can also use the left arrow, right arrow, and Escape keyboard keys to aid navigation.

Filters for the 'Changelog' and 'Versions' pages

The new changelog and versions filtering options

Versions on the Changelog and Versions page can now be filtered by mod loader and Minecraft version.

More easily access the list of projects you follow

The new 'Following' button in the profile dropdown

The link to the list of your followed projects is now listed in your profile dropdown.

Fixes and Changes

While new features are great, we've also been working on a bunch of bugfixes. Below is a list of some of the notable fixes, but it is not a comprehensive list.

  • Improved the layout of the search page's search bar and options card to more dynamically adjust to screen size
  • Changed the tab indicator to be rounded
  • Changed the download icon to be more recognizable
  • Changed the profile dropdown caret to use an SVG instead of a text symbol for better font support
  • Changed the styling on text fields to be more consistent with the design language of the site
  • Changed the styling on disabled buttons to use an outline to reduce confusion
  • Changed the styling on links to be more consistent and obvious
  • Changed the wording of the options that move the sidebars to the right
  • Changed the green syntax highlighting in code blocks to match the brand color
  • Fixed the styling on various buttons and links that were missing hover or active states
  • Fixed the inconsistent rounding of the information card on the home page
  • [GH-370] Fixed download buttons in the changelog page
  • [GH-384] Fixed selecting too many Minecraft versions in the search page covering the license dropdown
  • [GH-390] Fixed the hover state of checkboxes not updating when clicking on the label
  • [GH-393] Fixed the padding of the donation link area when creating or editing a project
  • [GH-394] Fixed the rounding radius of dropdowns when opening upwards

Minotaur fixes

Minotaur, our Gradle plugin, has also received a few fixes. This isn't going to be relevant to most people, but is relevant to some developers using this tool to deploy their mods.

  • Debug mode (enabled through debugMode = true) allows previewing the data to be uploaded before uploading
  • Fix edge case with ForgeGradle due to broken publishing metadata
  • Fix game version detection on Fabric Loom 0.11
  • Fix doLast and related methods not being usable because the task was registered in afterEvaluate

These fixes should have been automatically pulled in, assuming you're using Minotaur 2.+. If not, you should be upgrading to 2.0.2.

Need a guide to migrate from Minotaur v1 to v2? Check the migration guide on the redesign post.

`; diff --git a/packages/blog/compiled/knossos_v2_1_0.ts b/packages/blog/compiled/knossos_v2_1_0.ts index fcd733f91..27326c4b1 100644 --- a/packages/blog/compiled/knossos_v2_1_0.ts +++ b/packages/blog/compiled/knossos_v2_1_0.ts @@ -1,11 +1,11 @@ // AUTO-GENERATED FILE - DO NOT EDIT export const article = { - html: () => import(`./knossos_v2_1_0.content`).then((m) => m.html), - title: 'This week in Modrinth development: Filters and Fixes', - summary: - 'Continuing to improve the user interface after a great first week since Modrinth launched out of beta.', - date: '2022-03-09T00:00:00.000Z', - slug: 'knossos-v2.1.0', - authors: ['Dc7EYhxG'], - thumbnail: true, -} + html: () => import(`./knossos_v2_1_0.content`).then(m => m.html), + title: "This week in Modrinth development: Filters and Fixes", + summary: "Continuing to improve the user interface after a great first week since Modrinth launched out of beta.", + date: "2022-03-09T00:00:00.000Z", + slug: "knossos-v2.1.0", + authors: ["Dc7EYhxG"], + thumbnail: true, + +}; diff --git a/packages/blog/compiled/licensing_guide.content.ts b/packages/blog/compiled/licensing_guide.content.ts index 86fa58473..95096b320 100644 --- a/packages/blog/compiled/licensing_guide.content.ts +++ b/packages/blog/compiled/licensing_guide.content.ts @@ -1,2 +1,2 @@ // AUTO-GENERATED FILE - DO NOT EDIT -export const html = `

Why do you need to license your software? What are those licenses for anyway? These questions are more important than you think

What is a software license?

To summarise the Wikipedia article on the matter, it's essentially a legal contract between you (the mod developer) and anyone who uses, copies, modifies, etc the mod or any code having to do with it. License has the power to allow people to do whatever they want, or only permit the usage of the mod in-game. However, the majority of cases lie in-between these opposites.

So which software license should I choose?

First and foremost, the choice of the software license is not entirely up to you, because you have to have the legal ability to do so. For instance, not all licenses are compatible with Minecraft's EULA (End-User License Agreement). Besides, if you are not the only one working on the project, you must get permission from all other contributors to your code before changing or adding a license. Please, ensure you have done so before implementing a license.

Before we can decide which one to use, however, we must establish some additional definitions. Open software licenses can be split into three main categories: public domain, permissive, and copyleft.

Permissive license

A permissive license is a type of license that usually gives the abilities to use, copy, modify, distribute, sell, and relicense a piece of software.

The most popular license on Modrinth, the MIT License, is a permissive license. It is an easy-to-read license designed to be used for developers, which is why it is used extensively in the Minecraft open source community.

The Apache License 2.0 is also a very good permissive license to use. The main difference between it and the MIT License is that the Apache License gives an explicit patent grant, whereas patents must be registered manually with the MIT. There is also an additional clause with the Apache License, stating that any modified files must "carry prominent notices" of it being modified.

Copyleft license

A copyleft license gives to the other party specific rights usually only given to the copyright owner, under the condition that those same rights are applied to all variations of that software. These are also sometimes called "viral" or "infectious" licenses, because of the requirement to pass those rights on to derivatives.

The second most common license on Modrinth is a copyleft license: the GNU Lesser General Public License Version 3 (usually shortened to LGPL-3.0).

Typically, when a copyleft license is wanted, the GPL-3.0 or AGPL-3.0 would be used. However, these licenses are incompatible if linking into Minecraft, due to an issue with the difference between proprietary and free software outlined by these licenses (more information here). An exception can be added to allow linking, such as that found here, but it is recommended to just use the LGPL-3.0 instead if possible.

Public domain dedication

A public domain dedication gives all rights to everyone who gets a copy of the software. This includes but is not limited to the ability to use, copy, modify, distribute, sell, or relicense that software. Software with a public domain dedication has no copyright holder.

The third most common license used on Modrinth is the Creative Commons Zero 1.0 Universal, which is a public domain dedication with a strong international legal basis, while still retaining trademark and patent rights.

Creative Commons licenses as a whole are not recommended for software, but rather for other creative works: use this license with caution. If you wish to have the simplest public domain dedication possible, the Unlicense is also an option.

What if I don't want to choose a license?

Without a license software is considered proprietary and all rights reserved. This means that people may only use it in the ways the copyright owner specifies, which, in the Minecraft world (no pun intended), typically just means downloading and using it; no modifications, unauthorized distributions: basically nothing.

This is why picking a proper software license is so important. It tells everyone what they can and cannot do with your software, making the difference between software anyone can contribute to and change however they want, and software that only you have the code behind.

That being said, All Rights Reserved and not using a license are options, if you don't want to choose a public domain, permissive, or copyleft license. This can be useful in some cases, but as with any license, be aware of the effects: contributions will be difficult or impossible, and users may be inclined not to use your software. Also, in case of Minecraft, all mods, including the All Rights Reserved mods, are affected by Minecraft's EULA, which states:

Any Mods you create for the Game from scratch belong to you (including pre-run Mods and in-memory Mods) and you can do whatever you want with them, as long as you don't sell them for money / try to make money from them and so long as you don't distribute Modded Versions of the Game.

What this means is you are not allowed to sell your mods even if you reserve all rights to them. There are plenty more examples of such details in licenses and other legal agreements in the modding world. All in all, be aware that you cannot decide all of your and other's rights with your license.

Conclusion

To conclude, the importance of a software license cannot be overstated. You can choose whatever license you want (assuming you have the legal ability, of course), but be aware of the differences and consequences of choosing one over another. The licenses we've specified are what we recommend, as they are common and easy to understand. Hopefully, you will make your decision based on what you want to use and what your goals and purposes are.

A massive thank you goes to Alexander Ryckeboer (Progryck) for the cover image!

Disclaimers

We are not lawyers, and thus, this is not legal advice. No warranty is given regarding this information, and we (Modrinth) disclaim liability for damages resulting in using this information given on an "as-is" basis. For more information on the legal aspect to software licensing, please refer to "The Legal Side of Open Source".

No matter your choice of license, by uploading any Content (including but not limited to text, software, and graphics) to Modrinth, you give us certain rights to your Content, including but not limited to the ability to use, reproduce, or distribute. For more information, please see the Modrinth Terms of Use.

Measurements for "most popular license", "second most common license", and "third most common license", were taken 2021-04-30. Custom licenses were not taken into account.

` +export const html = `

Why do you need to license your software? What are those licenses for anyway? These questions are more important than you think

What is a software license?

To summarise the Wikipedia article on the matter, it's essentially a legal contract between you (the mod developer) and anyone who uses, copies, modifies, etc the mod or any code having to do with it. License has the power to allow people to do whatever they want, or only permit the usage of the mod in-game. However, the majority of cases lie in-between these opposites.

So which software license should I choose?

First and foremost, the choice of the software license is not entirely up to you, because you have to have the legal ability to do so. For instance, not all licenses are compatible with Minecraft's EULA (End-User License Agreement). Besides, if you are not the only one working on the project, you must get permission from all other contributors to your code before changing or adding a license. Please, ensure you have done so before implementing a license.

Before we can decide which one to use, however, we must establish some additional definitions. Open software licenses can be split into three main categories: public domain, permissive, and copyleft.

Permissive license

A permissive license is a type of license that usually gives the abilities to use, copy, modify, distribute, sell, and relicense a piece of software.

The most popular license on Modrinth, the MIT License, is a permissive license. It is an easy-to-read license designed to be used for developers, which is why it is used extensively in the Minecraft open source community.

The Apache License 2.0 is also a very good permissive license to use. The main difference between it and the MIT License is that the Apache License gives an explicit patent grant, whereas patents must be registered manually with the MIT. There is also an additional clause with the Apache License, stating that any modified files must "carry prominent notices" of it being modified.

Copyleft license

A copyleft license gives to the other party specific rights usually only given to the copyright owner, under the condition that those same rights are applied to all variations of that software. These are also sometimes called "viral" or "infectious" licenses, because of the requirement to pass those rights on to derivatives.

The second most common license on Modrinth is a copyleft license: the GNU Lesser General Public License Version 3 (usually shortened to LGPL-3.0).

Typically, when a copyleft license is wanted, the GPL-3.0 or AGPL-3.0 would be used. However, these licenses are incompatible if linking into Minecraft, due to an issue with the difference between proprietary and free software outlined by these licenses (more information here). An exception can be added to allow linking, such as that found here, but it is recommended to just use the LGPL-3.0 instead if possible.

Public domain dedication

A public domain dedication gives all rights to everyone who gets a copy of the software. This includes but is not limited to the ability to use, copy, modify, distribute, sell, or relicense that software. Software with a public domain dedication has no copyright holder.

The third most common license used on Modrinth is the Creative Commons Zero 1.0 Universal, which is a public domain dedication with a strong international legal basis, while still retaining trademark and patent rights.

Creative Commons licenses as a whole are not recommended for software, but rather for other creative works: use this license with caution. If you wish to have the simplest public domain dedication possible, the Unlicense is also an option.

What if I don't want to choose a license?

Without a license software is considered proprietary and all rights reserved. This means that people may only use it in the ways the copyright owner specifies, which, in the Minecraft world (no pun intended), typically just means downloading and using it; no modifications, unauthorized distributions: basically nothing.

This is why picking a proper software license is so important. It tells everyone what they can and cannot do with your software, making the difference between software anyone can contribute to and change however they want, and software that only you have the code behind.

That being said, All Rights Reserved and not using a license are options, if you don't want to choose a public domain, permissive, or copyleft license. This can be useful in some cases, but as with any license, be aware of the effects: contributions will be difficult or impossible, and users may be inclined not to use your software. Also, in case of Minecraft, all mods, including the All Rights Reserved mods, are affected by Minecraft's EULA, which states:

Any Mods you create for the Game from scratch belong to you (including pre-run Mods and in-memory Mods) and you can do whatever you want with them, as long as you don't sell them for money / try to make money from them and so long as you don't distribute Modded Versions of the Game.

What this means is you are not allowed to sell your mods even if you reserve all rights to them. There are plenty more examples of such details in licenses and other legal agreements in the modding world. All in all, be aware that you cannot decide all of your and other's rights with your license.

Conclusion

To conclude, the importance of a software license cannot be overstated. You can choose whatever license you want (assuming you have the legal ability, of course), but be aware of the differences and consequences of choosing one over another. The licenses we've specified are what we recommend, as they are common and easy to understand. Hopefully, you will make your decision based on what you want to use and what your goals and purposes are.

A massive thank you goes to Alexander Ryckeboer (Progryck) for the cover image!

Disclaimers

We are not lawyers, and thus, this is not legal advice. No warranty is given regarding this information, and we (Modrinth) disclaim liability for damages resulting in using this information given on an "as-is" basis. For more information on the legal aspect to software licensing, please refer to "The Legal Side of Open Source".

No matter your choice of license, by uploading any Content (including but not limited to text, software, and graphics) to Modrinth, you give us certain rights to your Content, including but not limited to the ability to use, reproduce, or distribute. For more information, please see the Modrinth Terms of Use.

Measurements for "most popular license", "second most common license", and "third most common license", were taken 2021-04-30. Custom licenses were not taken into account.

`; diff --git a/packages/blog/compiled/licensing_guide.ts b/packages/blog/compiled/licensing_guide.ts index 523278cbf..d23bdc35d 100644 --- a/packages/blog/compiled/licensing_guide.ts +++ b/packages/blog/compiled/licensing_guide.ts @@ -1,11 +1,11 @@ // AUTO-GENERATED FILE - DO NOT EDIT export const article = { - html: () => import(`./licensing_guide.content`).then((m) => m.html), - title: "Beginner's Guide to Licensing your Mods", - summary: - "Software licenses; the nitty-gritty legal aspect of software development. They're more important than you think.", - date: '2021-05-16T00:00:00.000Z', - slug: 'licensing-guide', - authors: ['6plzAzU4', 'aNd6VJql'], - thumbnail: true, -} + html: () => import(`./licensing_guide.content`).then(m => m.html), + title: "Beginner's Guide to Licensing your Mods", + summary: "Software licenses; the nitty-gritty legal aspect of software development. They're more important than you think.", + date: "2021-05-16T00:00:00.000Z", + slug: "licensing-guide", + authors: ["6plzAzU4","aNd6VJql"], + thumbnail: true, + +}; diff --git a/packages/blog/compiled/modpack_changes.content.ts b/packages/blog/compiled/modpack_changes.content.ts index 4d5da95de..4f6b8a4eb 100644 --- a/packages/blog/compiled/modpack_changes.content.ts +++ b/packages/blog/compiled/modpack_changes.content.ts @@ -1,2 +1,2 @@ // AUTO-GENERATED FILE - DO NOT EDIT -export const html = `

CurseForge CDN links requested to be removed by the end of the month

Modrinth's alpha launch of modpacks has been highly successful in the nearly two weeks it has been live, with over forty packs launched to the platform. However, a number of these packs include links to download mods from CurseForge's CDN, which has caught the attention of CurseForge. On May 24th, 2022, a representative from Overwolf sent email correspondence to us demanding us to remove all modpacks and documentation that contain references to CurseForge CDN links by the end of the month. The message was vague, and didn't specify whether or not they were making a legal threat against us or not, so we responded in attempt to clarify what would happen if we chose not to comply. In response, they told us that they would "consider next steps."

Modrinth has every intention of complying with their demands, despite our belief that this is a huge loss for the community. However, CurseForge's immediate "next steps" were to message launcher developers, requesting that they break support for Modrinth packs that contain CurseForge CDN links, and claiming to them that we outright refused to remove the packs containing the links from our platform ourselves when we did not refuse.

To be clear, Modrinth condemns the anti-competitive behaviors that CurseForge are engaging in, however, we do not wish for CurseForge or authors who have elected to opt-out of third party downloads from their platform to be our enemies. Modrinth is and will always remain a project in support of open source software, with open and free APIs for all to use, and encouraging of much needed competition and diversity in the mod hosting space.

Unfortunately, in order to comply with their request, all Modrinth modpacks must now use override JARs in place of any links to CurseForge's CDN. Specifically, CDN links to edge.forgecdn.net and media.forgecdn.net will no longer be part of the .mrpack specification, effective today. Of course, modpack authors must ensure that they are properly licensed to redistribute any mods that are not hosted on the Modrinth platform. While this is a huge blow to modpack creators and users of our platform for now, relying on CurseForge CDN links has always been unreliable as a long-term solution, because they could choose to change the links at any time, and it leaves variables outside of our control. In the long run, packs containing mostly mods hosted on Modrinth will be better for the growth of our platform and for the stability of modpacks.

In order to use mods exclusively hosted on CurseForge as override JARs, pack creators must ensure that either of the following conditions must be met:

  1. The mod is licensed under terms that allow for redistribution. The pack author is responsible for following the terms of the license.
  2. General or individual permission is granted from the mod author. This can be in the form of a message from the author or a statement made on a mod's project description granting permission to use it in modpacks.

In order to aid in this process, Modrinth will be building a third party mod license database and automated tools that will help pack creators with the hassle that will be ensuring all of the mods in their packs are properly licensed. In addition, packs will continue to be hand-reviewed by Modrinth moderation staff and verified. Do note that in this transition time, the review process for modpack projects may experience significant delays. Authors of existing modpacks on the platform will be reached out to in order to help them convert their existing packs to compliant packs.

For those wondering, our next steps as a company are:

  1. Mod license database for Modpack authors
  2. Creator monetization
  3. The Modrinth launcher for downloading and creating modpacks.
` +export const html = `

CurseForge CDN links requested to be removed by the end of the month

Modrinth's alpha launch of modpacks has been highly successful in the nearly two weeks it has been live, with over forty packs launched to the platform. However, a number of these packs include links to download mods from CurseForge's CDN, which has caught the attention of CurseForge. On May 24th, 2022, a representative from Overwolf sent email correspondence to us demanding us to remove all modpacks and documentation that contain references to CurseForge CDN links by the end of the month. The message was vague, and didn't specify whether or not they were making a legal threat against us or not, so we responded in attempt to clarify what would happen if we chose not to comply. In response, they told us that they would "consider next steps."

Modrinth has every intention of complying with their demands, despite our belief that this is a huge loss for the community. However, CurseForge's immediate "next steps" were to message launcher developers, requesting that they break support for Modrinth packs that contain CurseForge CDN links, and claiming to them that we outright refused to remove the packs containing the links from our platform ourselves when we did not refuse.

To be clear, Modrinth condemns the anti-competitive behaviors that CurseForge are engaging in, however, we do not wish for CurseForge or authors who have elected to opt-out of third party downloads from their platform to be our enemies. Modrinth is and will always remain a project in support of open source software, with open and free APIs for all to use, and encouraging of much needed competition and diversity in the mod hosting space.

Unfortunately, in order to comply with their request, all Modrinth modpacks must now use override JARs in place of any links to CurseForge's CDN. Specifically, CDN links to edge.forgecdn.net and media.forgecdn.net will no longer be part of the .mrpack specification, effective today. Of course, modpack authors must ensure that they are properly licensed to redistribute any mods that are not hosted on the Modrinth platform. While this is a huge blow to modpack creators and users of our platform for now, relying on CurseForge CDN links has always been unreliable as a long-term solution, because they could choose to change the links at any time, and it leaves variables outside of our control. In the long run, packs containing mostly mods hosted on Modrinth will be better for the growth of our platform and for the stability of modpacks.

In order to use mods exclusively hosted on CurseForge as override JARs, pack creators must ensure that either of the following conditions must be met:

  1. The mod is licensed under terms that allow for redistribution. The pack author is responsible for following the terms of the license.
  2. General or individual permission is granted from the mod author. This can be in the form of a message from the author or a statement made on a mod's project description granting permission to use it in modpacks.

In order to aid in this process, Modrinth will be building a third party mod license database and automated tools that will help pack creators with the hassle that will be ensuring all of the mods in their packs are properly licensed. In addition, packs will continue to be hand-reviewed by Modrinth moderation staff and verified. Do note that in this transition time, the review process for modpack projects may experience significant delays. Authors of existing modpacks on the platform will be reached out to in order to help them convert their existing packs to compliant packs.

For those wondering, our next steps as a company are:

  1. Mod license database for Modpack authors
  2. Creator monetization
  3. The Modrinth launcher for downloading and creating modpacks.
`; diff --git a/packages/blog/compiled/modpack_changes.ts b/packages/blog/compiled/modpack_changes.ts index e4650e45a..29a06063e 100644 --- a/packages/blog/compiled/modpack_changes.ts +++ b/packages/blog/compiled/modpack_changes.ts @@ -1,10 +1,11 @@ // AUTO-GENERATED FILE - DO NOT EDIT export const article = { - html: () => import(`./modpack_changes.content`).then((m) => m.html), - title: 'Changes to Modrinth Modpacks', - summary: 'CurseForge CDN links requested to be removed by the end of the month', - date: '2022-05-28T00:00:00.000Z', - slug: 'modpack-changes', - authors: ['MpxzqsyW', 'Dc7EYhxG'], - thumbnail: true, -} + html: () => import(`./modpack_changes.content`).then(m => m.html), + title: "Changes to Modrinth Modpacks", + summary: "CurseForge CDN links requested to be removed by the end of the month", + date: "2022-05-28T00:00:00.000Z", + slug: "modpack-changes", + authors: ["MpxzqsyW","Dc7EYhxG"], + thumbnail: true, + +}; diff --git a/packages/blog/compiled/modpacks_alpha.content.ts b/packages/blog/compiled/modpacks_alpha.content.ts index 1e2d14b3d..6481ca742 100644 --- a/packages/blog/compiled/modpacks_alpha.content.ts +++ b/packages/blog/compiled/modpacks_alpha.content.ts @@ -1,2 +1,2 @@ // AUTO-GENERATED FILE - DO NOT EDIT -export const html = `

After over a year of development, Modrinth is happy to announce that modpack support is now in alpha testing!

What does alpha mean, exactly? Principally, it means that modpack support is still unstable and that not everything is perfect yet. However, we believe it to be complete enough that it can be released for general use and testing.

From this point forward, Modrinth has shifted development effort from modpacks to creator payouts. This long-anticipated feature means that mod developers, modpack creators, and anyone else who uploads content to Modrinth will be eligible to get the ad revenue generated from their project pages.

Where can I find them?

Right next to mods on the site! URLs to modpacks are the same as mods, just with mod replaced with modpacks, so you can find the search at https://modrinth.com/modpacks.

Over a dozen modpacks have already been created by our early pack adopters, and those are available for download right now!

Wait, so how do I download them?

At this point in time, the only stable way to download modpacks and use them is through ATLauncher. You can also install Modrinth packs if you switch to the development branch of MultiMC. We're hoping to be supported by more launchers in the future, including our own launcher, which is still in development. Our documentation for playing modpacks will always have an up-to-date listing of the most popular ways to play packs.

How do I create packs?

You can either use ATLauncher or packwiz to create modpacks. The Modrinth format is unique for our purposes, which is specifically in order to allow mods from multiple platforms to be in a pack. Our documentation for creating modpacks will always have an up-to-date listing of the most popular ways to create packs.

Can I use CurseForge mods in my modpack?

Yes! The Modrinth format uses a link-based approach, meaning that theoretically, mods from any platform are usable. In practice, we are only allowing links from Modrinth, CurseForge, and GitHub. In the future, we may allow other sites.

What happened to Theseus?

For a while, we've been teasing Theseus, our own launcher. While lots of progress has been made on it, we haven't yet gotten it to a usable state even for alpha testing. Once we think it's usable, we will provide alpha builds -- however, for now, our main focus will be shifting to payouts, with Theseus development ramping up once that is out.

Remember: Modrinth only has a small team, and we have a lot of real-life responsibilities too. If you have experience in Rust or Svelte and would like to help out in developing it, please feel free to shoot a message in the #launcher channel in our Discord.

Conclusion

All in all, this update is quite exciting for everyone involved. Just like with the redesign, this is the culmination of months upon months of work, and modpack support is really a big stepping stone for what's still yet to come.

Remember: alpha means that it's still unstable! We are not expecting this release to go perfectly smoothly, but we still hope to provide the best modding experience possible. As always, the fastest and best way to get support is through our Discord.

Next stop: creator payouts!

` +export const html = `

After over a year of development, Modrinth is happy to announce that modpack support is now in alpha testing!

What does alpha mean, exactly? Principally, it means that modpack support is still unstable and that not everything is perfect yet. However, we believe it to be complete enough that it can be released for general use and testing.

From this point forward, Modrinth has shifted development effort from modpacks to creator payouts. This long-anticipated feature means that mod developers, modpack creators, and anyone else who uploads content to Modrinth will be eligible to get the ad revenue generated from their project pages.

Where can I find them?

Right next to mods on the site! URLs to modpacks are the same as mods, just with mod replaced with modpacks, so you can find the search at https://modrinth.com/modpacks.

Over a dozen modpacks have already been created by our early pack adopters, and those are available for download right now!

Wait, so how do I download them?

At this point in time, the only stable way to download modpacks and use them is through ATLauncher. You can also install Modrinth packs if you switch to the development branch of MultiMC. We're hoping to be supported by more launchers in the future, including our own launcher, which is still in development. Our documentation for playing modpacks will always have an up-to-date listing of the most popular ways to play packs.

How do I create packs?

You can either use ATLauncher or packwiz to create modpacks. The Modrinth format is unique for our purposes, which is specifically in order to allow mods from multiple platforms to be in a pack. Our documentation for creating modpacks will always have an up-to-date listing of the most popular ways to create packs.

Can I use CurseForge mods in my modpack?

Yes! The Modrinth format uses a link-based approach, meaning that theoretically, mods from any platform are usable. In practice, we are only allowing links from Modrinth, CurseForge, and GitHub. In the future, we may allow other sites.

What happened to Theseus?

For a while, we've been teasing Theseus, our own launcher. While lots of progress has been made on it, we haven't yet gotten it to a usable state even for alpha testing. Once we think it's usable, we will provide alpha builds -- however, for now, our main focus will be shifting to payouts, with Theseus development ramping up once that is out.

Remember: Modrinth only has a small team, and we have a lot of real-life responsibilities too. If you have experience in Rust or Svelte and would like to help out in developing it, please feel free to shoot a message in the #launcher channel in our Discord.

Conclusion

All in all, this update is quite exciting for everyone involved. Just like with the redesign, this is the culmination of months upon months of work, and modpack support is really a big stepping stone for what's still yet to come.

Remember: alpha means that it's still unstable! We are not expecting this release to go perfectly smoothly, but we still hope to provide the best modding experience possible. As always, the fastest and best way to get support is through our Discord.

Next stop: creator payouts!

`; diff --git a/packages/blog/compiled/modpacks_alpha.ts b/packages/blog/compiled/modpacks_alpha.ts index 8257ee077..69b2eeb4d 100644 --- a/packages/blog/compiled/modpacks_alpha.ts +++ b/packages/blog/compiled/modpacks_alpha.ts @@ -1,11 +1,11 @@ // AUTO-GENERATED FILE - DO NOT EDIT export const article = { - html: () => import(`./modpacks_alpha.content`).then((m) => m.html), - title: 'Modrinth Modpacks: Now in alpha testing', - summary: - "After over a year of development, we're happy to announce that modpack support is now in alpha testing.", - date: '2022-05-15T00:00:00.000Z', - slug: 'modpacks-alpha', - authors: ['6plzAzU4'], - thumbnail: true, -} + html: () => import(`./modpacks_alpha.content`).then(m => m.html), + title: "Modrinth Modpacks: Now in alpha testing", + summary: "After over a year of development, we're happy to announce that modpack support is now in alpha testing.", + date: "2022-05-15T00:00:00.000Z", + slug: "modpacks-alpha", + authors: ["6plzAzU4"], + thumbnail: true, + +}; diff --git a/packages/blog/compiled/modrinth_app_beta.content.ts b/packages/blog/compiled/modrinth_app_beta.content.ts index 04b491347..fa62fb99c 100644 --- a/packages/blog/compiled/modrinth_app_beta.content.ts +++ b/packages/blog/compiled/modrinth_app_beta.content.ts @@ -1,2 +1,2 @@ // AUTO-GENERATED FILE - DO NOT EDIT -export const html = `

The past few months have been a bit quiet on our part, but that doesn’t mean we haven’t been working on anything. In fact, this is quite possibly our biggest update yet, bringing the much-anticipated Modrinth App to general availability, alongside several other major features. Let’s get right into it!

Modrinth App Beta

Most of our time has been spent working on Modrinth App. This launcher integrates tightly with the website, bringing you the same bank of mods, modpacks, data packs, shaders, and resource packs already available for download on Modrinth.

Alongside that, there are a wealth of other features for you to find, including:

  • Full support for vanilla, Forge, Fabric, and Quilt
  • Full support for Windows, macOS, and Linux
  • Modrinth modpack importing, either through the website or through a .mrpack file
  • Modrinth modpack exporting to the .mrpack format to upload to the website or share with friends
  • Importing of instances from a variety of different launchers, including MultiMC, GDLauncher, ATLauncher, CurseForge, and Prism Launcher
  • The ability to update, add, and remove individual mods in a modpack
  • The ability to run different modded instances in parallel
  • The ability to view and share current and historical logs
  • An auto-updater to ensure the app is always up-to-date
  • An interactive tutorial to show you through the core features of the app
  • Performance through the roof, backed by Rust and Tauri (not Electron!)
  • Fully open-source under the GNU GPLv3 license

More features will, of course, be coming in the future. This is being considered a beta release. Nonetheless, we’re still very proud of what we’ve already created, and we’re pleased to say that it’s available for download on our website right now at https://modrinth.app. Check it out, play around with it, and have fun!

Authentication, scoped tokens, and security

The second major thing we’re releasing today is a wide range of changes to our authentication system. Security is a top concern at Modrinth, especially following recent events in the modded Minecraft community when several individuals were compromised due to a virus. While Modrinth was not affected directly by this attack, it provided a harrowing reminder of what we’re working with. That’s why we’re pleased to announce three major features today that will strengthen Modrinth’s security significantly: in-house authentication, two-factor authentication, and scoped personal access tokens.

In-house authentication and two-factor authentication

A screenshot of the new Modrinth sign-in page, showing options to sign in with Discord, GitHub, Microsoft, Google, Steam, GitLab, or with an email and password.

Until today, Modrinth has always used GitHub accounts exclusively for authentication. That changes now. Starting today, you can now connect your Discord, Microsoft, Google, Steam, and/or GitLab accounts to your Modrinth account. You may also forgo all six of those options and elect to use a good ol’ fashioned email and password. No problems with that! (If you’re curious, we store passwords hashed with the Argon2id method, meaning we couldn't read them even if we wanted to.)

` +export const html = `

The past few months have been a bit quiet on our part, but that doesn’t mean we haven’t been working on anything. In fact, this is quite possibly our biggest update yet, bringing the much-anticipated Modrinth App to general availability, alongside several other major features. Let’s get right into it!

Modrinth App Beta

Most of our time has been spent working on Modrinth App. This launcher integrates tightly with the website, bringing you the same bank of mods, modpacks, data packs, shaders, and resource packs already available for download on Modrinth.

Alongside that, there are a wealth of other features for you to find, including:

  • Full support for vanilla, Forge, Fabric, and Quilt
  • Full support for Windows, macOS, and Linux
  • Modrinth modpack importing, either through the website or through a .mrpack file
  • Modrinth modpack exporting to the .mrpack format to upload to the website or share with friends
  • Importing of instances from a variety of different launchers, including MultiMC, GDLauncher, ATLauncher, CurseForge, and Prism Launcher
  • The ability to update, add, and remove individual mods in a modpack
  • The ability to run different modded instances in parallel
  • The ability to view and share current and historical logs
  • An auto-updater to ensure the app is always up-to-date
  • An interactive tutorial to show you through the core features of the app
  • Performance through the roof, backed by Rust and Tauri (not Electron!)
  • Fully open-source under the GNU GPLv3 license

More features will, of course, be coming in the future. This is being considered a beta release. Nonetheless, we’re still very proud of what we’ve already created, and we’re pleased to say that it’s available for download on our website right now at https://modrinth.app. Check it out, play around with it, and have fun!

Authentication, scoped tokens, and security

The second major thing we’re releasing today is a wide range of changes to our authentication system. Security is a top concern at Modrinth, especially following recent events in the modded Minecraft community when several individuals were compromised due to a virus. While Modrinth was not affected directly by this attack, it provided a harrowing reminder of what we’re working with. That’s why we’re pleased to announce three major features today that will strengthen Modrinth’s security significantly: in-house authentication, two-factor authentication, and scoped personal access tokens.

In-house authentication and two-factor authentication

A screenshot of the new Modrinth sign-in page, showing options to sign in with Discord, GitHub, Microsoft, Google, Steam, GitLab, or with an email and password.

Until today, Modrinth has always used GitHub accounts exclusively for authentication. That changes now. Starting today, you can now connect your Discord, Microsoft, Google, Steam, and/or GitLab accounts to your Modrinth account. You may also forgo all six of those options and elect to use a good ol’ fashioned email and password. No problems with that! (If you’re curious, we store passwords hashed with the Argon2id method, meaning we couldn't read them even if we wanted to.)

`; diff --git a/packages/blog/compiled/modrinth_app_beta.ts b/packages/blog/compiled/modrinth_app_beta.ts index 40e6d2ea0..6ef15674d 100644 --- a/packages/blog/compiled/modrinth_app_beta.ts +++ b/packages/blog/compiled/modrinth_app_beta.ts @@ -1,13 +1,12 @@ // AUTO-GENERATED FILE - DO NOT EDIT export const article = { - html: () => import(`./modrinth_app_beta.content`).then((m) => m.html), - title: 'Introducing Modrinth App Beta', - summary: - 'Changing the modded Minecraft landscape with the new Modrinth App, alongside several other major features.', - date: '2023-08-05T20:00:00.000Z', - slug: 'modrinth-app-beta', - authors: ['6plzAzU4'], - thumbnail: false, - short_title: 'Modrinth App Beta and Upgraded Authentication', - short_summary: 'Launching Modrinth App Beta and upgrading authentication.', -} + html: () => import(`./modrinth_app_beta.content`).then(m => m.html), + title: "Introducing Modrinth App Beta", + summary: "Changing the modded Minecraft landscape with the new Modrinth App, alongside several other major features.", + date: "2023-08-05T20:00:00.000Z", + slug: "modrinth-app-beta", + authors: ["6plzAzU4"], + thumbnail: false, + short_title: "Modrinth App Beta and Upgraded Authentication", + short_summary: "Launching Modrinth App Beta and upgrading authentication.", +}; diff --git a/packages/blog/compiled/modrinth_beta.content.ts b/packages/blog/compiled/modrinth_beta.content.ts index 376758cfe..5ab631c5c 100644 --- a/packages/blog/compiled/modrinth_beta.content.ts +++ b/packages/blog/compiled/modrinth_beta.content.ts @@ -1,2 +1,2 @@ // AUTO-GENERATED FILE - DO NOT EDIT -export const html = `

After six months of work, Modrinth enters Beta, helping modders host their mods with ease!

Six months ago, in order to fill a void in the modding community, the project that would eventually become Modrinth was founded. Modrinth was created to bring change to an otherwise stagnant landscape of hosts. Today, Modrinth enters Beta, a huge step forward for Modrinth!

Modrinth's brand new design, rolling out with the launch of Beta

Modrinth's brand new design, rolling out with the launch of Beta

What's new?

If you've checked out Modrinth in the past, here's the main things you'll notice that have changed:

  • All new clean and modern design in both light and dark modes
  • Mods now display download counts correctly
  • Mod information can now be edited in the author Dashboard
  • More information can be added to mods

What's next?

Modrinth is still in beta, of course, so there will be bugs. In the coming weeks and months, we will be prioritizing fixing the issues that currently exist and continue refining the design in areas that are rough.

If you find any, please report them to the issue tracker: https://github.com/modrinth/code/issues

If you would like to chat about Modrinth, our discord is open to all here: https://discord.modrinth.com

` +export const html = `

After six months of work, Modrinth enters Beta, helping modders host their mods with ease!

Six months ago, in order to fill a void in the modding community, the project that would eventually become Modrinth was founded. Modrinth was created to bring change to an otherwise stagnant landscape of hosts. Today, Modrinth enters Beta, a huge step forward for Modrinth!

Modrinth's brand new design, rolling out with the launch of Beta

Modrinth's brand new design, rolling out with the launch of Beta

What's new?

If you've checked out Modrinth in the past, here's the main things you'll notice that have changed:

  • All new clean and modern design in both light and dark modes
  • Mods now display download counts correctly
  • Mod information can now be edited in the author Dashboard
  • More information can be added to mods

What's next?

Modrinth is still in beta, of course, so there will be bugs. In the coming weeks and months, we will be prioritizing fixing the issues that currently exist and continue refining the design in areas that are rough.

If you find any, please report them to the issue tracker: https://github.com/modrinth/code/issues

If you would like to chat about Modrinth, our discord is open to all here: https://discord.modrinth.com

`; diff --git a/packages/blog/compiled/modrinth_beta.ts b/packages/blog/compiled/modrinth_beta.ts index b32e920c6..47eae074d 100644 --- a/packages/blog/compiled/modrinth_beta.ts +++ b/packages/blog/compiled/modrinth_beta.ts @@ -1,11 +1,11 @@ // AUTO-GENERATED FILE - DO NOT EDIT export const article = { - html: () => import(`./modrinth_beta.content`).then((m) => m.html), - title: 'Welcome to Modrinth Beta', - summary: - 'After six months of work, Modrinth enters Beta, helping modders host their mods with ease!', - date: '2020-12-01T00:00:00.000Z', - slug: 'modrinth-beta', - authors: ['Dc7EYhxG'], - thumbnail: true, -} + html: () => import(`./modrinth_beta.content`).then(m => m.html), + title: "Welcome to Modrinth Beta", + summary: "After six months of work, Modrinth enters Beta, helping modders host their mods with ease!", + date: "2020-12-01T00:00:00.000Z", + slug: "modrinth-beta", + authors: ["Dc7EYhxG"], + thumbnail: true, + +}; diff --git a/packages/blog/compiled/modrinth_servers_beta.content.ts b/packages/blog/compiled/modrinth_servers_beta.content.ts index 277b7aac8..d9f420b90 100644 --- a/packages/blog/compiled/modrinth_servers_beta.content.ts +++ b/packages/blog/compiled/modrinth_servers_beta.content.ts @@ -1,2 +1,2 @@ // AUTO-GENERATED FILE - DO NOT EDIT -export const html = `

It's been almost four years since we publicly launched Modrinth Beta. Today, we're thrilled to unveil a new beta release of a product we've been eagerly developing: Modrinth Servers.

Modrinth Servers aims to provide the most seamless experience for running and playing on modded servers. To make this possible, we have partnered with our friends at the server hosting provider Pyro. Together, we've developed fully custom software that gives us a unique advantage in scaling, offering new features and integrations that other hosts couldn't dream of.

For this beta launch, all servers are US-only. Please be aware of this if you are looking to purchase a server, as it may not be optimal for users outside of North America.

A screenshot of the fully-custom Modrinth Servers panel integrated into Modrinth

What makes Modrinth Servers unique?

We understand that entering the server hosting industry might come as a surprise given the number of existing providers. Here's what sets Modrinth Servers apart:

The most modern hardware

Your modpack shouldn't have to run slow. All our servers are powered by cutting-edge 2023 Ryzen 7 and Ryzen 9 CPUs with DDR5 memory. From our research, we couldn't find any other Minecraft server host offering such modern hardware at any price point, much less at our affordably low one. This ensures smooth performance even with the most demanding modpacks.

Seamless integration with Modrinth content

Download mods and modpacks directly from Modrinth without any hassle. This deep integration simplifies server setup and management like never before. With just a few clicks, you can have your server up and running with your favorite mods.

Fully custom panel and backend

Unlike most other server hosts that rely on off-the-shelf software like Multicraft or Pterodactyl, Modrinth Servers is fully custom-built from front to back. This enables higher performance and much deeper integration than is otherwise possible. Our intuitive interface makes server management a breeze, even for newcomers.

Dedicated support

Our team is committed to providing exceptional support. Whether you're experiencing technical issues or have questions, we're here to ensure your experience with Modrinth Servers is top-notch.

No tricky fees or up-charges

Modrinth Servers are offered in a very simple Small, Medium, and Large pricing model, and are priced based on the amount of RAM at $3/GB. Custom URLs, port configuration, off-site backups, and plenty of storage is included in every Modrinth Server purchase at no additional cost.

What’s next?

As this is a beta release, there's much more to come for Modrinth Servers:

  • Global availability: We plan to expand to more worldwide regions and offer the ability to select a region for your server, ensuring optimal performance no matter where you are.
  • Support more types of content: We'll be adding support for plugin loaders and improving support for data packs, giving you more flexibility and functionality
  • Social features: A friends system to make sharing invites to servers easier, streamlining sharing custom-built modpacks and servers with your community.
  • App integration: Full integration with Modrinth App, including the ability to sync an instance with a server or friends, making collaboration seamless.
  • Collaborative management: Give other Modrinth users access to your server panel so you can manage your server with your team.
  • Automatic creator commissions: Creators will automatically earn a portion of server proceeds when content is installed on a Modrinth Server.

And so much more... stay tuned!

We can't wait for you to try out Modrinth Servers and share your feedback. This is just the beginning, and we're excited to continue improving and expanding our services to better serve the Minecraft community.

From the teams at Modrinth and Pyro, with <3

` +export const html = `

It's been almost four years since we publicly launched Modrinth Beta. Today, we're thrilled to unveil a new beta release of a product we've been eagerly developing: Modrinth Servers.

Modrinth Servers aims to provide the most seamless experience for running and playing on modded servers. To make this possible, we have partnered with our friends at the server hosting provider Pyro. Together, we've developed fully custom software that gives us a unique advantage in scaling, offering new features and integrations that other hosts couldn't dream of.

For this beta launch, all servers are US-only. Please be aware of this if you are looking to purchase a server, as it may not be optimal for users outside of North America.

A screenshot of the fully-custom Modrinth Servers panel integrated into Modrinth

What makes Modrinth Servers unique?

We understand that entering the server hosting industry might come as a surprise given the number of existing providers. Here's what sets Modrinth Servers apart:

The most modern hardware

Your modpack shouldn't have to run slow. All our servers are powered by cutting-edge 2023 Ryzen 7 and Ryzen 9 CPUs with DDR5 memory. From our research, we couldn't find any other Minecraft server host offering such modern hardware at any price point, much less at our affordably low one. This ensures smooth performance even with the most demanding modpacks.

Seamless integration with Modrinth content

Download mods and modpacks directly from Modrinth without any hassle. This deep integration simplifies server setup and management like never before. With just a few clicks, you can have your server up and running with your favorite mods.

Fully custom panel and backend

Unlike most other server hosts that rely on off-the-shelf software like Multicraft or Pterodactyl, Modrinth Servers is fully custom-built from front to back. This enables higher performance and much deeper integration than is otherwise possible. Our intuitive interface makes server management a breeze, even for newcomers.

Dedicated support

Our team is committed to providing exceptional support. Whether you're experiencing technical issues or have questions, we're here to ensure your experience with Modrinth Servers is top-notch.

No tricky fees or up-charges

Modrinth Servers are offered in a very simple Small, Medium, and Large pricing model, and are priced based on the amount of RAM at $3/GB. Custom URLs, port configuration, off-site backups, and plenty of storage is included in every Modrinth Server purchase at no additional cost.

What’s next?

As this is a beta release, there's much more to come for Modrinth Servers:

  • Global availability: We plan to expand to more worldwide regions and offer the ability to select a region for your server, ensuring optimal performance no matter where you are.
  • Support more types of content: We'll be adding support for plugin loaders and improving support for data packs, giving you more flexibility and functionality
  • Social features: A friends system to make sharing invites to servers easier, streamlining sharing custom-built modpacks and servers with your community.
  • App integration: Full integration with Modrinth App, including the ability to sync an instance with a server or friends, making collaboration seamless.
  • Collaborative management: Give other Modrinth users access to your server panel so you can manage your server with your team.
  • Automatic creator commissions: Creators will automatically earn a portion of server proceeds when content is installed on a Modrinth Server.

And so much more... stay tuned!

We can't wait for you to try out Modrinth Servers and share your feedback. This is just the beginning, and we're excited to continue improving and expanding our services to better serve the Minecraft community.

From the teams at Modrinth and Pyro, with <3

`; diff --git a/packages/blog/compiled/modrinth_servers_beta.ts b/packages/blog/compiled/modrinth_servers_beta.ts index 8a67b7ae7..f29cc1a5c 100644 --- a/packages/blog/compiled/modrinth_servers_beta.ts +++ b/packages/blog/compiled/modrinth_servers_beta.ts @@ -1,12 +1,12 @@ // AUTO-GENERATED FILE - DO NOT EDIT export const article = { - html: () => import(`./modrinth_servers_beta.content`).then((m) => m.html), - title: 'Host your own server with Modrinth Servers — now in beta', - summary: 'Fast, simple, reliable servers directly integrated into Modrinth.', - date: '2024-11-03T06:00:00.000Z', - slug: 'modrinth-servers-beta', - authors: ['MpxzqsyW', 'Dc7EYhxG'], - thumbnail: true, - short_title: 'Introducing Modrinth Servers', - short_summary: 'Host your next Minecraft server with Modrinth.', -} + html: () => import(`./modrinth_servers_beta.content`).then(m => m.html), + title: "Host your own server with Modrinth Servers — now in beta", + summary: "Fast, simple, reliable servers directly integrated into Modrinth.", + date: "2024-11-03T06:00:00.000Z", + slug: "modrinth-servers-beta", + authors: ["MpxzqsyW","Dc7EYhxG"], + thumbnail: true, + short_title: "Introducing Modrinth Servers", + short_summary: "Host your next Minecraft server with Modrinth.", +}; diff --git a/packages/blog/compiled/new_site_beta.content.ts b/packages/blog/compiled/new_site_beta.content.ts index 14f2cf4f1..a8c4aff5c 100644 --- a/packages/blog/compiled/new_site_beta.content.ts +++ b/packages/blog/compiled/new_site_beta.content.ts @@ -1,2 +1,2 @@ // AUTO-GENERATED FILE - DO NOT EDIT -export const html = `

Update 04/02: Due to a number of (ridiculous) complaints we received such as “not being able to use the site on mobile” and “the ads are a bit much”, we have decided to halt the rollout of the beta site. Happy April 1st, everyone.


OwO hewwo evewyone! I'm super exdited to announth that Modwinth is getting a bwand new update! WOOHOO! But, befowe I dwelve into the detaiws, I want to apologize in advance because my grammar and spwelling might not be the best (teehee). Anyway, this new update is going to be sow awesome and is going to make Modwinth the best modding website evew!

But first, a quick message to all of our mobile users: We don't cawe about you anymore! insert evil laughter here We've decided to focus all of our efforts on desktop users, so we won't be supporting mobile devices anymore. If you want to use Modwinth, you'll have to buy a desktop or laptop computer! (LOL)

And that's not aww, we've also added a bunch mowe ads! Because, wet's face it, who doesn't wove ads? Am I wight? (hehe) We've added ads that will pop up evewy five seconds, so you won't miss them. And to make suwe you don't get bowed of seeing the same ad over and over again, we've made suwe to wotate them frequently. You'we welcome! UwU

Oh, and did I mention the nyew wayout and design? We've made it weally cool! YAY! We wanted to make suwe that UwU aww feel a sense of nyostalgia and weminisce about the good owd days of the intewnet. Wemembew those days when websites wooked wike they wewe made by a 5-yeaw-owd? Well, we've bwought that back! (WINKY WINK)

The Fitneshgwam Pacew Test is a multistage aewobic capabiwity test that pwogwessively gets mowe difficult as it continyues. The 20 metew pacer test will begin in 30 seconds. Nyya~ Meowmeow! Win the pacer test you must weach the othew end befowe the beep. Each time you hear the beep meow, uwu wun nyya to the othew end nya. The wun nya must be in wine with the beep. Meowmeow! The eawwier nya you wun, the mowe time you have to westa nya. If you faiw to weach the othew end befowe the beep nya meow, the test will end. So twy youw best and Gud wuck!

In suwummawy, we'we weally excited about the nyew changes and we hope UwU awe too! Modwinth is no wonger a pwace for everyone, but wather, for deskto-p users onwy. We've also added mowe ads than evew befowe and made suwe to make the wayout and design as tewwible as possibwe!

Enjoy! UwU

` +export const html = `

Update 04/02: Due to a number of (ridiculous) complaints we received such as “not being able to use the site on mobile” and “the ads are a bit much”, we have decided to halt the rollout of the beta site. Happy April 1st, everyone.


OwO hewwo evewyone! I'm super exdited to announth that Modwinth is getting a bwand new update! WOOHOO! But, befowe I dwelve into the detaiws, I want to apologize in advance because my grammar and spwelling might not be the best (teehee). Anyway, this new update is going to be sow awesome and is going to make Modwinth the best modding website evew!

But first, a quick message to all of our mobile users: We don't cawe about you anymore! insert evil laughter here We've decided to focus all of our efforts on desktop users, so we won't be supporting mobile devices anymore. If you want to use Modwinth, you'll have to buy a desktop or laptop computer! (LOL)

And that's not aww, we've also added a bunch mowe ads! Because, wet's face it, who doesn't wove ads? Am I wight? (hehe) We've added ads that will pop up evewy five seconds, so you won't miss them. And to make suwe you don't get bowed of seeing the same ad over and over again, we've made suwe to wotate them frequently. You'we welcome! UwU

Oh, and did I mention the nyew wayout and design? We've made it weally cool! YAY! We wanted to make suwe that UwU aww feel a sense of nyostalgia and weminisce about the good owd days of the intewnet. Wemembew those days when websites wooked wike they wewe made by a 5-yeaw-owd? Well, we've bwought that back! (WINKY WINK)

The Fitneshgwam Pacew Test is a multistage aewobic capabiwity test that pwogwessively gets mowe difficult as it continyues. The 20 metew pacer test will begin in 30 seconds. Nyya~ Meowmeow! Win the pacer test you must weach the othew end befowe the beep. Each time you hear the beep meow, uwu wun nyya to the othew end nya. The wun nya must be in wine with the beep. Meowmeow! The eawwier nya you wun, the mowe time you have to westa nya. If you faiw to weach the othew end befowe the beep nya meow, the test will end. So twy youw best and Gud wuck!

In suwummawy, we'we weally excited about the nyew changes and we hope UwU awe too! Modwinth is no wonger a pwace for everyone, but wather, for deskto-p users onwy. We've also added mowe ads than evew befowe and made suwe to make the wayout and design as tewwible as possibwe!

Enjoy! UwU

`; diff --git a/packages/blog/compiled/new_site_beta.ts b/packages/blog/compiled/new_site_beta.ts index 729ded169..2f7eb3bd3 100644 --- a/packages/blog/compiled/new_site_beta.ts +++ b/packages/blog/compiled/new_site_beta.ts @@ -1,12 +1,12 @@ // AUTO-GENERATED FILE - DO NOT EDIT export const article = { - html: () => import(`./new_site_beta.content`).then((m) => m.html), - title: '(April Fools 2023) Powering up your experience: Modrinth Technologies™️ beta launch!', - summary: "Welcome to the new era of Modrinth. We can't wait to hear your feedback.", - date: '2023-04-01T08:00:00.000Z', - slug: 'new-site-beta', - authors: [], - thumbnail: true, - short_title: '(April Fools 2023) Modrinth Technologies™️ beta launch!', - short_summary: 'Power up your experience.', -} + html: () => import(`./new_site_beta.content`).then(m => m.html), + title: "(April Fools 2023) Powering up your experience: Modrinth Technologies™️ beta launch!", + summary: "Welcome to the new era of Modrinth. We can't wait to hear your feedback.", + date: "2023-04-01T08:00:00.000Z", + slug: "new-site-beta", + authors: [], + thumbnail: true, + short_title: "(April Fools 2023) Modrinth Technologies™️ beta launch!", + short_summary: "Power up your experience.", +}; diff --git a/packages/blog/compiled/plugins_resource_packs.content.ts b/packages/blog/compiled/plugins_resource_packs.content.ts index 71c9de554..ba24aaac8 100644 --- a/packages/blog/compiled/plugins_resource_packs.content.ts +++ b/packages/blog/compiled/plugins_resource_packs.content.ts @@ -1,2 +1,2 @@ // AUTO-GENERATED FILE - DO NOT EDIT -export const html = `

With the addition of modpacks, creating new project types has become a lot easier. Our first additions to our new system are plugins and resource packs. We'll also be working on adding datapacks, shader packs, and worlds after payouts are released.

Don't worry - this hasn't taken away an awful lot of development time from author payouts. Those are still being worked on!

Plugins

With plugins, we're supporting five loaders and three proxies: Bukkit, Spigot, Paper, Purpur, Sponge, BungeeCord, Waterfall, and Velocity.

Several new categories have specifically been added for plugins, though mod categories can be used for plugins and vice versa.

Go browse our plugin section!

Why add plugins?

This is a question we've received quite often since we first announced our intention to host plugins, so let's break it down a bit.

Currently, there are three main platforms on which plugins can be downloaded from: Bukkit, Spigot, and Sponge's Ore. Notice the main issue there? These sites are bound to a specific loader. This isn't inherently bad - however, as forks and new projects spawn, there is a noticeable lack of flexibility in what can be hosted on a given platform. For example, Spigot is unable to host plugins which specifically depend on the exclusive features provided by Paper's API. Paper's solution to this is to build their own platform, but this simply perpetuates the same problem.

The best solution here is to create a separate platform which is unbiased and flexible enough to adapt to a changing ecosystem. Modrinth is the perfect candidate for this - after all, plugins are mods under a different name, and likewise mods are plugins under a different name.

No matter the situation, authors are always allowed to upload their plugins to multiple sites. Build automation is incredibly easy to set up, especially with "set it and forget it" build tools such as Minotaur.

Will paid plugins be supported?

No. Modrinth does not have the infrastructure to support this, and it's not currently planned. Author payouts are still being worked on.

What about mods that have plugin versions and vice versa?

Modrinth is taking a unique approach to this. While the search pages are separate, in reality, the backend is the same. You can select plugin loaders when creating a mod and you can select mod loaders when creating a plugin. The split only exists on the frontend so that projects like Chunky can share a single page across their versions.

Plugins which also have versions for mod loaders will be displayed under the /mod/ URL on the frontend. Plugins without mod loader versions are displayed under /plugin/.

Resource packs

The other thing we've added support for is resource packs!

Previously we hinted at Bedrock resource packs being supported in addition to Java resource packs. We've decided not to add Bedrock resource packs until we also add support for other Bedrock resources for various technical reasons.

Go browse our resource pack section!

Secondary categories

Resource packs are capable of adding a wide range of different things, like fonts, sounds, and core shaders. We found that the current category system was inadequate to account for all of these, especially with the three maximum limit. Thus, we've introduced a "secondary category" system, for categories which don't display by default but can still be searched. These secondary categories have a limit of 255 instead of three. Please add as many secondary categories as are relevant!

On search pages, "Features" have been split into their own header. Where categories for resource packs can be accurately described as themes, features instead show what exactly a resource pack adds. Resolutions have also been split into their own header, though selecting a pack resolution is optional.

What about resource packs that require a mod to function?

Resource packs are able to set dependencies on other projects (even those which aren't resource packs), just like how modpacks are able to set dependencies on mods. It's worth noting that OptiFine is not on the platform, and thus you cannot set a dependency on that; however, you can set a dependency on any of the other alternative mods which are available on Modrinth, including Entity Texture Features, OptiGUI, Continuity, CIT Resewn, Animatica, or Custom Entity Models.

Other miscellaneous changes

Version number changes

For a long time, version numbers have had a requirement to be unique within the same project. Alongside this update, we found it necessary to remove this restriction on version numbers. Thus, you'll no longer have to use something like 1.2.3+forge and 1.2.3+fabric if you have a project on multiple loaders - instead, you can just use 1.2.3.

To accommodate this, the frontend now appends the loaders and game versions onto the end of a URL if there are duplicates, and the Modrinth Maven now supports version IDs.

We do not recommend retroactively changing version numbers to remove this additional metadata, though. If you change your version numbers, the following will break:

  • URLs to specific versions
  • Buildscripts depending on your project via the Modrinth Maven
  • Download counters (see labrinth issue #351)

LiteLoader support

Modrinth now supports LiteLoader for mods. It's nothing special, but it should help with some archival efforts.

Misc category deletion

We've also deleted the Misc category as no one is going to want to filter by Misc in search. If you have any other suggestions for categories, feel free to suggest them in our Discord or Tweet at us!

Developer/API changes

The changes in this update are rather minimal when it comes to API-related stuff. Two new fields have been added to the project struct - approved, which is the timestamp of when the project was approved (null if it's not approved or unlisted), and additional_categories, another set of categories which are to be seen as less important than normal categories. You can read the secondary categories section for more info on it. If you wish to implement the headers in your API integration, the category list now has a header field.

As for the search result struct, created now matches the approved date rather than the published project field, and categories now also includes secondary categories. A new field, display_categories, matches only primary categories.

Differences between mod loaders and plugins will need to be hardcoded within your API integration for the time being if you wish to have them shown separately. This will be cleaned up in API v3 alongside a general cleanup of a lot of other small aspects of the API. If you have any suggestions for breaking API v3 changes, feel free to suggest them in our Discord. Development on API v3 is likely to begin before the end of the year.

Conclusion

We're very happy to be announcing this feature, even if it is minor in comparison to some of our other past and future announcements. Don't worry - author payouts are still being worked on, and will most likely be our next major announcement! We saw this as an opportunity to get a feature out with relatively little new code (since we'd already done everything needed alongside modpacks), so we ran with it.

As always, feel free to provide feedback on our Discord, and please report any bugs you come across on our GitHub.

` +export const html = `

With the addition of modpacks, creating new project types has become a lot easier. Our first additions to our new system are plugins and resource packs. We'll also be working on adding datapacks, shader packs, and worlds after payouts are released.

Don't worry - this hasn't taken away an awful lot of development time from author payouts. Those are still being worked on!

Plugins

With plugins, we're supporting five loaders and three proxies: Bukkit, Spigot, Paper, Purpur, Sponge, BungeeCord, Waterfall, and Velocity.

Several new categories have specifically been added for plugins, though mod categories can be used for plugins and vice versa.

Go browse our plugin section!

Why add plugins?

This is a question we've received quite often since we first announced our intention to host plugins, so let's break it down a bit.

Currently, there are three main platforms on which plugins can be downloaded from: Bukkit, Spigot, and Sponge's Ore. Notice the main issue there? These sites are bound to a specific loader. This isn't inherently bad - however, as forks and new projects spawn, there is a noticeable lack of flexibility in what can be hosted on a given platform. For example, Spigot is unable to host plugins which specifically depend on the exclusive features provided by Paper's API. Paper's solution to this is to build their own platform, but this simply perpetuates the same problem.

The best solution here is to create a separate platform which is unbiased and flexible enough to adapt to a changing ecosystem. Modrinth is the perfect candidate for this - after all, plugins are mods under a different name, and likewise mods are plugins under a different name.

No matter the situation, authors are always allowed to upload their plugins to multiple sites. Build automation is incredibly easy to set up, especially with "set it and forget it" build tools such as Minotaur.

Will paid plugins be supported?

No. Modrinth does not have the infrastructure to support this, and it's not currently planned. Author payouts are still being worked on.

What about mods that have plugin versions and vice versa?

Modrinth is taking a unique approach to this. While the search pages are separate, in reality, the backend is the same. You can select plugin loaders when creating a mod and you can select mod loaders when creating a plugin. The split only exists on the frontend so that projects like Chunky can share a single page across their versions.

Plugins which also have versions for mod loaders will be displayed under the /mod/ URL on the frontend. Plugins without mod loader versions are displayed under /plugin/.

Resource packs

The other thing we've added support for is resource packs!

Previously we hinted at Bedrock resource packs being supported in addition to Java resource packs. We've decided not to add Bedrock resource packs until we also add support for other Bedrock resources for various technical reasons.

Go browse our resource pack section!

Secondary categories

Resource packs are capable of adding a wide range of different things, like fonts, sounds, and core shaders. We found that the current category system was inadequate to account for all of these, especially with the three maximum limit. Thus, we've introduced a "secondary category" system, for categories which don't display by default but can still be searched. These secondary categories have a limit of 255 instead of three. Please add as many secondary categories as are relevant!

On search pages, "Features" have been split into their own header. Where categories for resource packs can be accurately described as themes, features instead show what exactly a resource pack adds. Resolutions have also been split into their own header, though selecting a pack resolution is optional.

What about resource packs that require a mod to function?

Resource packs are able to set dependencies on other projects (even those which aren't resource packs), just like how modpacks are able to set dependencies on mods. It's worth noting that OptiFine is not on the platform, and thus you cannot set a dependency on that; however, you can set a dependency on any of the other alternative mods which are available on Modrinth, including Entity Texture Features, OptiGUI, Continuity, CIT Resewn, Animatica, or Custom Entity Models.

Other miscellaneous changes

Version number changes

For a long time, version numbers have had a requirement to be unique within the same project. Alongside this update, we found it necessary to remove this restriction on version numbers. Thus, you'll no longer have to use something like 1.2.3+forge and 1.2.3+fabric if you have a project on multiple loaders - instead, you can just use 1.2.3.

To accommodate this, the frontend now appends the loaders and game versions onto the end of a URL if there are duplicates, and the Modrinth Maven now supports version IDs.

We do not recommend retroactively changing version numbers to remove this additional metadata, though. If you change your version numbers, the following will break:

  • URLs to specific versions
  • Buildscripts depending on your project via the Modrinth Maven
  • Download counters (see labrinth issue #351)

LiteLoader support

Modrinth now supports LiteLoader for mods. It's nothing special, but it should help with some archival efforts.

Misc category deletion

We've also deleted the Misc category as no one is going to want to filter by Misc in search. If you have any other suggestions for categories, feel free to suggest them in our Discord or Tweet at us!

Developer/API changes

The changes in this update are rather minimal when it comes to API-related stuff. Two new fields have been added to the project struct - approved, which is the timestamp of when the project was approved (null if it's not approved or unlisted), and additional_categories, another set of categories which are to be seen as less important than normal categories. You can read the secondary categories section for more info on it. If you wish to implement the headers in your API integration, the category list now has a header field.

As for the search result struct, created now matches the approved date rather than the published project field, and categories now also includes secondary categories. A new field, display_categories, matches only primary categories.

Differences between mod loaders and plugins will need to be hardcoded within your API integration for the time being if you wish to have them shown separately. This will be cleaned up in API v3 alongside a general cleanup of a lot of other small aspects of the API. If you have any suggestions for breaking API v3 changes, feel free to suggest them in our Discord. Development on API v3 is likely to begin before the end of the year.

Conclusion

We're very happy to be announcing this feature, even if it is minor in comparison to some of our other past and future announcements. Don't worry - author payouts are still being worked on, and will most likely be our next major announcement! We saw this as an opportunity to get a feature out with relatively little new code (since we'd already done everything needed alongside modpacks), so we ran with it.

As always, feel free to provide feedback on our Discord, and please report any bugs you come across on our GitHub.

`; diff --git a/packages/blog/compiled/plugins_resource_packs.ts b/packages/blog/compiled/plugins_resource_packs.ts index 5e052ba27..5fd6034c8 100644 --- a/packages/blog/compiled/plugins_resource_packs.ts +++ b/packages/blog/compiled/plugins_resource_packs.ts @@ -1,11 +1,11 @@ // AUTO-GENERATED FILE - DO NOT EDIT export const article = { - html: () => import(`./plugins_resource_packs.content`).then((m) => m.html), - title: 'Plugins and Resource Packs now have a home on Modrinth', - summary: - 'A small update with a big impact: plugins and resource packs are now available on Modrinth!', - date: '2022-08-27T00:00:00.000Z', - slug: 'plugins-resource-packs', - authors: ['6plzAzU4'], - thumbnail: true, -} + html: () => import(`./plugins_resource_packs.content`).then(m => m.html), + title: "Plugins and Resource Packs now have a home on Modrinth", + summary: "A small update with a big impact: plugins and resource packs are now available on Modrinth!", + date: "2022-08-27T00:00:00.000Z", + slug: "plugins-resource-packs", + authors: ["6plzAzU4"], + thumbnail: true, + +}; diff --git a/packages/blog/compiled/pride_campaign_2025.content.ts b/packages/blog/compiled/pride_campaign_2025.content.ts index 67fbc1514..8083e8405 100644 --- a/packages/blog/compiled/pride_campaign_2025.content.ts +++ b/packages/blog/compiled/pride_campaign_2025.content.ts @@ -1,2 +1,2 @@ // AUTO-GENERATED FILE - DO NOT EDIT -export const html = `

What an incredible Pride Month! This June, we came together to support The Trevor Project, an essential organization providing crisis support and life-saving resources for LGBTQ+ young people. We are absolutely thrilled to announce that our community raised a stellar $2,395. That's not all, though — during the campaign, some donations were matched by H&M and the Trevor Project's Board of Directors up to six times, meaning the final impact of Modrinth's donations is a whopping $8,464. Our team was also in the top ten for most funds raised this year!

To put your generosity into perspective, a donation this size can fund hundreds of hours on The Trevor Project's 24/7 crisis hotline. It gives young people a lifeline in their hardest moments and supports important educational services for many others.

We couldn't have done it without you. To every person who donated, shared the post, or simply cheered us on from the sidelines — thank you. We are incredibly proud of what we've achieved together as a community.

While Pride Month provides a special opportunity to focus our efforts, the need for these critical resources continues all year long. The challenges faced by LGBTQ+ young people do not end on July 1st, and organizations like The Trevor Project require ongoing support to continue their life-saving work. If you are able, we encourage you to consider making a contribution at any time.

As part of this campaign, we also added the option to donate part of a Modrinth rewards balance to a variety of charities. This means Modrinth creators can directly use the revenue they earned from ads and Modrinth+ to donate to dozens of causes close to their heart. The Trevor Project is one option, alongside other prominent non-profits such as the American Cancer Society, St. Jude's Children's Research Hospital, Doctors Without Borders, and the Southern Poverty Law Center. You can donate your Modrinth balance to these groups and many more by clicking the "Withdraw" button on your revenue dashboard.

Modrinth's June 2025 campaign will be kept for posterity at this link.

You can donate to The Trevor Project at any time at this link.

` +export const html = `

What an incredible Pride Month! This June, we came together to support The Trevor Project, an essential organization providing crisis support and life-saving resources for LGBTQ+ young people. We are absolutely thrilled to announce that our community raised a stellar $2,395. That's not all, though — during the campaign, some donations were matched by H&M and the Trevor Project's Board of Directors up to six times, meaning the final impact of Modrinth's donations is a whopping $8,464. Our team was also in the top ten for most funds raised this year!

To put your generosity into perspective, a donation this size can fund hundreds of hours on The Trevor Project's 24/7 crisis hotline. It gives young people a lifeline in their hardest moments and supports important educational services for many others.

We couldn't have done it without you. To every person who donated, shared the post, or simply cheered us on from the sidelines — thank you. We are incredibly proud of what we've achieved together as a community.

While Pride Month provides a special opportunity to focus our efforts, the need for these critical resources continues all year long. The challenges faced by LGBTQ+ young people do not end on July 1st, and organizations like The Trevor Project require ongoing support to continue their life-saving work. If you are able, we encourage you to consider making a contribution at any time.

As part of this campaign, we also added the option to donate part of a Modrinth rewards balance to a variety of charities. This means Modrinth creators can directly use the revenue they earned from ads and Modrinth+ to donate to dozens of causes close to their heart. The Trevor Project is one option, alongside other prominent non-profits such as the American Cancer Society, St. Jude's Children's Research Hospital, Doctors Without Borders, and the Southern Poverty Law Center. You can donate your Modrinth balance to these groups and many more by clicking the "Withdraw" button on your revenue dashboard.

Modrinth's June 2025 campaign will be kept for posterity at this link.

You can donate to The Trevor Project at any time at this link.

`; diff --git a/packages/blog/compiled/pride_campaign_2025.ts b/packages/blog/compiled/pride_campaign_2025.ts index 7282b5816..0b76f7891 100644 --- a/packages/blog/compiled/pride_campaign_2025.ts +++ b/packages/blog/compiled/pride_campaign_2025.ts @@ -1,12 +1,12 @@ // AUTO-GENERATED FILE - DO NOT EDIT export const article = { - html: () => import(`./pride_campaign_2025.content`).then((m) => m.html), - title: 'A Pride Month Success: Over $8,400 Raised for The Trevor Project!', - summary: 'Reflecting on our Pride Month fundraiser campaign for LGBTQ+ youth.', - date: '2025-07-01T18:00:00.000Z', - slug: 'pride-campaign-2025', - authors: ['6plzAzU4', 'bOHH0P9Z', '2cqK8Q5p', 'vNcGR3Fd'], - thumbnail: true, - short_title: 'Pride Month Fundraiser 2025', - short_summary: 'A reflection on our Pride Month fundraiser campaign.', -} + html: () => import(`./pride_campaign_2025.content`).then(m => m.html), + title: "A Pride Month Success: Over $8,400 Raised for The Trevor Project!", + summary: "Reflecting on our Pride Month fundraiser campaign for LGBTQ+ youth.", + date: "2025-07-01T18:00:00.000Z", + slug: "pride-campaign-2025", + authors: ["6plzAzU4","bOHH0P9Z","2cqK8Q5p","vNcGR3Fd"], + thumbnail: true, + short_title: "Pride Month Fundraiser 2025", + short_summary: "A reflection on our Pride Month fundraiser campaign.", +}; diff --git a/packages/blog/compiled/redesign.content.ts b/packages/blog/compiled/redesign.content.ts index dc57e1d5c..027264ed9 100644 --- a/packages/blog/compiled/redesign.content.ts +++ b/packages/blog/compiled/redesign.content.ts @@ -27,4 +27,4 @@ export const html = `

After months of relatively quiet development, Modrinth h new ModDependency('P7dR8mSH', 'required') // Creates a new required dependency on Fabric API ] } -

Notice how it's now in a modrinth {...} block instead of creating a new task. The modrinth task is automatically created.

The loaders declaration in the new version isn't even needed if you're using Fabric Loom or ForgeGradle. The project version can be detected automatically, and the token uses the MODRINTH_TOKEN environment variable by default now. The game version and loader listings actually make sense now, and dependencies are possible!

More miscellanea

Along with the major headlining features, there are also a number of smaller features, fixes, and improvements coming with the big update. Most of these need no more than a bullet to describe, so here's a bullet list of the smaller things!

  • If you are the owner of a project, you can now transfer the ownership to another user, as long as they have already accepted an invitation to be a member. In the frontend, this can be done on the Settings page, under the "Team members" section.
  • iframes for YouTube videos are now allowed. Any iframes from elsewhere are still not allowed.
  • Files are now validated to ensure they contain a valid Forge or Fabric mod, or are in the correct modpack format.
  • When changing the status of a project, file moderators are now able to add a message (heading and body separate) to be seen by project team members.
  • Versions must now always have a file attached.
  • Projects will only be able to have draft status if they contain no versions. Additionally, a new archived status has been added.
  • Donation URLs have been re-enabled.
  • Fix: Markdown checkboxes will no longer render strangely (knossos#291)
  • Fix: Maven will no longer randomly break (labrinth#264 and labrinth#252)
  • ...and many other smaller things!

What happened to modpacks?

We've been teasing modpacks for a long time now. While they're done for the most part, we've decided to hold back on their release for the time being. We're working hard to get those done some time soon, and there'll be another post when those are ready for general consumption.

Conclusion and a call for developers

In conclusion, we hope that you're excited about this update as much as we are. We believe that, with how much work has been put into this update, it has definitely been worth the wait.

On a separate note, are you looking to contribute to Modrinth? Have you got experience with Rust or Svelte? We're hiring! Please reach out to Geometrically#8387 on Discord to apply for a position.

Thank you for reading, and may your dreams be filled with pineapples, tiny potatoes, and squirrels.

` +

Notice how it's now in a modrinth {...} block instead of creating a new task. The modrinth task is automatically created.

The loaders declaration in the new version isn't even needed if you're using Fabric Loom or ForgeGradle. The project version can be detected automatically, and the token uses the MODRINTH_TOKEN environment variable by default now. The game version and loader listings actually make sense now, and dependencies are possible!

More miscellanea

Along with the major headlining features, there are also a number of smaller features, fixes, and improvements coming with the big update. Most of these need no more than a bullet to describe, so here's a bullet list of the smaller things!

  • If you are the owner of a project, you can now transfer the ownership to another user, as long as they have already accepted an invitation to be a member. In the frontend, this can be done on the Settings page, under the "Team members" section.
  • iframes for YouTube videos are now allowed. Any iframes from elsewhere are still not allowed.
  • Files are now validated to ensure they contain a valid Forge or Fabric mod, or are in the correct modpack format.
  • When changing the status of a project, file moderators are now able to add a message (heading and body separate) to be seen by project team members.
  • Versions must now always have a file attached.
  • Projects will only be able to have draft status if they contain no versions. Additionally, a new archived status has been added.
  • Donation URLs have been re-enabled.
  • Fix: Markdown checkboxes will no longer render strangely (knossos#291)
  • Fix: Maven will no longer randomly break (labrinth#264 and labrinth#252)
  • ...and many other smaller things!

What happened to modpacks?

We've been teasing modpacks for a long time now. While they're done for the most part, we've decided to hold back on their release for the time being. We're working hard to get those done some time soon, and there'll be another post when those are ready for general consumption.

Conclusion and a call for developers

In conclusion, we hope that you're excited about this update as much as we are. We believe that, with how much work has been put into this update, it has definitely been worth the wait.

On a separate note, are you looking to contribute to Modrinth? Have you got experience with Rust or Svelte? We're hiring! Please reach out to Geometrically#8387 on Discord to apply for a position.

Thank you for reading, and may your dreams be filled with pineapples, tiny potatoes, and squirrels.

`; diff --git a/packages/blog/compiled/redesign.ts b/packages/blog/compiled/redesign.ts index aa5f9629b..d395e2fa7 100644 --- a/packages/blog/compiled/redesign.ts +++ b/packages/blog/compiled/redesign.ts @@ -1,10 +1,11 @@ // AUTO-GENERATED FILE - DO NOT EDIT export const article = { - html: () => import(`./redesign.content`).then((m) => m.html), - title: 'Now showing on Modrinth: A new look!', - summary: 'Releasing many new features and improvements, including a redesign!', - date: '2022-02-27T00:00:00.000Z', - slug: 'redesign', - authors: ['6plzAzU4'], - thumbnail: true, -} + html: () => import(`./redesign.content`).then(m => m.html), + title: "Now showing on Modrinth: A new look!", + summary: "Releasing many new features and improvements, including a redesign!", + date: "2022-02-27T00:00:00.000Z", + slug: "redesign", + authors: ["6plzAzU4"], + thumbnail: true, + +}; diff --git a/packages/blog/compiled/skins_now_in_modrinth_app.content.ts b/packages/blog/compiled/skins_now_in_modrinth_app.content.ts index 557550755..98767d588 100644 --- a/packages/blog/compiled/skins_now_in_modrinth_app.content.ts +++ b/packages/blog/compiled/skins_now_in_modrinth_app.content.ts @@ -1,2 +1,2 @@ // AUTO-GENERATED FILE - DO NOT EDIT -export const html = `

We're thrilled to roll out Modrinth App v0.10 with a beta release of one of our most highly requested features, the Skins page. The Skins page allows you to manage all of your Minecraft skins directly within Modrinth App. You can see all your saved custom skins and the default Minecraft skins in one convenient place.

The new skins page, featuring a cute animated player model, your custom skins & default skins.

Adding a new skin is simple, even Herobrine could do it! When you add or edit a skin, you can upload your custom texture file directly from your computer, choose between the wide or slim arm style to match your preferred character model, and even assign a specific cape to that look for the perfect finishing touch.

The interface makes it easy to preview your changes in real-time with the animated player model, so you can see exactly how your skin will look in-game before saving it.

The edit skin modal that shows when you go to add or edit a skin.

Fixes and More!

Alongside this major new feature, v0.10 includes a host of improvements and bug fixes to make your experience smoother. We've updated the news feed to use our new system, fixed issues with project descriptions, and tidied up how data is handled. For a full breakdown of all the changes, you can check out the complete changelog here.

As the skins feature is in beta, we're eager to hear your feedback! Jump in, give it a try, and let us know what you think. You can share your thoughts on our Discord server or start a support chat if you're running into issues.

Thank you! We can't wait to see your skins in action. Happy customizing!

` +export const html = `

We're thrilled to roll out Modrinth App v0.10 with a beta release of one of our most highly requested features, the Skins page. The Skins page allows you to manage all of your Minecraft skins directly within Modrinth App. You can see all your saved custom skins and the default Minecraft skins in one convenient place.

The new skins page, featuring a cute animated player model, your custom skins & default skins.

Adding a new skin is simple, even Herobrine could do it! When you add or edit a skin, you can upload your custom texture file directly from your computer, choose between the wide or slim arm style to match your preferred character model, and even assign a specific cape to that look for the perfect finishing touch.

The interface makes it easy to preview your changes in real-time with the animated player model, so you can see exactly how your skin will look in-game before saving it.

The edit skin modal that shows when you go to add or edit a skin.

Fixes and More!

Alongside this major new feature, v0.10 includes a host of improvements and bug fixes to make your experience smoother. We've updated the news feed to use our new system, fixed issues with project descriptions, and tidied up how data is handled. For a full breakdown of all the changes, you can check out the complete changelog here.

As the skins feature is in beta, we're eager to hear your feedback! Jump in, give it a try, and let us know what you think. You can share your thoughts on our Discord server or start a support chat if you're running into issues.

Thank you! We can't wait to see your skins in action. Happy customizing!

`; diff --git a/packages/blog/compiled/skins_now_in_modrinth_app.ts b/packages/blog/compiled/skins_now_in_modrinth_app.ts index 9ccd17a67..e5f0ac811 100644 --- a/packages/blog/compiled/skins_now_in_modrinth_app.ts +++ b/packages/blog/compiled/skins_now_in_modrinth_app.ts @@ -1,11 +1,11 @@ // AUTO-GENERATED FILE - DO NOT EDIT export const article = { - html: () => import(`./skins_now_in_modrinth_app.content`).then((m) => m.html), - title: 'Skins — Now in Modrinth App!', - summary: - 'Customize your look, save your favorite skins, and swap them out in a flash, all within Modrinth App.', - date: '2025-07-06T23:45:00.000Z', - slug: 'skins-now-in-modrinth-app', - authors: ['bOHH0P9Z', 'Dc7EYhxG'], - thumbnail: true, -} + html: () => import(`./skins_now_in_modrinth_app.content`).then(m => m.html), + title: "Skins — Now in Modrinth App!", + summary: "Customize your look, save your favorite skins, and swap them out in a flash, all within Modrinth App.", + date: "2025-07-06T23:45:00.000Z", + slug: "skins-now-in-modrinth-app", + authors: ["bOHH0P9Z","Dc7EYhxG"], + thumbnail: true, + +}; diff --git a/packages/blog/compiled/two_years_of_modrinth.content.ts b/packages/blog/compiled/two_years_of_modrinth.content.ts index 45e4ee2ed..206c68a12 100644 --- a/packages/blog/compiled/two_years_of_modrinth.content.ts +++ b/packages/blog/compiled/two_years_of_modrinth.content.ts @@ -1,2 +1,2 @@ // AUTO-GENERATED FILE - DO NOT EDIT -export const html = `

Modrinth initially went into beta on November 30th, 2020. Just over a month ago was November 30th, 2022, marking two years since Modrinth was generally available as a platform for everyone to use. Today, we're proud to announce the Anniversary Update, celebrating both two years of Modrinth as well as the coming of the new year, and we'll be discussing our New Year's Resolutions for 2023.

Before you read this post, though, we recommend taking a look at our retrospective on Modrinth's history through 2020—2022. It just wouldn't be right to take a look at the present and the future without also taking a look at our past, seeing how far we've come from our humble beginnings.

With that out of the way, this post primarily serves to announce a few of the smaller features we've been working on after the release of creator monetization. We've bundled these all together as the Anniversary Update.

Looking just at what's already done is boring, though, so we'll also be looking at what's yet to come. Modrinth's future is even brighter than any of us can imagine, so we'll be focusing on what we're gonna do in order to get to that bright future. If you've ever made New Year's Resolutions, we're going to briefly discuss our resolutions for 2023.

Without further adieu, let's get right into what's new with this new year!

Shader packs and data packs

The long-awaited arrival of shader packs and data packs is now here on Modrinth!

Shader packs can be viewed in the shaders tab. This includes shaders that support Iris, Canvas, and OptiFine, as well as vanilla core shaders. (Even though they're installed via the resource pack system, we have decided to put Canvas and core shaders in shader packs since most users will not search in resource packs for shader packs, even if that's how they're installed.)

Data packs can be found in the data packs tab. These are implemented similarly to plugins, in that projects with a mod version can also upload a data pack version (and vice versa). Additionally, data pack authors can choose to have their data packs packaged as a mod using the handy-dandy button on the site.

Data packs can optionally upload a corresponding resource pack as a separate file. We discourage bundling data files and asset files in the same zip file.

New landing page

The homepage has been completely remade, featuring a scrolling list of random projects from Modrinth. Feel free to use this to discover new projects—just make sure you refresh occasionally, because they loop after a little while until you refresh!

A screenshot of the new homepage, with a maze background and projects scrolling across the bottom. Bold across the front is "The place for Minecraft mods".

Project overhaul for creators

We're continuing to bring expansions to the creator dashboard introduced with monetization. The new Projects tab allows you to view all of your projects in a table and quickly access their information and settings.

The new Modrinth project dashboard

The same page also introduces the ability to bulk-edit the external resource links without having to edit each page individually. For example, if your Discord invite expires, you used to have to edit each of your projects individually to add it back. Now you can just select the projects you want to edit the links for and edit them all at the same time!

A modal with several input fields for external resource links, listing multiple projects the input changes will be applied to.

Even better are the changes to the settings page for individual projects. Previously, the project settings page was disorganized and cluttered. The project settings page has been completely redone, inspired by GitHub's repository settings page.

The new project settings page, shown for Sodium.

Draft projects also now have a publishing checklist, making it more clear to authors as to what their next steps should look like. Red asterisks are items that must be completed before submitting and purple light bulbs are suggestions.

A card with several tasks for a draft project owner to do, such as adding a description and selecting the necessary information.

Version page overhaul

The layout of the individual version page has gotten a complete overhaul. It's much easier to just show the new UI in action rather than trying to explain it!

A screenshot of the way that individual versions look now:

A screenshot of the way that individual versions look now.

That's not all, though. Version creation now automatically infers most details after you upload your first file. Try it out sometime—whenever you upload your first file, most stuff should already be filled in. This system is still in-development, so if you find any issues, please file an issue on GitHub.

Project card views

Anywhere which lists projects, namely search and user pages, have gotten a great overhaul. You can choose between the classic list view, the grid view, and the gallery view.

A screenshot of the default view for the Modrinth shaders search.

By default, shader packs and resource packs use the gallery view, user pages use the grid view, and everywhere else use the list view. You can cycle through them near the top of each page or change them in your display settings.

The gallery image uses the featured gallery image on a project, so please ensure if you are a shader pack or resource pack author that you set a featured gallery image!

Gallery image UI for creators

The existing UI for gallery image creation, editing, and deletion was flawed in many ways, so we threw out the old way of doing it and created a whole new system for this. It should be less prone to the many many bugs that plagued the previous implementation.

The new gallery image editing UI, in a modal

New project webhook

Our Discord server has a brand new channel: #new-projects. A webhook sends a message to this channel every time a new project gets approved. Check it out when you get a chance!

A screenshot of the new project webhook for Iris Shaders.

Miscellaneous additions

  • Custom SPDX license identifiers can now be selected, and a license's text is now displayed in a modal if the author has not manually set a license link.
  • Each project now has a color associated with it, generated from the icon. This color is used in place of a gallery image in search if the project has no gallery image.
  • The bug with disappearing and duplicated versions due to the reuse of version numbers is now fixed.
  • Whenever a project gets its status updated (for example from under review to approved), the project's team members will now get a notification.
  • The ability to manually reorder gallery images has been added via an integer ordering field. In the future, this sorting ability may expand to team members and versions. We also hope to add a drag-and-drop functionality similar to Discord server organization.
  • You can also now formally request that your project be marked as unlisted, private, or archived instead of always having it be listed first.
  • The ability to schedule the release of projects and versions has been added to the backend and is likely to be added to the frontend in the next few weeks.
  • Several other bug fixes and minor features, mainly contributed by community members.

New Year's Resolutions

Now that we've looked at everything accomplished over the past month and a half, let's take a look at our New Year's Resolutions—things we wish to achieve during 2023.

Theseus Launcher

During 2023, our main focus will shift to the Modrinth launcher, code-named Theseus. Progress has been off and on for the past year and a half, but we intend to fully launch it before the end of the year. Theseus will bring a next-level experience to Minecraft launchers, bringing first-class support for Modrinth and unique features that would be difficult for other providers to parallel.

The release of the Theseus project will also mark the end of the "alpha" status for Modrinth modpacks. Stay tuned for more information about alpha tests and early adopters programs!

Continuing to grow creator tools

Another one of our focuses for this year is to put more work into our analytics system and in growing creator monetization through our Adrinth ad network. As of today, monetization is now out of beta, but we are still constantly working on ways to make Modrinth even better and easier to use for new and returning creators. Some of these improvements are big, like the project settings overhaul, while others are more subtle quality-of-life improvements, like the fixes to usage of duplicate version numbers.

API changes

This year, Modrinth hopes to introduce version 3 of our API with lots of fixes and smaller changes. While our plans are still work-in-progress for this, one of the things that needs to be done first is the removal of the old API v1, which was deprecated starting in January 2022. Here's our planned timeline for the removal of API v1:

  • January 7th, 2023 (Now): Begin sending messages to existing API v1 users
  • January 7th, 2023 (Now): Add a field to each API result telling people to switch
  • February 14th, 2023: Begin doing flickers of 5-10 minutes of 410 GONE response codes
  • March 1st, 2023: Begin sending a permanent 410 GONE response for any non-GET routes
  • March 1st, 2023: Ramp up 410 GONE flickers to last 6-12 hours for GET routes
  • March 15th, 2023: Replace all remaining GET routes with a permanent 410 GONE response

Small updates throughout the year

As always, we will be interspersing other, smaller quality-of-life updates throughout the year even as we work on the big stuff. We also want to fix any bugs which might come up alongside any updates.

Conclusion

Modrinth was founded with the goal of creating a platform which keeps the broader modding community's interests at heart. Modrinth would not exist without the support of our users and of our contributors, and we thank everyone involved immensely for everything. Modrinth's development shall continue as long as the community is willing to support us on the way!

We would love to hear any feedback you might have. Feel free to get in contact on Discord, on Twitter, and on Mastodon.

` +export const html = `

Modrinth initially went into beta on November 30th, 2020. Just over a month ago was November 30th, 2022, marking two years since Modrinth was generally available as a platform for everyone to use. Today, we're proud to announce the Anniversary Update, celebrating both two years of Modrinth as well as the coming of the new year, and we'll be discussing our New Year's Resolutions for 2023.

Before you read this post, though, we recommend taking a look at our retrospective on Modrinth's history through 2020—2022. It just wouldn't be right to take a look at the present and the future without also taking a look at our past, seeing how far we've come from our humble beginnings.

With that out of the way, this post primarily serves to announce a few of the smaller features we've been working on after the release of creator monetization. We've bundled these all together as the Anniversary Update.

Looking just at what's already done is boring, though, so we'll also be looking at what's yet to come. Modrinth's future is even brighter than any of us can imagine, so we'll be focusing on what we're gonna do in order to get to that bright future. If you've ever made New Year's Resolutions, we're going to briefly discuss our resolutions for 2023.

Without further adieu, let's get right into what's new with this new year!

Shader packs and data packs

The long-awaited arrival of shader packs and data packs is now here on Modrinth!

Shader packs can be viewed in the shaders tab. This includes shaders that support Iris, Canvas, and OptiFine, as well as vanilla core shaders. (Even though they're installed via the resource pack system, we have decided to put Canvas and core shaders in shader packs since most users will not search in resource packs for shader packs, even if that's how they're installed.)

Data packs can be found in the data packs tab. These are implemented similarly to plugins, in that projects with a mod version can also upload a data pack version (and vice versa). Additionally, data pack authors can choose to have their data packs packaged as a mod using the handy-dandy button on the site.

Data packs can optionally upload a corresponding resource pack as a separate file. We discourage bundling data files and asset files in the same zip file.

New landing page

The homepage has been completely remade, featuring a scrolling list of random projects from Modrinth. Feel free to use this to discover new projects—just make sure you refresh occasionally, because they loop after a little while until you refresh!

A screenshot of the new homepage, with a maze background and projects scrolling across the bottom. Bold across the front is "The place for Minecraft mods".

Project overhaul for creators

We're continuing to bring expansions to the creator dashboard introduced with monetization. The new Projects tab allows you to view all of your projects in a table and quickly access their information and settings.

The new Modrinth project dashboard

The same page also introduces the ability to bulk-edit the external resource links without having to edit each page individually. For example, if your Discord invite expires, you used to have to edit each of your projects individually to add it back. Now you can just select the projects you want to edit the links for and edit them all at the same time!

A modal with several input fields for external resource links, listing multiple projects the input changes will be applied to.

Even better are the changes to the settings page for individual projects. Previously, the project settings page was disorganized and cluttered. The project settings page has been completely redone, inspired by GitHub's repository settings page.

The new project settings page, shown for Sodium.

Draft projects also now have a publishing checklist, making it more clear to authors as to what their next steps should look like. Red asterisks are items that must be completed before submitting and purple light bulbs are suggestions.

A card with several tasks for a draft project owner to do, such as adding a description and selecting the necessary information.

Version page overhaul

The layout of the individual version page has gotten a complete overhaul. It's much easier to just show the new UI in action rather than trying to explain it!

A screenshot of the way that individual versions look now:

A screenshot of the way that individual versions look now.

That's not all, though. Version creation now automatically infers most details after you upload your first file. Try it out sometime—whenever you upload your first file, most stuff should already be filled in. This system is still in-development, so if you find any issues, please file an issue on GitHub.

Project card views

Anywhere which lists projects, namely search and user pages, have gotten a great overhaul. You can choose between the classic list view, the grid view, and the gallery view.

A screenshot of the default view for the Modrinth shaders search.

By default, shader packs and resource packs use the gallery view, user pages use the grid view, and everywhere else use the list view. You can cycle through them near the top of each page or change them in your display settings.

The gallery image uses the featured gallery image on a project, so please ensure if you are a shader pack or resource pack author that you set a featured gallery image!

Gallery image UI for creators

The existing UI for gallery image creation, editing, and deletion was flawed in many ways, so we threw out the old way of doing it and created a whole new system for this. It should be less prone to the many many bugs that plagued the previous implementation.

The new gallery image editing UI, in a modal

New project webhook

Our Discord server has a brand new channel: #new-projects. A webhook sends a message to this channel every time a new project gets approved. Check it out when you get a chance!

A screenshot of the new project webhook for Iris Shaders.

Miscellaneous additions

  • Custom SPDX license identifiers can now be selected, and a license's text is now displayed in a modal if the author has not manually set a license link.
  • Each project now has a color associated with it, generated from the icon. This color is used in place of a gallery image in search if the project has no gallery image.
  • The bug with disappearing and duplicated versions due to the reuse of version numbers is now fixed.
  • Whenever a project gets its status updated (for example from under review to approved), the project's team members will now get a notification.
  • The ability to manually reorder gallery images has been added via an integer ordering field. In the future, this sorting ability may expand to team members and versions. We also hope to add a drag-and-drop functionality similar to Discord server organization.
  • You can also now formally request that your project be marked as unlisted, private, or archived instead of always having it be listed first.
  • The ability to schedule the release of projects and versions has been added to the backend and is likely to be added to the frontend in the next few weeks.
  • Several other bug fixes and minor features, mainly contributed by community members.

New Year's Resolutions

Now that we've looked at everything accomplished over the past month and a half, let's take a look at our New Year's Resolutions—things we wish to achieve during 2023.

Theseus Launcher

During 2023, our main focus will shift to the Modrinth launcher, code-named Theseus. Progress has been off and on for the past year and a half, but we intend to fully launch it before the end of the year. Theseus will bring a next-level experience to Minecraft launchers, bringing first-class support for Modrinth and unique features that would be difficult for other providers to parallel.

The release of the Theseus project will also mark the end of the "alpha" status for Modrinth modpacks. Stay tuned for more information about alpha tests and early adopters programs!

Continuing to grow creator tools

Another one of our focuses for this year is to put more work into our analytics system and in growing creator monetization through our Adrinth ad network. As of today, monetization is now out of beta, but we are still constantly working on ways to make Modrinth even better and easier to use for new and returning creators. Some of these improvements are big, like the project settings overhaul, while others are more subtle quality-of-life improvements, like the fixes to usage of duplicate version numbers.

API changes

This year, Modrinth hopes to introduce version 3 of our API with lots of fixes and smaller changes. While our plans are still work-in-progress for this, one of the things that needs to be done first is the removal of the old API v1, which was deprecated starting in January 2022. Here's our planned timeline for the removal of API v1:

  • January 7th, 2023 (Now): Begin sending messages to existing API v1 users
  • January 7th, 2023 (Now): Add a field to each API result telling people to switch
  • February 14th, 2023: Begin doing flickers of 5-10 minutes of 410 GONE response codes
  • March 1st, 2023: Begin sending a permanent 410 GONE response for any non-GET routes
  • March 1st, 2023: Ramp up 410 GONE flickers to last 6-12 hours for GET routes
  • March 15th, 2023: Replace all remaining GET routes with a permanent 410 GONE response

Small updates throughout the year

As always, we will be interspersing other, smaller quality-of-life updates throughout the year even as we work on the big stuff. We also want to fix any bugs which might come up alongside any updates.

Conclusion

Modrinth was founded with the goal of creating a platform which keeps the broader modding community's interests at heart. Modrinth would not exist without the support of our users and of our contributors, and we thank everyone involved immensely for everything. Modrinth's development shall continue as long as the community is willing to support us on the way!

We would love to hear any feedback you might have. Feel free to get in contact on Discord, on Twitter, and on Mastodon.

`; diff --git a/packages/blog/compiled/two_years_of_modrinth.ts b/packages/blog/compiled/two_years_of_modrinth.ts index 0fb3aab8a..431d45379 100644 --- a/packages/blog/compiled/two_years_of_modrinth.ts +++ b/packages/blog/compiled/two_years_of_modrinth.ts @@ -1,10 +1,11 @@ // AUTO-GENERATED FILE - DO NOT EDIT export const article = { - html: () => import(`./two_years_of_modrinth.content`).then((m) => m.html), - title: "Modrinth's Anniversary Update", - summary: "Marking two years of Modrinth and discussing our New Year's Resolutions for 2023.", - date: '2023-01-07T00:00:00.000Z', - slug: 'two-years-of-modrinth', - authors: ['6plzAzU4'], - thumbnail: true, -} + html: () => import(`./two_years_of_modrinth.content`).then(m => m.html), + title: "Modrinth's Anniversary Update", + summary: "Marking two years of Modrinth and discussing our New Year's Resolutions for 2023.", + date: "2023-01-07T00:00:00.000Z", + slug: "two-years-of-modrinth", + authors: ["6plzAzU4"], + thumbnail: true, + +}; diff --git a/packages/blog/compiled/two_years_of_modrinth_history.content.ts b/packages/blog/compiled/two_years_of_modrinth_history.content.ts index f80ef901d..5f55fa305 100644 --- a/packages/blog/compiled/two_years_of_modrinth_history.content.ts +++ b/packages/blog/compiled/two_years_of_modrinth_history.content.ts @@ -1,2 +1,2 @@ // AUTO-GENERATED FILE - DO NOT EDIT -export const html = `

Let's rewind a bit and take a look at the past two years of Modrinth's history. We've come so far from our pre-beta HexFabric days to today. A good portion of our pre-beta history can be found in the What is Modrinth blog post, but Modrinth obviously is not the same platform it was two years ago.

December 2020: Modrinth Beta begins

Modrinth's brand new design, rolling out with the launch of Beta

Modrinth's brand new design, rolling out with the launch of Beta

December was the release of the initial Modrinth Beta, bringing a completely different interface and the ability for mods to be created for the first time. This interface has since been completely discarded, but this is what Modrinth looked like for well over a year. It's hard to believe!

December also brought the introduction of the Minotaur Gradle plugin for the first time for upload automation. Minotaur today also looks nothing like it did when it was introduced, but it still accomplishes the same exact thing.

January 2021: Improvements to mod uploading

An announcement in mid-January brought several essential additions and improvements to Modrinth which we consider commonplace today. Among these were:

  • A separate version creation page
  • The ability to edit and delete existing versions
  • The ability to delete existing mods and users

January also brought the introduction of Google AdSense onto Modrinth. The eventual results, including our switch after to EthicalAds, solidified Modrinth's stance that ads should be unobtrusive and generally friendly to users.

February-March 2021: Follows, reports, notifications, oh my!

March brought the first introduction of the abilities to follow and report projects, as well as the automatic featuring of some versions depending on loader and Minecraft version. These systems have largely remained unchanged since their introduction, though the notification system will likely be getting a refresh come 2023.

April-December 2021: Season of silence

After follows, reports, and all that jazz, Modrinth largely went silent for a good while. This time period had some of the largest growth Modrinth had ever seen, and yet it seemed Modrinth's development had ground to a halt. Modrinth Team members were dropping like flies until there was a point where there was a single person on the team. What happened?

For various reasons, whether it be lack of free time or a lack of interest in Minecraft in general, people ended up leaving to pursue other things. It's not quite as apocalyptic or barren as these descriptions make it seem, but it's more fun to describe it like this.

Picking up the remnants from what others had left behind, one man was destined to continue developing for Modrinth. The one who began the whole operation in the first place, Geometrically, stood up and began developing. Thus came the development of project types, gallery images, API v2, and modpacks.

January 2022: API v2 introduction

Right around the corner came 2022. Perchance this would be the time for the silence to be broken? Indeed, the world would be able to hear about all that was brewing over the past few months.

Of course, this wasn't all introduced at once—it was a gradual rollout over several months. First was the introduction of v2 of Modrinth's API, allowing many breaking changes to occur, including namely the renaming of mods to projects. Wait, why was this necessary?

Up until this point, Modrinth only hosted mods. Project types, as we call them, allow projects to be given the designation of something other than mod; for example, modpack or resourcepack, like we have today. This simple field, alongside all of the infrastructure which was needed to support it, was the first step to allow modpacks on Modrinth.

February 2022: Redesign

Remember the interface introduced in December 2020? Let's scrap it! Actually, it wasn't entirely scrapped, but it got a treatment similar to the Ship of Theseus to the point that it was barely recognizable.

The Modrinth homepage

The former Modrinth homepage

Alongside this was the official announcement of API v2, as well as the introduction of the project gallery, the changelog tab, dependencies, and many other things. Here's the blog post announcement for the redesign!

February also brought the introduction of several new Modrinth Team members to the fold, including Prospector and triphora, both of whom are still on the team, alongside Hutzdog and venashial, who we thank for helping us through much of 2022.

March-April 2022: Small changes and preparation for modpacks

A couple weeks after the redesign we pushed out some changes which included improvements to several tabs on project pages and many bug fixes. The blog post from that can be found here.

The next couple months were spent preparing for the release of modpacks. This is the first introduction of our "early adopters" program, still in use today, allowing a feedback loop of authors and other community members to create the best product that we can. Without early adopters, many of the features on Modrinth which you've come to love, including modpacks, plugins, resource packs, would be less than ideal.

May 2022: Modpacks in alpha

In May, we finally did the big release of modpacks on Modrinth. Well, in alpha, anyway—but that was less of a marker of instability and more a marker of being incomplete without the launcher. The modpack alpha release blog post can be found here.

When we first announced modpacks, the initial format had been set in stone for a couple years, and it had been decided that CurseForge links would be allowed within them. This got turned on its head due to an email sent to us by Overwolf. More information on that can be found on the Changes to Modrinth Modpacks blog post.

Progryck

June-August 2022: Plugins and resource packs

The summer of 2022 was largely dedicated to working on releasing creator monetization. First, though, we made a pit stop to introduce plugins and resource packs to Modrinth. Find that blog post here.

Plugins in particular were tricky since we had to account for projects which had both mod and plugin versions. It was at this point we realized that the project type system isn't entirely what we cracked it up to be, and we're hoping to completely replace it once API v4 rolls around, as far away as that may sound. For now, though, it will suffice.

September-November 2022: Creator monetization

With plugins and resource packs done, we continued working on creator monetization. This included a brief experiment with a different ad provider before we eventually switched to creating our own ad system.

November brought the actual beta release of creator monetization—here's the blog post for that. We are continuing to develop and refine this system to ensure authors continue to earn money from publishing projects on Modrinth.

December 2022-January 2023: Anniversary Update

That, of course, brings us to today's Anniversary Update! Now that you're done reading this, feel free to go back over to that post and read about everything that's new in the Anniversary Update so that I don't have to repeat myself. Take a look at our New Year's Resolutions for 2023 while you're at it, too!

` +export const html = `

Let's rewind a bit and take a look at the past two years of Modrinth's history. We've come so far from our pre-beta HexFabric days to today. A good portion of our pre-beta history can be found in the What is Modrinth blog post, but Modrinth obviously is not the same platform it was two years ago.

December 2020: Modrinth Beta begins

Modrinth's brand new design, rolling out with the launch of Beta

Modrinth's brand new design, rolling out with the launch of Beta

December was the release of the initial Modrinth Beta, bringing a completely different interface and the ability for mods to be created for the first time. This interface has since been completely discarded, but this is what Modrinth looked like for well over a year. It's hard to believe!

December also brought the introduction of the Minotaur Gradle plugin for the first time for upload automation. Minotaur today also looks nothing like it did when it was introduced, but it still accomplishes the same exact thing.

January 2021: Improvements to mod uploading

An announcement in mid-January brought several essential additions and improvements to Modrinth which we consider commonplace today. Among these were:

  • A separate version creation page
  • The ability to edit and delete existing versions
  • The ability to delete existing mods and users

January also brought the introduction of Google AdSense onto Modrinth. The eventual results, including our switch after to EthicalAds, solidified Modrinth's stance that ads should be unobtrusive and generally friendly to users.

February-March 2021: Follows, reports, notifications, oh my!

March brought the first introduction of the abilities to follow and report projects, as well as the automatic featuring of some versions depending on loader and Minecraft version. These systems have largely remained unchanged since their introduction, though the notification system will likely be getting a refresh come 2023.

April-December 2021: Season of silence

After follows, reports, and all that jazz, Modrinth largely went silent for a good while. This time period had some of the largest growth Modrinth had ever seen, and yet it seemed Modrinth's development had ground to a halt. Modrinth Team members were dropping like flies until there was a point where there was a single person on the team. What happened?

For various reasons, whether it be lack of free time or a lack of interest in Minecraft in general, people ended up leaving to pursue other things. It's not quite as apocalyptic or barren as these descriptions make it seem, but it's more fun to describe it like this.

Picking up the remnants from what others had left behind, one man was destined to continue developing for Modrinth. The one who began the whole operation in the first place, Geometrically, stood up and began developing. Thus came the development of project types, gallery images, API v2, and modpacks.

January 2022: API v2 introduction

Right around the corner came 2022. Perchance this would be the time for the silence to be broken? Indeed, the world would be able to hear about all that was brewing over the past few months.

Of course, this wasn't all introduced at once—it was a gradual rollout over several months. First was the introduction of v2 of Modrinth's API, allowing many breaking changes to occur, including namely the renaming of mods to projects. Wait, why was this necessary?

Up until this point, Modrinth only hosted mods. Project types, as we call them, allow projects to be given the designation of something other than mod; for example, modpack or resourcepack, like we have today. This simple field, alongside all of the infrastructure which was needed to support it, was the first step to allow modpacks on Modrinth.

February 2022: Redesign

Remember the interface introduced in December 2020? Let's scrap it! Actually, it wasn't entirely scrapped, but it got a treatment similar to the Ship of Theseus to the point that it was barely recognizable.

The Modrinth homepage

The former Modrinth homepage

Alongside this was the official announcement of API v2, as well as the introduction of the project gallery, the changelog tab, dependencies, and many other things. Here's the blog post announcement for the redesign!

February also brought the introduction of several new Modrinth Team members to the fold, including Prospector and triphora, both of whom are still on the team, alongside Hutzdog and venashial, who we thank for helping us through much of 2022.

March-April 2022: Small changes and preparation for modpacks

A couple weeks after the redesign we pushed out some changes which included improvements to several tabs on project pages and many bug fixes. The blog post from that can be found here.

The next couple months were spent preparing for the release of modpacks. This is the first introduction of our "early adopters" program, still in use today, allowing a feedback loop of authors and other community members to create the best product that we can. Without early adopters, many of the features on Modrinth which you've come to love, including modpacks, plugins, resource packs, would be less than ideal.

May 2022: Modpacks in alpha

In May, we finally did the big release of modpacks on Modrinth. Well, in alpha, anyway—but that was less of a marker of instability and more a marker of being incomplete without the launcher. The modpack alpha release blog post can be found here.

When we first announced modpacks, the initial format had been set in stone for a couple years, and it had been decided that CurseForge links would be allowed within them. This got turned on its head due to an email sent to us by Overwolf. More information on that can be found on the Changes to Modrinth Modpacks blog post.

Progryck

June-August 2022: Plugins and resource packs

The summer of 2022 was largely dedicated to working on releasing creator monetization. First, though, we made a pit stop to introduce plugins and resource packs to Modrinth. Find that blog post here.

Plugins in particular were tricky since we had to account for projects which had both mod and plugin versions. It was at this point we realized that the project type system isn't entirely what we cracked it up to be, and we're hoping to completely replace it once API v4 rolls around, as far away as that may sound. For now, though, it will suffice.

September-November 2022: Creator monetization

With plugins and resource packs done, we continued working on creator monetization. This included a brief experiment with a different ad provider before we eventually switched to creating our own ad system.

November brought the actual beta release of creator monetization—here's the blog post for that. We are continuing to develop and refine this system to ensure authors continue to earn money from publishing projects on Modrinth.

December 2022-January 2023: Anniversary Update

That, of course, brings us to today's Anniversary Update! Now that you're done reading this, feel free to go back over to that post and read about everything that's new in the Anniversary Update so that I don't have to repeat myself. Take a look at our New Year's Resolutions for 2023 while you're at it, too!

`; diff --git a/packages/blog/compiled/two_years_of_modrinth_history.ts b/packages/blog/compiled/two_years_of_modrinth_history.ts index de75bef63..6179584db 100644 --- a/packages/blog/compiled/two_years_of_modrinth_history.ts +++ b/packages/blog/compiled/two_years_of_modrinth_history.ts @@ -1,10 +1,11 @@ // AUTO-GENERATED FILE - DO NOT EDIT export const article = { - html: () => import(`./two_years_of_modrinth_history.content`).then((m) => m.html), - title: 'Two years of Modrinth: a retrospective', - summary: 'The history of Modrinth as we know it from December 2020 to December 2022.', - date: '2023-01-07T00:00:00.000Z', - slug: 'two-years-of-modrinth-history', - authors: ['6plzAzU4'], - thumbnail: false, -} + html: () => import(`./two_years_of_modrinth_history.content`).then(m => m.html), + title: "Two years of Modrinth: a retrospective", + summary: "The history of Modrinth as we know it from December 2020 to December 2022.", + date: "2023-01-07T00:00:00.000Z", + slug: "two-years-of-modrinth-history", + authors: ["6plzAzU4"], + thumbnail: false, + +}; diff --git a/packages/blog/compiled/whats_modrinth.content.ts b/packages/blog/compiled/whats_modrinth.content.ts index 3e07d1ee9..b9a35514d 100644 --- a/packages/blog/compiled/whats_modrinth.content.ts +++ b/packages/blog/compiled/whats_modrinth.content.ts @@ -1,2 +1,2 @@ // AUTO-GENERATED FILE - DO NOT EDIT -export const html = `

Hello, we are Modrinth – an open source mods hosting platform. Sounds dry, doesn't it? So let me tell you our story – and I promise, it won't be boring!

Prelude and conception

Before Modrinth was even thought of, there already were several giant platforms for mod hosting. However, most of them were too specialized, outdated, or transitively dependent on an uncaring hegemonic 3rd party. Authors and players were always in struggle. The community had to choose 2 out of 3: inconvenience, indifference, obsolescence. Urge for better service, either new or renewed, just founded or acquired arose.

Although demand for proper competition is the seed, the germ of Modrinth, the biggest role was played by the Fabric project. It set an example of a community-powered alternative. It was democratic, FOSS, listening to the community, and welcoming contribution and 3rd party initiatives. They have shown the modding community that they can evolve and adapt, be accessible and welcoming, cooperative, and caring.

Fabricate and HexFabric

And, oh boy, did they connect – the demand for competition grew so high, that at some point the community just exploded with novelty. During several months, almost a dozen projects were aiming to be the second Walmart, the third IKEA, the fourth Amazon for your mods. Here beings the story of HexFabrics... – wait, what? What's that?

HexFabric is an umbrella term for modern mod hosting technology. It got its name from Fabric, which at the point was poorly supported (if at all) by the major players on the stage. In practice, HexFabric is just a cozy Discord server, on which several projects have their deputizing channels.

Back on track – Lots of HexFabrics were founded almost simultaneously. Altar.gg, Astronave, Diluv, ModForest, Minerepo... and, most importantly, Fabricate.

Fabricate began its journey as a proprietary project indexing website by a single developer – Geometrically. It remained relatively unnoticed for a couple of weeks, and then it started gaining attention. This new website has amazing search! Yup, the whole thing was primarily about making seamless, gracious, appeasing smart real-time search. The community is now intrigued.

Becoming a team

"But this looks awful! And it's proprietary!" – a few voices said. Among those voices were falseresync and MulverineX. They both had several objections to that and were pestering the original author. "FOSS is the true way for community project" and "Just use a license to prevent others from creating instances of your work," they told.

Yet Fabricate remained proprietary for a while. However, once the pressure on the author became high, they gave up and open-sourced their work. This was the birth of Modrinth. It did not get its name for a little while longer though.

Now that Modrinth was open source, it started gaining traction. Remember falseresync and MulverineX? They joined Geometrically on the branding site, and somewhere in the middle of the brainstorming process the logo and the name were born. At the same time AppleTheGolden, Aeledfyr, and Redblueflame began contributing to the actual code of the project, which is – nowadays known to everyone – in Rust. A solo suddenly became a team, ready for whatever future holds.

Development non-stop

The newly born FOSS project is now evolving swiftly. Before our team arose the question: monolithic vs split app architecture. Monolithic would be easier to deploy and can serve pages quicker. The split architecture will simplify the development and allow for a feature-full user experience. The discussion was hot, and the sides were fierce. Nevertheless, the split pattern won. Now it was time to make proper backend and frontend apps.

The work first began with the backend. Aeled, Red, and Geo started detaching API methods from visuals. The team worked hard. Consequent to the API splitting from the GUI, it became getting new and exciting features. The first feature to be added was custom Modrinth mods – before that, the website only indexed the competitor's service.

However, for that to happen there had to be another step taken – migration from MongoDB to PostgreSQL. It was crucial for efficient data storage and complex relationships between projects. And the biggest propagator of that change was Apple, who introduced and successfully defended their case.

Thus, with custom mods, better yet search has been implemented. After search, user accounts with external log-in made their way into the project. Now it first creators started uploading their mods – a monumental achievement.

After the first creators came more – the community began taking Modrinth as a serious alternative hosting. At some point, uploads accelerated to the point that our team was forced to redo their plans and establish project editing and moderation considerably earlier than it could have been. Besides, creators need analytics, they need teams, they needed support system. So the backend developers tried their best to keep up and achieved their goals through enthusiastic labor and dedication.

Refreshed look

Although, on the frontend side things weren't as bright, unfortunately. Once falseresync presented the new look and feel Modrinth should aim for, he was forced to dedicate less time to the project. As a consequence, the frontend was implemented rather haphazardly and was lacking in features compared to the backend.

However, this did not stop the project from evolving. The backend team has continued to expand on existing features, and after a long period of time, the savior descended on the frontend – Prospector, who rapidly became a crucial contributor and a part of the team. With new and comprehensive design guidance from falseresync and critique from MulverineX and the community, Prospector achieved feature parity with backend and greatly improved the website look and feel.

Improving the frontend wasn't an easy job: naughty CSS, runtime errors, the abundance of framework-related nuances – all were obstacles, and all were defeated. Through battles with web technologies, jokes about quirky styles, and hard work our team created the UI you see today.

Going beta

You have to believe that the dots will somehow connect in your future. – Steve Jobs

With the story complete, we are proud to announce that the Modrinth beta will be coming out on November 30th, with a refreshed look and a feature-complete modding website! It is a tremendous achievement for us and the community, which we are very proud of.

It is heart-warming to admit that we're finally going officially online. We know it's not perfect yet. But regardless, we will continue our passion project as a team, and we will expand on it and make it only better!

Stay tuned!

` +export const html = `

Hello, we are Modrinth – an open source mods hosting platform. Sounds dry, doesn't it? So let me tell you our story – and I promise, it won't be boring!

Prelude and conception

Before Modrinth was even thought of, there already were several giant platforms for mod hosting. However, most of them were too specialized, outdated, or transitively dependent on an uncaring hegemonic 3rd party. Authors and players were always in struggle. The community had to choose 2 out of 3: inconvenience, indifference, obsolescence. Urge for better service, either new or renewed, just founded or acquired arose.

Although demand for proper competition is the seed, the germ of Modrinth, the biggest role was played by the Fabric project. It set an example of a community-powered alternative. It was democratic, FOSS, listening to the community, and welcoming contribution and 3rd party initiatives. They have shown the modding community that they can evolve and adapt, be accessible and welcoming, cooperative, and caring.

Fabricate and HexFabric

And, oh boy, did they connect – the demand for competition grew so high, that at some point the community just exploded with novelty. During several months, almost a dozen projects were aiming to be the second Walmart, the third IKEA, the fourth Amazon for your mods. Here beings the story of HexFabrics... – wait, what? What's that?

HexFabric is an umbrella term for modern mod hosting technology. It got its name from Fabric, which at the point was poorly supported (if at all) by the major players on the stage. In practice, HexFabric is just a cozy Discord server, on which several projects have their deputizing channels.

Back on track – Lots of HexFabrics were founded almost simultaneously. Altar.gg, Astronave, Diluv, ModForest, Minerepo... and, most importantly, Fabricate.

Fabricate began its journey as a proprietary project indexing website by a single developer – Geometrically. It remained relatively unnoticed for a couple of weeks, and then it started gaining attention. This new website has amazing search! Yup, the whole thing was primarily about making seamless, gracious, appeasing smart real-time search. The community is now intrigued.

Becoming a team

"But this looks awful! And it's proprietary!" – a few voices said. Among those voices were falseresync and MulverineX. They both had several objections to that and were pestering the original author. "FOSS is the true way for community project" and "Just use a license to prevent others from creating instances of your work," they told.

Yet Fabricate remained proprietary for a while. However, once the pressure on the author became high, they gave up and open-sourced their work. This was the birth of Modrinth. It did not get its name for a little while longer though.

Now that Modrinth was open source, it started gaining traction. Remember falseresync and MulverineX? They joined Geometrically on the branding site, and somewhere in the middle of the brainstorming process the logo and the name were born. At the same time AppleTheGolden, Aeledfyr, and Redblueflame began contributing to the actual code of the project, which is – nowadays known to everyone – in Rust. A solo suddenly became a team, ready for whatever future holds.

Development non-stop

The newly born FOSS project is now evolving swiftly. Before our team arose the question: monolithic vs split app architecture. Monolithic would be easier to deploy and can serve pages quicker. The split architecture will simplify the development and allow for a feature-full user experience. The discussion was hot, and the sides were fierce. Nevertheless, the split pattern won. Now it was time to make proper backend and frontend apps.

The work first began with the backend. Aeled, Red, and Geo started detaching API methods from visuals. The team worked hard. Consequent to the API splitting from the GUI, it became getting new and exciting features. The first feature to be added was custom Modrinth mods – before that, the website only indexed the competitor's service.

However, for that to happen there had to be another step taken – migration from MongoDB to PostgreSQL. It was crucial for efficient data storage and complex relationships between projects. And the biggest propagator of that change was Apple, who introduced and successfully defended their case.

Thus, with custom mods, better yet search has been implemented. After search, user accounts with external log-in made their way into the project. Now it first creators started uploading their mods – a monumental achievement.

After the first creators came more – the community began taking Modrinth as a serious alternative hosting. At some point, uploads accelerated to the point that our team was forced to redo their plans and establish project editing and moderation considerably earlier than it could have been. Besides, creators need analytics, they need teams, they needed support system. So the backend developers tried their best to keep up and achieved their goals through enthusiastic labor and dedication.

Refreshed look

Although, on the frontend side things weren't as bright, unfortunately. Once falseresync presented the new look and feel Modrinth should aim for, he was forced to dedicate less time to the project. As a consequence, the frontend was implemented rather haphazardly and was lacking in features compared to the backend.

However, this did not stop the project from evolving. The backend team has continued to expand on existing features, and after a long period of time, the savior descended on the frontend – Prospector, who rapidly became a crucial contributor and a part of the team. With new and comprehensive design guidance from falseresync and critique from MulverineX and the community, Prospector achieved feature parity with backend and greatly improved the website look and feel.

Improving the frontend wasn't an easy job: naughty CSS, runtime errors, the abundance of framework-related nuances – all were obstacles, and all were defeated. Through battles with web technologies, jokes about quirky styles, and hard work our team created the UI you see today.

Going beta

You have to believe that the dots will somehow connect in your future. – Steve Jobs

With the story complete, we are proud to announce that the Modrinth beta will be coming out on November 30th, with a refreshed look and a feature-complete modding website! It is a tremendous achievement for us and the community, which we are very proud of.

It is heart-warming to admit that we're finally going officially online. We know it's not perfect yet. But regardless, we will continue our passion project as a team, and we will expand on it and make it only better!

Stay tuned!

`; diff --git a/packages/blog/compiled/whats_modrinth.ts b/packages/blog/compiled/whats_modrinth.ts index c81bacffd..970f87863 100644 --- a/packages/blog/compiled/whats_modrinth.ts +++ b/packages/blog/compiled/whats_modrinth.ts @@ -1,11 +1,11 @@ // AUTO-GENERATED FILE - DO NOT EDIT export const article = { - html: () => import(`./whats_modrinth.content`).then((m) => m.html), - title: 'What is Modrinth?', - summary: - "Hello, we are Modrinth – an open source mods hosting platform. Sounds dry, doesn't it? So let me tell you our story – and I promise, it won't be boring!", - date: '2020-11-27T00:00:00.000Z', - slug: 'whats-modrinth', - authors: ['aNd6VJql'], - thumbnail: false, -} + html: () => import(`./whats_modrinth.content`).then(m => m.html), + title: "What is Modrinth?", + summary: "Hello, we are Modrinth – an open source mods hosting platform. Sounds dry, doesn't it? So let me tell you our story – and I promise, it won't be boring!", + date: "2020-11-27T00:00:00.000Z", + slug: "whats-modrinth", + authors: ["aNd6VJql"], + thumbnail: false, + +}; diff --git a/packages/blog/compiled/windows_borderless_malware_disclosure.content.ts b/packages/blog/compiled/windows_borderless_malware_disclosure.content.ts index 7eb6c1eb3..f19502419 100644 --- a/packages/blog/compiled/windows_borderless_malware_disclosure.content.ts +++ b/packages/blog/compiled/windows_borderless_malware_disclosure.content.ts @@ -1,2 +1,2 @@ // AUTO-GENERATED FILE - DO NOT EDIT -export const html = `

This is a disclosure of a malicious mod discovered to be hosted on the Modrinth platform. It is important to not panic or jump to conclusions, please carefully read the Am I Affected? and Threat Summary sections.

Am I Affected?

If you run Windows and have downloaded a mod called "Windows Borderless" (specific files listed below) between May 4th, 2024 and May 6th, 2024 and have run the game with the mod installed, you are affected.

IMPORTANT NOTE: This mod is called, exactly, "Windows Borderless". There are other mods with similar names on Modrinth, which are NOT malware, such as "Borderless Mining", "Borderless", and "Borderless Mining Reworked".

If you have not downloaded that mod or do not run Windows, there is no reason to believe you are at any risk. We have released a detection tool available here which can scan your mods folder for the malicious files if you wish to make sure your instance does not have the mod. The tool is also open-source.

Download and run the detection tool here!

What do I do if I have used the "Windows Borderless" mod?

First, delete the mod entirely from your computer.

The mod harvested data stored by many Chromium-based projects such as Google Chrome, Discord, Microsoft Edge, and many other browsers such as Opera/Opera GX, Vivaldi, Brave, Firefox and over dozen more. Included in this data may be account tokens, stored passwords, banking information, addresses, and more.

In order to protect yourself, change all of your passwords, and keep an eye out on your bank accounts and credit cards.

Threat Summary

Exposure level: Low, ~372 distinct IPs downloaded affected files. One Discord account is alleged to have been stolen due to this.

Malware severity: Medium (Discord, browser, and system info stealer, but does not self-replicate)

Projects affected:

NameProject IDFormer URL
Windows BorderlessZQpQzwWEhttps://modrinth.com/mod/windowsborderless

Files affected:

NameSHA1 HashVersion IDDownload count
windowedborderless-v0.2 - 1.20.4.jar179b5da318604f97616b5108f305e2a8e4609484NkTbhEmf116
windowedborderless-v0.3 - 1.20.4.jar1a1c4dcae846866c58cc1abf71fb7f7aa4e7352av87dk8Q715
windowedborderless-v0.4 - 1.20.+.jare4d55310039b965fce6756da5286b481cfb09946pVfdgPhy68
windowedborderless-v0.4 - 1.20.+.jar2f47e57a6bedc729359ffaf6f0149876008b5cc3Wt4RjZ49119
windowedborderless-v0.4.1_-_1.20.+.jar2f47e57a6bedc729359ffaf6f0149876008b5cc3oIlYelrb1

None of these files were included in any modpacks on the Modrinth platform, so you are only at risk if you downloaded the mod directly.

Timeline

April 29th, 2:39pm - Project submitted for review as a legitimate mod

The Modrinth project "Windows Borderless" is submitted for review with a single file uploaded that does not contain any malware.

April 30th, 12:15am - Modrinth moderators approve the project

The "Windows Borderless" project is approved with only one file, which contained no malware.

May 2nd, 3:50am - New version containing malware is published

A "Windows Borderless" version containing the file windowedborderless-v0.2 - 1.20.4.jar (mentioned in the table of affected files above) is published. This initial version of the malware did not include any credential or token stealing, but only sent identifying information about a user’s machine to a discord webhook.

May 4th, 4:01pm thru May 6th, 3:46am - More versions are uploaded

Between May 4th, 4:01pm and May 6th, 3:46am, more new versions of the mod containing the malware were uploaded. These versions all contain credential and token stealers.

May 6, 2024 @ 7:21am - A Modrinth user reports the project

A user submits a report against the mod, alleging that their Discord account got compromised after using the mod.

May 6, 2024 @ 10:37am - Modrinth moderators investigate the project

The mod is investigated by Modrinth staff. We decompiled the mod and discovered that the mod contained malicious code. The threat is immediately obvious, so within a few minutes we take down the project, all CDN links related to the project, and all other projects by the same users.

Conclusion

In response to this incident, we are actively developing a shared system to effectively quarantine known malicious mods by creating a web API to allow launchers to check if any of the files a user has downloaded match any of the files in our known malware database, and return up-to-date information about any known malware.

We are also in the process with working with relevant law enforcement agencies to pass along all information we have.

In order to also more proactively increase safety, we're also investigating possible methods of sandboxing or algorithmically detecting malware patterns in Java software. While these are infamously tricky to implement on certain platforms, we hope to do our best in order to ensure the best security for the modding community.

` +export const html = `

This is a disclosure of a malicious mod discovered to be hosted on the Modrinth platform. It is important to not panic or jump to conclusions, please carefully read the Am I Affected? and Threat Summary sections.

Am I Affected?

If you run Windows and have downloaded a mod called "Windows Borderless" (specific files listed below) between May 4th, 2024 and May 6th, 2024 and have run the game with the mod installed, you are affected.

IMPORTANT NOTE: This mod is called, exactly, "Windows Borderless". There are other mods with similar names on Modrinth, which are NOT malware, such as "Borderless Mining", "Borderless", and "Borderless Mining Reworked".

If you have not downloaded that mod or do not run Windows, there is no reason to believe you are at any risk. We have released a detection tool available here which can scan your mods folder for the malicious files if you wish to make sure your instance does not have the mod. The tool is also open-source.

Download and run the detection tool here!

What do I do if I have used the "Windows Borderless" mod?

First, delete the mod entirely from your computer.

The mod harvested data stored by many Chromium-based projects such as Google Chrome, Discord, Microsoft Edge, and many other browsers such as Opera/Opera GX, Vivaldi, Brave, Firefox and over dozen more. Included in this data may be account tokens, stored passwords, banking information, addresses, and more.

In order to protect yourself, change all of your passwords, and keep an eye out on your bank accounts and credit cards.

Threat Summary

Exposure level: Low, ~372 distinct IPs downloaded affected files. One Discord account is alleged to have been stolen due to this.

Malware severity: Medium (Discord, browser, and system info stealer, but does not self-replicate)

Projects affected:

NameProject IDFormer URL
Windows BorderlessZQpQzwWEhttps://modrinth.com/mod/windowsborderless

Files affected:

NameSHA1 HashVersion IDDownload count
windowedborderless-v0.2 - 1.20.4.jar179b5da318604f97616b5108f305e2a8e4609484NkTbhEmf116
windowedborderless-v0.3 - 1.20.4.jar1a1c4dcae846866c58cc1abf71fb7f7aa4e7352av87dk8Q715
windowedborderless-v0.4 - 1.20.+.jare4d55310039b965fce6756da5286b481cfb09946pVfdgPhy68
windowedborderless-v0.4 - 1.20.+.jar2f47e57a6bedc729359ffaf6f0149876008b5cc3Wt4RjZ49119
windowedborderless-v0.4.1_-_1.20.+.jar2f47e57a6bedc729359ffaf6f0149876008b5cc3oIlYelrb1

None of these files were included in any modpacks on the Modrinth platform, so you are only at risk if you downloaded the mod directly.

Timeline

April 29th, 2:39pm - Project submitted for review as a legitimate mod

The Modrinth project "Windows Borderless" is submitted for review with a single file uploaded that does not contain any malware.

April 30th, 12:15am - Modrinth moderators approve the project

The "Windows Borderless" project is approved with only one file, which contained no malware.

May 2nd, 3:50am - New version containing malware is published

A "Windows Borderless" version containing the file windowedborderless-v0.2 - 1.20.4.jar (mentioned in the table of affected files above) is published. This initial version of the malware did not include any credential or token stealing, but only sent identifying information about a user’s machine to a discord webhook.

May 4th, 4:01pm thru May 6th, 3:46am - More versions are uploaded

Between May 4th, 4:01pm and May 6th, 3:46am, more new versions of the mod containing the malware were uploaded. These versions all contain credential and token stealers.

May 6, 2024 @ 7:21am - A Modrinth user reports the project

A user submits a report against the mod, alleging that their Discord account got compromised after using the mod.

May 6, 2024 @ 10:37am - Modrinth moderators investigate the project

The mod is investigated by Modrinth staff. We decompiled the mod and discovered that the mod contained malicious code. The threat is immediately obvious, so within a few minutes we take down the project, all CDN links related to the project, and all other projects by the same users.

Conclusion

In response to this incident, we are actively developing a shared system to effectively quarantine known malicious mods by creating a web API to allow launchers to check if any of the files a user has downloaded match any of the files in our known malware database, and return up-to-date information about any known malware.

We are also in the process with working with relevant law enforcement agencies to pass along all information we have.

In order to also more proactively increase safety, we're also investigating possible methods of sandboxing or algorithmically detecting malware patterns in Java software. While these are infamously tricky to implement on certain platforms, we hope to do our best in order to ensure the best security for the modding community.

`; diff --git a/packages/blog/compiled/windows_borderless_malware_disclosure.ts b/packages/blog/compiled/windows_borderless_malware_disclosure.ts index cad84d9d4..b40204c1d 100644 --- a/packages/blog/compiled/windows_borderless_malware_disclosure.ts +++ b/packages/blog/compiled/windows_borderless_malware_disclosure.ts @@ -1,10 +1,11 @@ // AUTO-GENERATED FILE - DO NOT EDIT export const article = { - html: () => import(`./windows_borderless_malware_disclosure.content`).then((m) => m.html), - title: 'Malware Discovery Disclosure: "Windows Borderless" mod', - summary: 'Threat Analysis and Plan of Action', - date: '2024-05-07T20:00:00.000Z', - slug: 'windows-borderless-malware-disclosure', - authors: ['Dc7EYhxG', 'MpxzqsyW'], - thumbnail: true, -} + html: () => import(`./windows_borderless_malware_disclosure.content`).then(m => m.html), + title: "Malware Discovery Disclosure: \"Windows Borderless\" mod", + summary: "Threat Analysis and Plan of Action", + date: "2024-05-07T20:00:00.000Z", + slug: "windows-borderless-malware-disclosure", + authors: ["Dc7EYhxG","MpxzqsyW"], + thumbnail: true, + +}; diff --git a/packages/daedalus/.prettierignore b/packages/daedalus/.prettierignore new file mode 100644 index 000000000..ecc487ec4 --- /dev/null +++ b/packages/daedalus/.prettierignore @@ -0,0 +1 @@ +**/*.rs diff --git a/packages/daedalus/package.json b/packages/daedalus/package.json index b2ee389f8..5a972cf6a 100644 --- a/packages/daedalus/package.json +++ b/packages/daedalus/package.json @@ -1,9 +1,11 @@ { - "name": "@modrinth/daedalus", - "scripts": { - "build": "cargo build --release", - "lint": "cargo fmt --check && cargo clippy --all-targets", - "fix": "cargo clippy --all-targets --fix --allow-dirty && cargo fmt", - "test": "cargo nextest run --all-targets --no-fail-fast" - } + "name": "@modrinth/daedalus", + "scripts": { + "build": "cargo build --release", + "lint": "cargo fmt --check && cargo clippy --all-targets", + "lint:ancillary": "prettier --check .", + "fix": "cargo clippy --all-targets --fix --allow-dirty && cargo fmt", + "fix:ancillary": "prettier --write .", + "test": "cargo nextest run --all-targets --no-fail-fast" + } } diff --git a/packages/tooling-config/app-lib.prettier.config.cjs b/packages/tooling-config/app-lib.prettier.config.cjs new file mode 100644 index 000000000..9e4c77c9b --- /dev/null +++ b/packages/tooling-config/app-lib.prettier.config.cjs @@ -0,0 +1,27 @@ +/** + * @see https://prettier.io/docs/configuration + * @type {import("prettier").Config} + */ +module.exports = { + semi: false, + singleQuote: true, + plugins: ['prettier-plugin-toml', 'prettier-plugin-sql-cst', '@prettier/plugin-xml'], + overrides: [ + { + files: ['*.sql'], + options: { + parser: 'sqlite', + sqlAcceptUnsupportedGrammar: true, + }, + }, + { + files: ['*.jsonc'], + options: { + parser: 'jsonc', + // By spec, JSONC only extends JSON with comment support, not trailing commas as Prettier likes to add + trailingComma: 'none', + }, + }, + ], + xmlWhitespaceSensitivity: 'ignore', +} diff --git a/packages/tooling-config/eslint/base.mjs b/packages/tooling-config/eslint/base.mjs index 2348d2a7b..587ff5a16 100644 --- a/packages/tooling-config/eslint/base.mjs +++ b/packages/tooling-config/eslint/base.mjs @@ -3,18 +3,18 @@ import prettierEslint from 'eslint-plugin-prettier/recommended' import tseslint from 'typescript-eslint' export default tseslint.config( - eslint.configs.recommended, - tseslint.configs.recommendedTypeChecked, - prettierEslint, - ...common, - { - languageOptions: { - parserOptions: { - warnOnUnsupportedTypeScriptVersion: false, - }, - }, - }, - { - ignores: ['node_modules/', 'dist/', 'build/'], - }, + eslint.configs.recommended, + tseslint.configs.recommendedTypeChecked, + prettierEslint, + ...common, + { + languageOptions: { + parserOptions: { + warnOnUnsupportedTypeScriptVersion: false, + }, + }, + }, + { + ignores: ['node_modules/', 'dist/', 'build/'], + }, ) diff --git a/packages/tooling-config/eslint/common.mjs b/packages/tooling-config/eslint/common.mjs index e71e75a86..a9e900deb 100644 --- a/packages/tooling-config/eslint/common.mjs +++ b/packages/tooling-config/eslint/common.mjs @@ -1,20 +1,20 @@ import simpleImportSort from 'eslint-plugin-simple-import-sort' export default [ - { - plugins: { - 'simple-import-sort': simpleImportSort, - }, - rules: { - 'simple-import-sort/imports': 'error', - 'simple-import-sort/exports': 'error', - }, - }, - { - rules: { - '@typescript-eslint/no-type-alias': 'off', - '@typescript-eslint/ban-ts-comment': 'off', - '@typescript-eslint/prefer-literal-enum-member': 'off', - }, - }, + { + plugins: { + 'simple-import-sort': simpleImportSort, + }, + rules: { + 'simple-import-sort/imports': 'error', + 'simple-import-sort/exports': 'error', + }, + }, + { + rules: { + '@typescript-eslint/no-type-alias': 'off', + '@typescript-eslint/ban-ts-comment': 'off', + '@typescript-eslint/prefer-literal-enum-member': 'off', + }, + }, ] diff --git a/packages/tooling-config/eslint/nuxt.mjs b/packages/tooling-config/eslint/nuxt.mjs index cdb83aba7..9c323aa64 100644 --- a/packages/tooling-config/eslint/nuxt.mjs +++ b/packages/tooling-config/eslint/nuxt.mjs @@ -4,28 +4,28 @@ import turboPlugin from 'eslint-plugin-turbo' import common from './common.mjs' export const configurationNuxtToAppend = [ - ...common, - { - name: 'turbo', - plugins: { - turbo: fixupPluginRules(turboPlugin), - }, - rules: { - 'turbo/no-undeclared-env-vars': 'error', - }, - }, - { - name: 'modrinth', - rules: { - 'vue/html-self-closing': 'off', - 'vue/multi-word-component-names': 'off', - }, - languageOptions: { - parserOptions: { - warnOnUnsupportedTypeScriptVersion: false, - }, - }, - }, + ...common, + { + name: 'turbo', + plugins: { + turbo: fixupPluginRules(turboPlugin), + }, + rules: { + 'turbo/no-undeclared-env-vars': 'error', + }, + }, + { + name: 'modrinth', + rules: { + 'vue/html-self-closing': 'off', + 'vue/multi-word-component-names': 'off', + }, + languageOptions: { + parserOptions: { + warnOnUnsupportedTypeScriptVersion: false, + }, + }, + }, ] export default createConfigForNuxt().append(configurationNuxtToAppend) diff --git a/packages/tooling-config/frontend.prettier.config.cjs b/packages/tooling-config/frontend.prettier.config.cjs new file mode 100644 index 000000000..7805e64f3 --- /dev/null +++ b/packages/tooling-config/frontend.prettier.config.cjs @@ -0,0 +1,33 @@ +/** + * @see https://prettier.io/docs/configuration + * @type {import("prettier").Config} + */ +module.exports = { + semi: false, + singleQuote: true, + plugins: [ + // In typical JS/TS britleness fashion, the Tailwind CSS plugin + // has a transitive dependency on an import sort plugin that breaks + // TypeScript type annotations, for reasons unbeknownst to anyone. + // Our frontend project was the only one enabling such plugin, so + // to avoid this bug spreading to other parts of the monorepo, let's + // keep it contained to it. See: + // https://github.com/tailwindlabs/prettier-plugin-tailwindcss/issues/338 + // https://github.com/prettier/prettier-vscode/issues/3578 + 'prettier-plugin-tailwindcss', + 'prettier-plugin-toml', + 'prettier-plugin-sql-cst', + '@prettier/plugin-xml', + ], + overrides: [ + { + files: ['*.jsonc'], + options: { + parser: 'jsonc', + // By spec, JSONC only extends JSON with comment support, not trailing commas as Prettier likes to add + trailingComma: 'none', + }, + }, + ], + xmlWhitespaceSensitivity: 'ignore', +} diff --git a/packages/tooling-config/labrinth.prettier.config.cjs b/packages/tooling-config/labrinth.prettier.config.cjs new file mode 100644 index 000000000..8f18fcda6 --- /dev/null +++ b/packages/tooling-config/labrinth.prettier.config.cjs @@ -0,0 +1,27 @@ +/** + * @see https://prettier.io/docs/configuration + * @type {import("prettier").Config} + */ +module.exports = { + semi: false, + singleQuote: true, + plugins: ['prettier-plugin-toml', 'prettier-plugin-sql-cst', '@prettier/plugin-xml'], + overrides: [ + { + files: ['*.sql'], + options: { + parser: 'postgresql', + sqlAcceptUnsupportedGrammar: true, + }, + }, + { + files: ['*.jsonc'], + options: { + parser: 'jsonc', + // By spec, JSONC only extends JSON with comment support, not trailing commas as Prettier likes to add + trailingComma: 'none', + }, + }, + ], + xmlWhitespaceSensitivity: 'ignore', +} diff --git a/packages/tooling-config/package.json b/packages/tooling-config/package.json index 2e4d5323f..e4e7c66f8 100644 --- a/packages/tooling-config/package.json +++ b/packages/tooling-config/package.json @@ -1,35 +1,44 @@ { - "name": "@modrinth/tooling-config", - "version": "0.0.0", - "private": true, - "description": "Unified tooling configuration for Modrinth monorepo", - "main": "./index.js", - "exports": { - "./eslint/*": "./eslint/*", - "./typescript/*": "./typescript/*", - "./prettier.config.js": "./prettier.config.js", - "./prettier.nuxt.config.js": "./prettier.nuxt.config.js" - }, - "files": [ - "eslint/", - "typescript/", - "prettier/", - "index.js" - ], - "peerDependencies": { - "eslint": "^9.31.0", - "prettier": "^3.6.2", - "typescript": ">=5.0.0" - }, - "devDependencies": { - "@eslint/js": "^9.32.0", - "@vue/tsconfig": "^0.7.0", - "eslint": "^9.32.0", - "eslint-config-prettier": "^10.1.8", - "eslint-plugin-prettier": "^5.5.3", - "eslint-plugin-simple-import-sort": "^12.1.1", - "eslint-plugin-vue": "^10.4.0", - "globals": "^16.3.0", - "typescript-eslint": "^8.38.0" - } + "name": "@modrinth/tooling-config", + "version": "0.0.0", + "private": true, + "description": "Unified tooling configuration for Modrinth monorepo", + "main": "./index.js", + "scripts": { + "lint": "prettier --check .", + "fix": "prettier --write ." + }, + "exports": { + "./eslint/*": "./eslint/*", + "./typescript/*": "./typescript/*", + "./prettier.config.cjs": "./prettier.config.cjs", + "./frontend.prettier.config.cjs": "./frontend.prettier.config.cjs", + "./app-lib.prettier.config.cjs": "./app-lib.prettier.config.cjs", + "./labrinth.prettier.config.cjs": "./labrinth.prettier.config.cjs" + }, + "files": [ + "eslint/", + "typescript/", + "prettier/", + "index.js" + ], + "peerDependencies": { + "eslint": "^9.31.0", + "prettier": "^3.6.2", + "typescript": ">=5.0.0" + }, + "devDependencies": { + "@eslint/js": "^9.32.0", + "@prettier/plugin-xml": "^3.4.2", + "@vue/tsconfig": "^0.7.0", + "eslint": "^9.32.0", + "eslint-config-prettier": "^10.1.8", + "eslint-plugin-prettier": "^5.5.3", + "eslint-plugin-simple-import-sort": "^12.1.1", + "eslint-plugin-vue": "^10.4.0", + "globals": "^16.3.0", + "prettier-plugin-sql-cst": "^0.13.0", + "prettier-plugin-toml": "^2.0.6", + "typescript-eslint": "^8.38.0" + } } diff --git a/packages/tooling-config/prettier.config.cjs b/packages/tooling-config/prettier.config.cjs new file mode 100644 index 000000000..427e9dd33 --- /dev/null +++ b/packages/tooling-config/prettier.config.cjs @@ -0,0 +1,20 @@ +/** + * @see https://prettier.io/docs/configuration + * @type {import("prettier").Config} + */ +module.exports = { + semi: false, + singleQuote: true, + plugins: ['prettier-plugin-toml', 'prettier-plugin-sql-cst', '@prettier/plugin-xml'], + overrides: [ + { + files: ['*.jsonc'], + options: { + parser: 'jsonc', + // By spec, JSONC only extends JSON with comment support, not trailing commas as Prettier likes to add + trailingComma: 'none', + }, + }, + ], + xmlWhitespaceSensitivity: 'ignore', +} diff --git a/packages/tooling-config/prettier.config.js b/packages/tooling-config/prettier.config.js deleted file mode 100644 index fb7af3a74..000000000 --- a/packages/tooling-config/prettier.config.js +++ /dev/null @@ -1,10 +0,0 @@ -/** - * @see https://prettier.io/docs/configuration - * @type {import("prettier").Config} - */ -const config = { - semi: false, - singleQuote: true, -}; - -module.exports = config; \ No newline at end of file diff --git a/packages/tooling-config/prettier.nuxt.config.js b/packages/tooling-config/prettier.nuxt.config.js deleted file mode 100644 index 930bd65af..000000000 --- a/packages/tooling-config/prettier.nuxt.config.js +++ /dev/null @@ -1,11 +0,0 @@ -/** - * @see https://prettier.io/docs/configuration - * @type {import("prettier").Config} - */ -const config = { - semi: false, - singleQuote: true, - plugins: ["prettier-plugin-tailwindcss"] -}; - -module.exports = config; \ No newline at end of file diff --git a/packages/tooling-config/typescript/base.json b/packages/tooling-config/typescript/base.json index 5998c786a..49238f1b5 100644 --- a/packages/tooling-config/typescript/base.json +++ b/packages/tooling-config/typescript/base.json @@ -1,17 +1,17 @@ { - "$schema": "https://json.schemastore.org/tsconfig", - "compilerOptions": { - "target": "ES2020", - "module": "ESNext", - "moduleResolution": "bundler", - "strict": true, - "esModuleInterop": true, - "skipLibCheck": true, - "forceConsistentCasingInFileNames": true, - "resolveJsonModule": true, - "isolatedModules": true, - "noEmit": true, - "lib": ["esnext", "dom"], - "allowSyntheticDefaultImports": true - } + "$schema": "https://json.schemastore.org/tsconfig", + "compilerOptions": { + "target": "ES2020", + "module": "ESNext", + "moduleResolution": "bundler", + "strict": true, + "esModuleInterop": true, + "skipLibCheck": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "isolatedModules": true, + "noEmit": true, + "lib": ["esnext", "dom"], + "allowSyntheticDefaultImports": true + } } diff --git a/packages/tooling-config/typescript/vue.json b/packages/tooling-config/typescript/vue.json index 7c54fab90..aec16846e 100644 --- a/packages/tooling-config/typescript/vue.json +++ b/packages/tooling-config/typescript/vue.json @@ -1,9 +1,9 @@ { - "$schema": "https://json.schemastore.org/tsconfig", - "extends": "@vue/tsconfig/tsconfig.dom.json", - "compilerOptions": { - "lib": ["ESNext", "DOM"], - "moduleResolution": "bundler", - "noImplicitAny": false - } + "$schema": "https://json.schemastore.org/tsconfig", + "extends": "@vue/tsconfig/tsconfig.dom.json", + "compilerOptions": { + "lib": ["ESNext", "DOM"], + "moduleResolution": "bundler", + "noImplicitAny": false + } } diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 92fb8dae1..f49ee444a 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -465,6 +465,9 @@ importers: '@eslint/js': specifier: ^9.32.0 version: 9.32.0 + '@prettier/plugin-xml': + specifier: ^3.4.2 + version: 3.4.2(prettier@3.6.2) '@vue/tsconfig': specifier: ^0.7.0 version: 0.7.0(typescript@5.8.3)(vue@3.5.13(typescript@5.8.3)) @@ -486,6 +489,12 @@ importers: globals: specifier: ^16.3.0 version: 16.3.0 + prettier-plugin-sql-cst: + specifier: ^0.13.0 + version: 0.13.0 + prettier-plugin-toml: + specifier: ^2.0.6 + version: 2.0.6(prettier@3.6.2) typescript-eslint: specifier: ^8.38.0 version: 8.38.0(eslint@9.32.0(jiti@2.5.1))(typescript@5.8.3) @@ -2161,6 +2170,11 @@ packages: '@polka/url@1.0.0-next.25': resolution: {integrity: sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==} + '@prettier/plugin-xml@3.4.2': + resolution: {integrity: sha512-/UyNlHfkuLXG6Ed85KB0WBF283xn2yavR+UtRibBRUcvEJId2DSLdGXwJ/cDa1X++SWDPzq3+GSFniHjkNy7yg==} + peerDependencies: + prettier: ^3.0.0 + '@readme/better-ajv-errors@1.6.0': resolution: {integrity: sha512-9gO9rld84Jgu13kcbKRU+WHseNhaVt76wYMeRDGsUGYxwJtI3RmEJ9LY9dZCYQGI8eUZLuxb5qDja0nqklpFjQ==} engines: {node: '>=14'} @@ -2536,6 +2550,12 @@ packages: peerDependencies: vue: ^3.0.0 + '@taplo/core@0.2.0': + resolution: {integrity: sha512-r8bl54Zj1In3QLkiW/ex694bVzpPJ9EhwqT9xkcUVODnVUGirdB1JTsmiIv0o1uwqZiwhi8xNnTOQBRQCpizrQ==} + + '@taplo/lib@0.5.0': + resolution: {integrity: sha512-+xIqpQXJco3T+VGaTTwmhxLa51qpkQxCjRwezjFZgr+l21ExlywJFcDfTrNmL6lG6tqb0h8GyJKO3UPGPtSCWg==} + '@tauri-apps/api@2.5.0': resolution: {integrity: sha512-Ldux4ip+HGAcPUmuLT8EIkk6yafl5vK0P0c0byzAKzxJh7vxelVtdPONjfgTm96PbN24yjZNESY8CKo8qniluA==} @@ -3191,6 +3211,9 @@ packages: '@webgpu/types@0.1.54': resolution: {integrity: sha512-81oaalC8LFrXjhsczomEQ0u3jG+TqE6V9QHLA8GNZq/Rnot0KDugu3LhSYSlie8tSdooAN1Hov05asrUUp9qgg==} + '@xml-tools/parser@1.0.11': + resolution: {integrity: sha512-aKqQ077XnR+oQtHJlrAflaZaL7qZsulWc/i/ZEooar5JiWj1eLt0+Wg28cpa+XLney107wXqneC+oG1IZvxkTA==} + '@xtuc/ieee754@1.2.0': resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} @@ -3560,6 +3583,9 @@ packages: character-reference-invalid@2.0.1: resolution: {integrity: sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==} + chevrotain@7.1.1: + resolution: {integrity: sha512-wy3mC1x4ye+O+QkEinVJkPf5u2vsrDIYW9G7ZuwFl6v/Yu0LwUuT2POsb+NUWApebyxfkQq6+yDfRExbnI5rcw==} + chokidar@3.6.0: resolution: {integrity: sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==} engines: {node: '>= 8.10.0'} @@ -6357,6 +6383,9 @@ packages: resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} engines: {node: '>=6.0.0'} + prettier-plugin-sql-cst@0.13.0: + resolution: {integrity: sha512-F2NMvK/yD4BooQsNce8yyOjY5wWxJCpwaMfQEQCqkwFUmsvRsH5STGIgQILjbA1iwOsvYsJzRAEEl4hqp0aDRQ==} + prettier-plugin-tailwindcss@0.6.5: resolution: {integrity: sha512-axfeOArc/RiGHjOIy9HytehlC0ZLeMaqY09mm8YCkMzznKiDkwFzOpBvtuhuv3xG5qB73+Mj7OCe2j/L1ryfuQ==} engines: {node: '>=14.21.3'} @@ -6409,6 +6438,12 @@ packages: prettier-plugin-svelte: optional: true + prettier-plugin-toml@2.0.6: + resolution: {integrity: sha512-12N/wBuHa9jd/KVy9pRP20NMKxQfQLMseQCt66lIbLaPLItvGUcSIryE1eZZMJ7loSws6Ig3M2Elc2EreNh76w==} + engines: {node: '>=16.0.0'} + peerDependencies: + prettier: ^3.0.3 + prettier@2.8.7: resolution: {integrity: sha512-yPngTo3aXUUmyuTjeTUT75txrf+aMh9FiD7q9ZE/i6r0bPb22g4FsE6Y338PQX1bmfy08i9QQCB7/rcUAVntfw==} engines: {node: '>=10.13.0'} @@ -6570,6 +6605,9 @@ packages: resolution: {integrity: sha512-sZuz1dYW/ZsfG17WSAG7eS85r5a0dDsvg+7BiiYR5o6lKCAtUrEwdmRmaGF6rwVj3LcmAeYkOWKEPlbPzN3Y3A==} engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + regexp-to-ast@0.5.0: + resolution: {integrity: sha512-tlbJqcMHnPKI9zSrystikWKwHkBqu2a/Sgw01h3zFjvYrMxEDYHzzoMZnUrbIfpTFEsoRnnviOXNCzFiSc54Qw==} + regexp-tree@0.1.27: resolution: {integrity: sha512-iETxpjK6YoRWJG5o6hXLwvjYAoW+FEZn9os0PD/b6AP6xQwsa/Y7lCVgIixBbUPMfhu+i2LtdeAqVTgGlQarfA==} hasBin: true @@ -6932,6 +6970,9 @@ packages: sprintf-js@1.0.3: resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + sql-parser-cst@0.33.1: + resolution: {integrity: sha512-7PHLI98bo86S740GQWlerh9GHu10dbMqDo1jBCXVlGB/nc55WgIAeoVrp0jzgK+WikycE9iGUUKkSuFNxj8w3Q==} + stable-hash@0.0.4: resolution: {integrity: sha512-LjdcbuBeLcdETCrPn9i8AYAZ1eCtu4ECAWtP7UleOiZ9LzVxRzzUZEoZ8zB24nhkQnDWyET0I+3sWokSDS3E7g==} @@ -9894,6 +9935,11 @@ snapshots: '@polka/url@1.0.0-next.25': {} + '@prettier/plugin-xml@3.4.2(prettier@3.6.2)': + dependencies: + '@xml-tools/parser': 1.0.11 + prettier: 3.6.2 + '@readme/better-ajv-errors@1.6.0(ajv@8.17.1)': dependencies: '@babel/code-frame': 7.26.2 @@ -10253,6 +10299,12 @@ snapshots: dependencies: vue: 3.5.13(typescript@5.5.4) + '@taplo/core@0.2.0': {} + + '@taplo/lib@0.5.0': + dependencies: + '@taplo/core': 0.2.0 + '@tauri-apps/api@2.5.0': {} '@tauri-apps/api@2.6.0': {} @@ -11223,6 +11275,10 @@ snapshots: '@webgpu/types@0.1.54': {} + '@xml-tools/parser@1.0.11': + dependencies: + chevrotain: 7.1.1 + '@xtuc/ieee754@1.2.0': optional: true @@ -11704,6 +11760,10 @@ snapshots: character-reference-invalid@2.0.1: {} + chevrotain@7.1.1: + dependencies: + regexp-to-ast: 0.5.0 + chokidar@3.6.0: dependencies: anymatch: 3.1.3 @@ -15227,10 +15287,20 @@ snapshots: dependencies: fast-diff: 1.3.0 + prettier-plugin-sql-cst@0.13.0: + dependencies: + prettier: 3.6.2 + sql-parser-cst: 0.33.1 + prettier-plugin-tailwindcss@0.6.5(prettier@3.6.2): dependencies: prettier: 3.6.2 + prettier-plugin-toml@2.0.6(prettier@3.6.2): + dependencies: + '@taplo/lib': 0.5.0 + prettier: 3.6.2 + prettier@2.8.7: optional: true @@ -15410,6 +15480,8 @@ snapshots: '@eslint-community/regexpp': 4.11.0 refa: 0.12.1 + regexp-to-ast@0.5.0: {} + regexp-tree@0.1.27: {} regjsparser@0.10.0: @@ -15936,6 +16008,8 @@ snapshots: sprintf-js@1.0.3: {} + sql-parser-cst@0.33.1: {} + stable-hash@0.0.4: {} standard-as-callback@2.1.0: {} diff --git a/turbo.jsonc b/turbo.jsonc index 77696a173..b9aeb835d 100644 --- a/turbo.jsonc +++ b/turbo.jsonc @@ -1,66 +1,70 @@ { - "$schema": "./node_modules/turbo/schema.json", - "concurrency": "100%", - "tasks": { - "build": { - "dependsOn": ["^build"], - "inputs": ["$TURBO_DEFAULT$", ".env*"], - "outputs": [".nuxt/**", "dist/**", ".output/**", "$TURBO_ROOT$/target/**"], - "env": [ - "NODE_ENV", - "SITE_URL", - "BASE_URL", - "FLAG_OVERRIDES", - "BROWSER_BASE_URL", - "RATE_LIMIT_IGNORE_KEY", - "VERCEL_*", - "CF_PAGES_*", - "HEROKU_APP_NAME", - "STRIPE_PUBLISHABLE_KEY", - "PYRO_BASE_URL", - "PROD_OVERRIDE", - "PYRO_MASTER_KEY", - "PORT", - "SQLX_OFFLINE", - "DATABASE_URL", - "CARGO_*", - "RUST_*", - "RUSTFLAGS", - "FORCE_COLOR", - "NEXTEST_*" - ] - }, - "lint": { - "env": [ - "DATABASE_URL", - "SQLX_OFFLINE", - "CARGO_*", - "RUST_*", - "RUSTFLAGS", - "FORCE_COLOR", - "NEXTEST_*" - ] - }, - "dev": { - "cache": false, - "persistent": true, - "inputs": ["$TURBO_DEFAULT$", ".env*"], - "env": ["CARGO_*", "RUST_*", "RUSTFLAGS", "FORCE_COLOR", "NEXTEST_*"], - "passThroughEnv": ["DISPLAY", "WEBKIT_DISABLE_DMABUF_RENDERER"] - }, - "test": { - "env": [ - "SQLX_OFFLINE", - "DATABASE_URL", - "CARGO_*", - "RUST_*", - "RUSTFLAGS", - "FORCE_COLOR", - "NEXTEST_*" - ] - }, - "fix": { - "cache": false - } - } + "$schema": "./node_modules/turbo/schema.json", + "concurrency": "100%", + "tasks": { + "build": { + "dependsOn": ["^build"], + "inputs": ["$TURBO_DEFAULT$", ".env*"], + "outputs": [".nuxt/**", "dist/**", ".output/**", "$TURBO_ROOT$/target/**"], + "env": [ + "NODE_ENV", + "SITE_URL", + "BASE_URL", + "FLAG_OVERRIDES", + "BROWSER_BASE_URL", + "RATE_LIMIT_IGNORE_KEY", + "VERCEL_*", + "CF_PAGES_*", + "HEROKU_APP_NAME", + "STRIPE_PUBLISHABLE_KEY", + "PYRO_BASE_URL", + "PROD_OVERRIDE", + "PYRO_MASTER_KEY", + "PORT", + "SQLX_OFFLINE", + "DATABASE_URL", + "CARGO_*", + "RUST_*", + "RUSTFLAGS", + "FORCE_COLOR", + "NEXTEST_*" + ] + }, + "lint": { + "env": [ + "DATABASE_URL", + "SQLX_OFFLINE", + "CARGO_*", + "RUST_*", + "RUSTFLAGS", + "FORCE_COLOR", + "NEXTEST_*" + ] + }, + "lint:ancillary": {}, + "dev": { + "cache": false, + "persistent": true, + "inputs": ["$TURBO_DEFAULT$", ".env*"], + "env": ["CARGO_*", "RUST_*", "RUSTFLAGS", "FORCE_COLOR", "NEXTEST_*"], + "passThroughEnv": ["DISPLAY", "WEBKIT_DISABLE_DMABUF_RENDERER"] + }, + "test": { + "env": [ + "SQLX_OFFLINE", + "DATABASE_URL", + "CARGO_*", + "RUST_*", + "RUSTFLAGS", + "FORCE_COLOR", + "NEXTEST_*" + ] + }, + "fix": { + "cache": false + }, + "fix:ancillary": { + "cache": false + } + } } diff --git a/web-types.json b/web-types.json index 3c360b37a..2c5557994 100644 --- a/web-types.json +++ b/web-types.json @@ -1,18 +1,18 @@ { - "$schema": "https://raw.githubusercontent.com/JetBrains/web-types/master/v2-preview/web-types.json", - "name": "modrinth-monorepo-web-types", - "framework": "vue", - "version": "1.0.0", - "contributions": { - "html": { - "vue-directives": [ - { - "name": "tooltip", - "description": "Floating Vue tooltip directive", - "doc-url": "https://floating-vue.starpad.dev/guide/directive#directive", - "argument": "tooltip" - } - ] - } - } + "$schema": "https://raw.githubusercontent.com/JetBrains/web-types/master/v2-preview/web-types.json", + "name": "modrinth-monorepo-web-types", + "framework": "vue", + "version": "1.0.0", + "contributions": { + "html": { + "vue-directives": [ + { + "name": "tooltip", + "description": "Floating Vue tooltip directive", + "doc-url": "https://floating-vue.starpad.dev/guide/directive#directive", + "argument": "tooltip" + } + ] + } + } }