Skip to content
Merged
Show file tree
Hide file tree
Changes from 27 commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
8cf32d1
starting on new checklist implementation
coolbot100s Jul 11, 2025
142aa4c
misc fixes + corrections
coolbot100s Jul 11, 2025
d8c5694
Add clickable link previews to links stage
coolbot100s Jul 11, 2025
83ec246
Correct mislabeled title message and add new title messages
coolbot100s Jul 12, 2025
d74923f
Change message formatting, use rules variable, correct wip desc and t…
coolbot100s Jul 12, 2025
77715d0
More applications of rules placeholder
coolbot100s Jul 12, 2025
9b485b9
Add new status alerts stage
coolbot100s Jul 12, 2025
100b642
change order of statusAlerts
coolbot100s Jul 13, 2025
d0fa098
Merge branch 'main' into coolbot/dev-150-checklist-v1.5
IMB11 Jul 13, 2025
15b49ee
Update title related messages, add navigation based vars
coolbot100s Jul 14, 2025
95540e7
Overhaul Links stage and add new messages.
coolbot100s Jul 14, 2025
843af1d
Set message weights, add some disables
coolbot100s Jul 14, 2025
9473b02
message.mds now obey lint >:(
coolbot100s Jul 14, 2025
fce2c96
Merge branch 'main' into coolbot/dev-150-checklist-v1.5
coolbot100s Jul 14, 2025
2536f04
fixed links text message formatting and changed an icon
coolbot100s Jul 14, 2025
baeb4c6
Combine title and slug stages
coolbot100s Jul 14, 2025
355e364
Add more info to some stages and properly case stage ids
coolbot100s Jul 14, 2025
6e97e3b
tweak summary text formatting
coolbot100s Jul 14, 2025
9f7a80a
Improved tags stage info and more navigation placeholders
coolbot100s Jul 14, 2025
8c7ed91
redo reupload stage, more navigation placeholders, licensing stage im…
coolbot100s Jul 15, 2025
46459f9
Allow modpack permissions stage to appear again by adding a dummy but…
coolbot100s Jul 15, 2025
e0d381b
Update modpack permissions guidance
coolbot100s Jul 15, 2025
507001b
Merge branch 'main' into coolbot/dev-150-checklist-v1.5
coolbot100s Jul 15, 2025
344422d
fix: blog path issues
IMB11 Jul 15, 2025
b56ab60
fix: lint issues
IMB11 Jul 15, 2025
b70b3a7
fix license stage text formatting
coolbot100s Jul 15, 2025
29d2d1b
Improve license stage
coolbot100s Jul 15, 2025
23c69e7
feat: move links into one md file to be cleaner
IMB11 Jul 16, 2025
0f38a6c
Update packages/moderation/data/stages/links.ts
IMB11 Jul 16, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -464,7 +464,7 @@ const stageTextExpanded = computedAsync(async () => {
const stage = checklist[stageIndex];
if (stage.text) {
return renderHighlightedString(
expandVariables(await stage.text(), props.project, variables.value),
expandVariables(await stage.text(props.project), props.project, variables.value),
);
}
return null;
Expand Down Expand Up @@ -980,6 +980,18 @@ async function processAction(
}

function shouldShowStage(stage: Stage): boolean {
let hasVisibleActions = false;

for (const a of stage.actions) {
if (shouldShowAction(a)) {
hasVisibleActions = true;
}
}

if (!hasVisibleActions) {
return false;
}

if (typeof stage.shouldShow === "function") {
return stage.shouldShow(props.project);
}
Expand Down
14 changes: 7 additions & 7 deletions apps/frontend/src/public/news/feed/articles.json
Original file line number Diff line number Diff line change
Expand Up @@ -98,20 +98,20 @@
"date": "2023-02-01T20:00:00.000Z",
"link": "https://modrinth.com/news/article/accelerating-development"
},
{
"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": "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.",
Expand Down
30 changes: 15 additions & 15 deletions apps/frontend/src/public/news/feed/rss.xml

Large diffs are not rendered by default.

1 change: 1 addition & 0 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
"app:build": "turbo run build --filter=@modrinth/app",
"app:fix": "turbo run fix --filter=@modrinth/app",
"app:intl:extract": "pnpm run --filter=@modrinth/app-frontend intl:extract",
"blog:fix": "turbo run fix --filter=@modrinth/blog",
"pages:build": "NITRO_PRESET=cloudflare-pages pnpm --filter frontend run build",
"build": "turbo run build --continue",
"lint": "turbo run lint --continue",
Expand Down
16 changes: 8 additions & 8 deletions packages/blog/check.ts
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
import { promises as fs } from 'fs'
import * as path from 'path'
import fastGlob from 'fast-glob'
import { repoPath, toVarName } from './utils'
import { glob } from 'glob'

import { PUBLIC_SRC, PUBLIC_LOCATIONS, ARTICLES_GLOB, COMPILED_DIR } from './blog.config'

async function checkPublicAssets() {
const srcFiles = await fastGlob(['**/*'], { cwd: PUBLIC_SRC, dot: true })
const srcFiles = await glob('**/*', { cwd: PUBLIC_SRC, dot: true })
let allOk = true
for (const target of PUBLIC_LOCATIONS) {
for (const relativeFile of srcFiles) {
const shouldExist = path.join(target, relativeFile)
const shouldExist = path.posix.join(target, relativeFile)
try {
await fs.access(shouldExist)
} catch {
Expand All @@ -26,15 +26,15 @@ async function checkPublicAssets() {
}

async function checkCompiledArticles() {
const mdFiles = await fastGlob([ARTICLES_GLOB])
const compiledFiles = await fastGlob([`${COMPILED_DIR}/*.ts`])
const mdFiles = await glob(ARTICLES_GLOB)
const compiledFiles = await glob(`${COMPILED_DIR}/*.ts`)
const compiledVarNames = compiledFiles.map((f) => path.basename(f, '.ts'))

// Check all .md have compiled .ts and .content.ts and the proper public thumbnail
for (const file of mdFiles) {
const varName = toVarName(path.basename(file, '.md'))
const compiledPath = path.join(COMPILED_DIR, varName + '.ts')
const contentPath = path.join(COMPILED_DIR, varName + '.content.ts')
const compiledPath = path.posix.join(COMPILED_DIR, varName + '.ts')
const contentPath = path.posix.join(COMPILED_DIR, varName + '.content.ts')
if (!compiledVarNames.includes(varName)) {
console.error(`⚠️ Missing compiled article for: ${file} (should be: ${compiledPath})`)
process.exit(1)
Expand All @@ -59,7 +59,7 @@ async function checkCompiledArticles() {
if (varName === 'index' || varName.endsWith('.content')) continue

const mdPathGlob = repoPath(`packages/blog/articles/**/${varName.replace(/_/g, '*')}.md`)
const found = await fastGlob([mdPathGlob])
const found = await glob(mdPathGlob)
if (!found.length) {
console.error(`❌ Compiled article ${compiled} has no matching markdown source!`)
process.exit(1)
Expand Down
12 changes: 6 additions & 6 deletions packages/blog/compile.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import { promises as fs } from 'fs'
import * as path from 'path'
import fg from 'fast-glob'
import matter from 'gray-matter'
import { md } from '@modrinth/utils'
import { minify } from 'html-minifier-terser'
import { copyDir, toVarName } from './utils'
import RSS from 'rss'
import { parseStringPromise } from 'xml2js'
import { glob } from 'glob'

import {
ARTICLES_GLOB,
Expand All @@ -24,7 +24,7 @@ async function ensureCompiledDir() {
}

async function hasThumbnail(slug: string): Promise<boolean> {
const thumbnailPath = path.join(PUBLIC_SRC, slug, 'thumbnail.webp')
const thumbnailPath = path.posix.join(PUBLIC_SRC, slug, 'thumbnail.webp')
try {
await fs.access(thumbnailPath)
return true
Expand All @@ -48,7 +48,7 @@ function getThumbnailUrl(slug: string, hasThumb: boolean): string {
async function compileArticles() {
await ensureCompiledDir()

const files = await fg([ARTICLES_GLOB])
const files = await glob(ARTICLES_GLOB)
console.log(`🔎 Found ${files.length} markdown articles!`)
const articleExports: string[] = []
const articlesArray: string[] = []
Expand All @@ -75,8 +75,8 @@ async function compileArticles() {

const slug = frontSlug || path.basename(file, '.md')
const varName = toVarName(slug)
const exportFile = path.join(COMPILED_DIR, `${varName}.ts`)
const contentFile = path.join(COMPILED_DIR, `${varName}.content.ts`)
const exportFile = path.posix.join(COMPILED_DIR, `${varName}.ts`)
const contentFile = path.posix.join(COMPILED_DIR, `${varName}.content.ts`)
const thumbnailPresent = await hasThumbnail(slug)

const contentTs = `
Expand Down Expand Up @@ -221,7 +221,7 @@ async function deleteDirContents(dir: string) {
const entries = await fs.readdir(dir, { withFileTypes: true })
await Promise.all(
entries.map(async (entry) => {
const fullPath = path.join(dir, entry.name)
const fullPath = path.posix.join(dir, entry.name)
if (entry.isDirectory()) {
await fs.rm(fullPath, { recursive: true, force: true })
} else {
Expand Down
100 changes: 50 additions & 50 deletions packages/blog/compiled/index.ts
Original file line number Diff line number Diff line change
@@ -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_history } from './two_years_of_modrinth_history'
import { article as two_years_of_modrinth } from './two_years_of_modrinth'
import { article as whats_modrinth } from './whats_modrinth'
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 = [
a_new_chapter_for_modrinth_servers,
accelerating_development,
becoming_sustainable,
capital_return,
carbon_ads,
creator_monetization,
creator_update,
creator_updates_july_2025,
design_refresh,
download_adjustment,
knossos_v2_1_0,
licensing_guide,
modpack_changes,
modpacks_alpha,
modrinth_app_beta,
modrinth_beta,
modrinth_servers_beta,
new_site_beta,
plugins_resource_packs,
pride_campaign_2025,
redesign,
skins_now_in_modrinth_app,
two_years_of_modrinth_history,
two_years_of_modrinth,
whats_modrinth,
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,
]
3 changes: 2 additions & 1 deletion packages/blog/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
"fix": "jiti ./compile.ts && eslint . --fix && prettier --write ."
},
"devDependencies": {
"@types/glob": "^9.0.0",
"@types/html-minifier-terser": "^7.0.2",
"@types/rss": "^0.0.32",
"@types/xml2js": "^0.4.14",
Expand All @@ -19,7 +20,7 @@
},
"dependencies": {
"@modrinth/utils": "workspace:*",
"fast-glob": "^3.3.3",
"glob": "^10.2.7",
"gray-matter": "^4.0.3",
"html-minifier-terser": "^7.2.0",
"rss": "^1.2.2",
Expand Down
6 changes: 3 additions & 3 deletions packages/blog/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ export function getRepoRoot(): string {
}

export function repoPath(...segments: string[]): string {
return path.join(getRepoRoot(), ...segments)
return path.posix.join(getRepoRoot(), ...segments)
}

export async function copyDir(
Expand All @@ -20,8 +20,8 @@ export async function copyDir(
await fs.mkdir(dest, { recursive: true })
const entries = await fs.readdir(src, { withFileTypes: true })
for (const entry of entries) {
const srcPath = path.join(src, entry.name)
const destPath = path.join(dest, entry.name)
const srcPath = path.posix.join(src, entry.name)
const destPath = path.posix.join(dest, entry.name)
if (entry.isDirectory()) {
await copyDir(srcPath, destPath, logFn)
} else if (entry.isFile()) {
Expand Down
16 changes: 10 additions & 6 deletions packages/moderation/data/checklist.ts
Original file line number Diff line number Diff line change
@@ -1,28 +1,32 @@
import type { Stage } from '../types/stage'
import modpackPermissionsStage from './modpack-permissions-stage'
import categories from './stages/categories'
import copyright from './stages/copyright'
import reupload from './stages/reupload'
import description from './stages/description'
import gallery from './stages/gallery'
import links from './stages/links'
import ruleFollowing from './stages/rule-following'
import sideTypes from './stages/side-types'
import slug from './stages/slug'
import summary from './stages/summary'
import title from './stages/title'
import titleSlug from './stages/title-slug'
import versions from './stages/versions'
import license from './stages/license'
import undefinedProject from './stages/undefined-project'
import statusAlerts from './stages/status-alerts'

export default [
title,
slug,
titleSlug,
summary,
description,
links,
license,
categories,
sideTypes,
gallery,
versions,
copyright,
reupload,
ruleFollowing,
modpackPermissionsStage,
statusAlerts,
undefinedProject,
] as ReadonlyArray<Stage>
2 changes: 1 addition & 1 deletion packages/moderation/data/messages/categories/inaccurate.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
## Misuse of Tags

Per section 5.1 of [Modrinth's Content Rules](https://modrinth.com/legal/rules#miscellaneous), it is important that the metadata of your projects is accurate. Including that selected tags honestly represent your project.
Per section 5.1 of %RULES%, it is important that the metadata of your projects is accurate. Including that selected tags honestly represent your project.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
It looks like the Optimization tag is not accurate for this project.
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
Currently, your pack has multiple Resolutions selected, in most cases, this will misrepresent your project.
For a brief rundown of how this works:
Vanilla Minecraft textures like blocks and items have a width and height of 16 pixels.
This means that packs with textures the same size as the default are considered 16x.
Some packs make the resolution of textures smaller than the default, such as 8x, and some bigger, such as 32x.
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
**Featured Tags:** %PROJECT_CATEGORIES% \
**Additional Tags:** %PROJECT_ADDITIONAL_CATEGORIES%
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
**License id:** %PROJECT_LICENSE_ID% \
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
**License Link:** %PROJECT_LICENSE_URL%
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
**Discord:** %PROJECT_DISCORD_URL%
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
> **{PLATFORM}:** {URL}
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
<u>**Donation Links:**</u>
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
**Issues:** %PROJECT_ISSUES_URL%
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
**Source:** %PROJECT_SOURCE_URL%
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
**Wiki:** %PROJECT_WIKI_URL%
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
**Applying for:** `%PROJECT_REQUESTED_STATUS%`
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
**Summary:**
`%PROJECT_SUMMARY%`
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
**Title:** %PROJECT_TITLE% \
**Slug:** `%PROJECT_SLUG%`

**Title issues?**
5 changes: 2 additions & 3 deletions packages/moderation/data/messages/description/insufficient.md
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
## Insufficient Description

Per section 2.1 of [Modrinth's Content Rules](https://modrinth.com/legal/rules#general-expectations) your project's Description should clearly inform the reader of the content, purpose, and appeal of your project.
Per section 2.1 of %RULES% your project's Description should clearly inform the reader of the content, purpose, and appeal of your project.

Currently, it looks like there are some missing details.

> %EXPLAINER%
%EXPLAINER%
Loading