feat: DEV-99 blog migration (#3870)

* feat: blog migration w/ fixes

Co-authored-by: Prospector <prospectordev@gmail.com>

* feat: add changelog button to news page

* fix: lint issues

* refactor: replace nuxt content with `@modrinth/blog`

* feat: shared public folder

* feat: try lazy loading html content

* feat: rss + hide newsletter btn + blog.config.ts

* feat: add new chapter modrinth servers post

* fix: lint issues

* fix: only generate RSS feed if changes detected

* fix: utils dep

* fix: lockfile dep

* feat: GET /email/subscribe + subscription button

* fix: lint issues

* feat: articles.json for app

* Made grid more responsive

* fix: changes

* Make margin slightly smaller in lists

* Fix footer link

* feat: latest news

* Fix responsiveness

* Remove old utm link

* Update changelog

* Lint

---------

Co-authored-by: Prospector <prospectordev@gmail.com>
This commit is contained in:
IMB11 2025-07-01 02:59:08 +01:00 committed by GitHub
parent fdb2b1195e
commit eef09e1ffe
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
220 changed files with 5094 additions and 681 deletions

View File

@ -188,7 +188,7 @@ async function setupApp() {
) )
}) })
useFetch(`https://modrinth.com/blog/news.json`, 'news', true).then((res) => { useFetch(`https://modrinth.com/news/feed/articles.json`, 'news', true).then((res) => {
if (res && res.articles) { if (res && res.articles) {
news.value = res.articles news.value = res.articles
} }

View File

@ -68,7 +68,7 @@
Support: https://support.modrinth.com Support: https://support.modrinth.com
Status page: https://status.modrinth.com Status page: https://status.modrinth.com
Roadmap: https://roadmap.modrinth.com Roadmap: https://roadmap.modrinth.com
Blog and newsletter: https://blog.modrinth.com/subscribe?utm_medium=social&utm_source=discord&utm_campaign=welcome Blog and newsletter: https://modrinth.com/news
API documentation: https://docs.modrinth.com API documentation: https://docs.modrinth.com
Modrinth source code: https://github.com/modrinth Modrinth source code: https://github.com/modrinth
Help translate Modrinth: https://crowdin.com/project/modrinth Help translate Modrinth: https://crowdin.com/project/modrinth

View File

@ -40,7 +40,9 @@
"@modrinth/assets": "workspace:*", "@modrinth/assets": "workspace:*",
"@modrinth/ui": "workspace:*", "@modrinth/ui": "workspace:*",
"@modrinth/utils": "workspace:*", "@modrinth/utils": "workspace:*",
"@modrinth/blog": "workspace:*",
"@pinia/nuxt": "^0.5.1", "@pinia/nuxt": "^0.5.1",
"@types/three": "^0.172.0",
"@vintl/vintl": "^4.4.1", "@vintl/vintl": "^4.4.1",
"@vueuse/core": "^11.1.0", "@vueuse/core": "^11.1.0",
"ace-builds": "^1.36.2", "ace-builds": "^1.36.2",
@ -59,7 +61,6 @@
"qrcode.vue": "^3.4.0", "qrcode.vue": "^3.4.0",
"semver": "^7.5.4", "semver": "^7.5.4",
"three": "^0.172.0", "three": "^0.172.0",
"@types/three": "^0.172.0",
"vue-multiselect": "3.0.0-alpha.2", "vue-multiselect": "3.0.0-alpha.2",
"vue-typed-virtual-list": "^1.0.10", "vue-typed-virtual-list": "^1.0.10",
"vue3-ace-editor": "^2.2.4", "vue3-ace-editor": "^2.2.4",

View File

@ -0,0 +1,51 @@
<script setup lang="ts">
import { ButtonStyled } from "@modrinth/ui";
import { MailIcon, CheckIcon } from "@modrinth/assets";
import { ref, watchEffect } from "vue";
import { useBaseFetch } from "~/composables/fetch.js";
const auth = await useAuth();
const showSubscriptionConfirmation = ref(false);
const subscribed = ref(false);
async function checkSubscribed() {
if (auth.value?.user) {
try {
const { data } = await useBaseFetch("auth/email/subscribe", {
method: "GET",
});
subscribed.value = data?.subscribed || false;
} catch {
subscribed.value = false;
}
}
}
watchEffect(() => {
checkSubscribed();
});
async function subscribe() {
try {
await useBaseFetch("auth/email/subscribe", {
method: "POST",
});
showSubscriptionConfirmation.value = true;
} catch {
} finally {
setTimeout(() => {
showSubscriptionConfirmation.value = false;
subscribed.value = true;
}, 2500);
}
}
</script>
<template>
<ButtonStyled v-if="auth?.user && !subscribed" color="brand" type="outlined">
<button v-tooltip="`Subscribe to the Modrinth newsletter`" @click="subscribe">
<template v-if="!showSubscriptionConfirmation"> <MailIcon /> Subscribe </template>
<template v-else> <CheckIcon /> Subscribed! </template>
</button>
</ButtonStyled>
</template>

View File

@ -0,0 +1,86 @@
<template>
<div class="flex gap-2">
<ButtonStyled circular>
<a
v-tooltip="`Share on Bluesky`"
:href="`https://bsky.app/intent/compose?text=${encodedUrl}`"
target="_blank"
>
<BlueskyIcon />
</a>
</ButtonStyled>
<ButtonStyled circular>
<a
v-tooltip="`Share on Mastodon`"
:href="`https://tootpick.org/#text=${encodedUrl}`"
target="_blank"
>
<MastodonIcon />
</a>
</ButtonStyled>
<ButtonStyled circular>
<a
v-tooltip="`Share on X`"
:href="`https://www.x.com/intent/post?url=${encodedUrl}`"
target="_blank"
>
<TwitterIcon />
</a>
</ButtonStyled>
<ButtonStyled circular>
<a
v-tooltip="`Share via email`"
:href="`mailto:${encodedTitle ? `?subject=${encodedTitle}&` : `?`}body=${encodedUrl}`"
target="_blank"
>
<MailIcon />
</a>
</ButtonStyled>
<ButtonStyled circular>
<button
v-tooltip="copied ? `Copied to clipboard` : `Copy link`"
:disabled="copied"
class="relative grid place-items-center overflow-hidden"
@click="copyToClipboard(url)"
>
<CheckIcon
class="absolute transition-all ease-in-out"
:class="copied ? 'translate-y-0' : 'translate-y-7'"
/>
<LinkIcon
class="absolute transition-all ease-in-out"
:class="copied ? '-translate-y-7' : 'translate-y-0'"
/>
</button>
</ButtonStyled>
</div>
</template>
<script setup lang="ts">
import {
BlueskyIcon,
CheckIcon,
LinkIcon,
MailIcon,
MastodonIcon,
TwitterIcon,
} from "@modrinth/assets";
import { ButtonStyled } from "@modrinth/ui";
const props = defineProps<{
title?: string;
url: string;
}>();
const copied = ref(false);
const encodedUrl = computed(() => encodeURIComponent(props.url));
const encodedTitle = computed(() => (props.title ? encodeURIComponent(props.title) : undefined));
async function copyToClipboard(text: string) {
await navigator.clipboard.writeText(text);
copied.value = true;
setTimeout(() => {
copied.value = false;
}, 3000);
}
</script>

View File

@ -0,0 +1,50 @@
<template>
<div class="mx-2 p-4 !py-8 shadow-md sm:mx-8 sm:p-32">
<div class="my-8 flex items-center justify-between">
<h2 class="m-0 mx-auto text-3xl font-extrabold sm:text-4xl">Latest news from Modrinth</h2>
</div>
<div v-if="latestArticles" class="grid grid-cols-[repeat(auto-fit,minmax(250px,1fr))] gap-4">
<div
v-for="(article, index) in latestArticles"
:key="article.slug"
:class="{ 'max-xl:hidden': index === 2 }"
>
<NewsArticleCard :article="article" />
</div>
</div>
<div class="mx-2 my-8 flex w-full items-center justify-center">
<ButtonStyled color="brand" size="large">
<nuxt-link to="/news">
<NewspaperIcon />
View all news
</nuxt-link>
</ButtonStyled>
</div>
</div>
</template>
<script setup lang="ts">
import { NewspaperIcon } from "@modrinth/assets";
import { articles as rawArticles } from "@modrinth/blog";
import { ButtonStyled } from "@modrinth/ui";
import { ref, computed } from "vue";
import NewsArticleCard from "./NewsArticleCard.vue";
const articles = ref(
rawArticles
.map((article) => ({
...article,
path: `/news/article/${article.slug}`,
thumbnail: article.thumbnail
? `/news/article/${article.slug}/thumbnail.webp`
: `/news/default.jpg`,
title: article.title,
summary: article.summary,
date: article.date,
}))
.sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime()),
);
const latestArticles = computed(() => articles.value.slice(0, 3));
</script>

View File

@ -0,0 +1,40 @@
<script setup lang="ts">
import dayjs from "dayjs";
interface Article {
path: string;
thumbnail: string;
title: string;
summary: string;
date: string;
}
defineProps<{
article: Article;
}>();
</script>
<template>
<nuxt-link
:to="`${article.path}/`"
class="active:scale-[0.99]! group flex flex-col transition-all ease-in-out hover:brightness-125"
>
<article class="flex h-full grow flex-col gap-4">
<img
:src="article.thumbnail"
class="aspect-video w-full rounded-xl border-[1px] border-solid border-button-border object-cover"
/>
<div class="flex grow flex-col gap-2">
<h3 class="m-0 text-base leading-tight group-hover:underline">
{{ article.title }}
</h3>
<p v-if="article.summary" class="m-0 text-sm leading-tight">
{{ article.summary }}
</p>
<div class="mt-auto text-sm text-secondary">
{{ dayjs(article.date).format("MMMM D, YYYY") }}
</div>
</div>
</article>
</nuxt-link>
</template>

View File

@ -1211,9 +1211,9 @@ const footerLinks = [
label: formatMessage(defineMessage({ id: "layout.footer.about", defaultMessage: "About" })), label: formatMessage(defineMessage({ id: "layout.footer.about", defaultMessage: "About" })),
links: [ links: [
{ {
href: "https://blog.modrinth.com", href: "/news",
label: formatMessage( label: formatMessage(
defineMessage({ id: "layout.footer.about.blog", defaultMessage: "Blog" }), defineMessage({ id: "layout.footer.about.news", defaultMessage: "News" }),
), ),
}, },
{ {

View File

@ -383,8 +383,8 @@
"layout.footer.about": { "layout.footer.about": {
"message": "About" "message": "About"
}, },
"layout.footer.about.blog": { "layout.footer.about.news": {
"message": "Blog" "message": "News"
}, },
"layout.footer.about.careers": { "layout.footer.about.careers": {
"message": "Careers" "message": "Careers"

View File

@ -7,14 +7,14 @@
{{ formatProjectType(project.project_type).toLowerCase() }}. You may choose one from our {{ formatProjectType(project.project_type).toLowerCase() }}. You may choose one from our
list or provide a custom license. You may also provide a custom URL to your chosen license; list or provide a custom license. You may also provide a custom URL to your chosen license;
otherwise, the license text will be displayed. See our otherwise, the license text will be displayed. See our
<a <nuxt-link
href="https://blog.modrinth.com/licensing-guide/" to="/news/article/licensing-guide/"
target="_blank" target="_blank"
rel="noopener" rel="noopener"
class="text-link" class="text-link"
> >
licensing guide licensing guide
</a> </nuxt-link>
for more information. for more information.
</p> </p>

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -122,8 +122,8 @@
<h3>Creator Monetization Program data</h3> <h3>Creator Monetization Program data</h3>
<p> <p>
When you sign up for our When you sign up for our
<a href="https://blog.modrinth.com/p/creator-monetization-beta"> <nuxt-link to="/news/article/creator-monetization-beta">
Creator Monetization Program</a Creator Monetization Program</nuxt-link
> >
(the "CMP"), we collect: (the "CMP"), we collect:
</p> </p>

View File

@ -0,0 +1,263 @@
<script setup lang="ts">
import { ButtonStyled } from "@modrinth/ui";
import { RssIcon, GitGraphIcon } from "@modrinth/assets";
import dayjs from "dayjs";
import { articles as rawArticles } from "@modrinth/blog";
import { computed } from "vue";
import ShareArticleButtons from "~/components/ui/ShareArticleButtons.vue";
import NewsletterButton from "~/components/ui/NewsletterButton.vue";
const config = useRuntimeConfig();
const route = useRoute();
const rawArticle = rawArticles.find((article) => article.slug === route.params.slug);
if (!rawArticle) {
throw createError({
fatal: true,
statusCode: 404,
message: "The requested article could not be found.",
});
}
const html = await rawArticle.html();
const article = computed(() => ({
...rawArticle,
path: `/news/${rawArticle.slug}`,
thumbnail: rawArticle.thumbnail
? `/news/article/${rawArticle.slug}/thumbnail.webp`
: `/news/default.jpg`,
title: rawArticle.title,
summary: rawArticle.summary,
date: rawArticle.date,
html,
}));
const articleTitle = computed(() => article.value.title);
const articleUrl = computed(() => `https://modrinth.com/news/article/${route.params.slug}`);
const thumbnailPath = computed(() =>
article.value.thumbnail
? `${config.public.siteUrl}${article.value.thumbnail}`
: `${config.public.siteUrl}/news/default.jpg`,
);
const dayjsDate = computed(() => dayjs(article.value.date));
useSeoMeta({
title: () => `${articleTitle.value} - Modrinth News`,
ogTitle: () => articleTitle.value,
description: () => article.value.summary,
ogDescription: () => article.value.summary,
ogType: "article",
ogImage: () => thumbnailPath.value,
articlePublishedTime: () => dayjsDate.value.toISOString(),
twitterCard: "summary_large_image",
twitterImage: () => thumbnailPath.value,
});
</script>
<template>
<div class="page experimental-styles-within py-6">
<div
class="flex flex-wrap items-center justify-between gap-4 border-0 border-b-[1px] border-solid border-divider px-6 pb-6"
>
<nuxt-link :to="`/news`">
<h1 class="m-0 text-3xl font-extrabold hover:underline">News</h1>
</nuxt-link>
<div class="flex gap-2">
<NewsletterButton />
<ButtonStyled circular>
<a v-tooltip="`RSS feed`" aria-label="RSS feed" href="/news/feed/rss.xml" target="_blank">
<RssIcon />
</a>
</ButtonStyled>
<ButtonStyled circular icon-only>
<a v-tooltip="`Changelog`" href="/news/changelog" aria-label="Changelog">
<GitGraphIcon />
</a>
</ButtonStyled>
</div>
</div>
<article class="mt-6 flex flex-col gap-4 px-6">
<h2 class="m-0 text-2xl font-extrabold leading-tight sm:text-4xl">{{ article.title }}</h2>
<p class="m-0 text-base leading-tight sm:text-lg">{{ article.summary }}</p>
<div class="mt-auto text-sm text-secondary sm:text-base">
Posted on {{ dayjsDate.format("MMMM D, YYYY") }}
</div>
<ShareArticleButtons :title="article.title" :url="articleUrl" />
<img
:src="article.thumbnail"
class="aspect-video w-full rounded-xl border-[1px] border-solid border-button-border object-cover sm:rounded-2xl"
:alt="article.title"
/>
<div class="markdown-body" v-html="article.html" />
<h3
class="mb-0 mt-4 border-0 border-t-[1px] border-solid border-divider pt-4 text-base font-extrabold sm:text-lg"
>
Share this article
</h3>
<ShareArticleButtons :title="article.title" :url="articleUrl" />
</article>
</div>
</template>
<style lang="scss" scoped>
.page {
> *:not(.full-width-bg),
> .full-width-bg > * {
max-width: 56rem;
margin-inline: auto;
}
}
.brand-gradient-bg {
background: var(--brand-gradient-bg);
border-color: var(--brand-gradient-border);
}
@media (max-width: 640px) {
.page {
padding-top: 1rem;
padding-bottom: 1rem;
}
article {
gap: 1rem;
}
}
:deep(.markdown-body) {
h1,
h2 {
border-bottom: none;
padding: 0;
}
ul > li:not(:last-child) {
margin-bottom: 0.5rem;
}
ul,
ol {
p {
margin-bottom: 0.5rem;
}
}
ul {
strong {
color: var(--color-contrast);
font-weight: 600;
}
}
h1,
h2,
h3 {
margin-bottom: 0.25rem;
}
h1 {
font-size: 1.5rem;
@media (min-width: 640px) {
font-size: 2rem;
}
}
h2 {
font-size: 1.25rem;
@media (min-width: 640px) {
font-size: 1.5rem;
}
}
h3 {
font-size: 1.125rem;
@media (min-width: 640px) {
font-size: 1.25rem;
}
}
p {
margin-bottom: 1.25rem;
font-size: 0.875rem;
@media (min-width: 640px) {
font-size: 1rem;
}
}
a {
color: var(--color-brand);
font-weight: 600;
&:hover {
text-decoration: underline;
}
}
h1,
h2 {
a {
font-weight: 800;
}
}
h1,
h2,
h3,
h4,
h5,
h6 {
a {
color: var(--color-contrast);
}
}
img {
border: 1px solid var(--color-button-border);
border-radius: var(--radius-md);
@media (min-width: 640px) {
border-radius: var(--radius-lg);
}
}
> img,
> :has(img:first-child:last-child) {
display: flex;
justify-content: center;
}
@media (max-width: 640px) {
h1,
h2,
h3,
h4,
h5,
h6 {
margin-bottom: 0.5rem;
}
p {
margin-bottom: 1rem;
}
ul,
ol {
padding-left: 1.25rem;
}
pre {
overflow-x: auto;
font-size: 0.75rem;
}
table {
display: block;
overflow-x: auto;
white-space: nowrap;
}
}
}
</style>

View File

@ -0,0 +1,158 @@
<script setup lang="ts">
import { ButtonStyled } from "@modrinth/ui";
import { ChevronRightIcon, RssIcon, GitGraphIcon } from "@modrinth/assets";
import dayjs from "dayjs";
import { articles as rawArticles } from "@modrinth/blog";
import { computed, ref } from "vue";
import NewsletterButton from "~/components/ui/NewsletterButton.vue";
import NewsArticleCard from "~/components/ui/news/NewsArticleCard.vue";
const articles = ref(
rawArticles
.map((article) => ({
...article,
path: `/news/article/${article.slug}`,
thumbnail: article.thumbnail
? `/news/article/${article.slug}/thumbnail.webp`
: `/news/default.jpg`,
title: article.title,
summary: article.summary,
date: article.date,
}))
.sort((a, b) => new Date(b.date).getTime() - new Date(a.date).getTime()),
);
const featuredArticle = computed(() => articles.value?.[0]);
const config = useRuntimeConfig();
useSeoMeta({
title: "Modrinth News",
ogTitle: "Modrinth News",
description: "Keep up-to-date on the latest news from Modrinth.",
ogDescription: "Keep up-to-date on the latest news from Modrinth.",
ogType: "website",
ogImage: () => `${config.public.siteUrl}/news/thumbnail.jpg`,
twitterCard: "summary_large_image",
twitterImage: () => `${config.public.siteUrl}/news/thumbnail.jpg`,
});
</script>
<template>
<div class="page experimental-styles-within py-6">
<div class="flex flex-wrap items-center justify-between gap-4 px-6">
<div>
<h1 class="m-0 text-3xl font-extrabold">News</h1>
</div>
<div class="flex gap-2">
<NewsletterButton />
<ButtonStyled circular>
<a v-tooltip="`RSS feed`" aria-label="RSS feed" href="/news/feed/rss.xml" target="_blank">
<RssIcon />
</a>
</ButtonStyled>
<ButtonStyled circular icon-only>
<a v-tooltip="`Changelog`" href="/news/changelog" aria-label="Changelog">
<GitGraphIcon />
</a>
</ButtonStyled>
</div>
</div>
<template v-if="articles && articles.length">
<div
v-if="featuredArticle"
class="full-width-bg brand-gradient-bg mt-6 border-0 border-y-[1px] border-solid py-4"
>
<nuxt-link
:to="`${featuredArticle.path}/`"
class="active:scale-[0.99]! group flex transition-all ease-in-out hover:brightness-125"
>
<article class="featured-article px-6">
<div class="featured-image-container">
<img
:src="featuredArticle.thumbnail"
class="aspect-video w-full rounded-2xl border-[1px] border-solid border-button-border object-cover"
/>
</div>
<div class="featured-content">
<p class="m-0 font-bold">Featured article</p>
<h3 class="m-0 text-3xl leading-tight group-hover:underline">
{{ featuredArticle?.title }}
</h3>
<p class="m-0 text-lg leading-tight">{{ featuredArticle?.summary }}</p>
<div class="mt-auto text-secondary">
{{ dayjs(featuredArticle?.date).format("MMMM D, YYYY") }}
</div>
</div>
</article>
</nuxt-link>
</div>
<div class="mt-6 px-6">
<div class="group flex w-fit items-center gap-1">
<h2 class="m-0 text-xl font-extrabold">More articles</h2>
<ChevronRightIcon
v-if="false"
class="ml-0 h-6 w-6 transition-all group-hover:ml-1 group-hover:text-brand"
/>
</div>
<div class="mt-4 grid grid-cols-[repeat(auto-fill,minmax(250px,1fr))] gap-4">
<NewsArticleCard v-for="article in articles" :key="article.path" :article="article" />
</div>
</div>
</template>
<div v-else class="pt-4">Error: Articles could not be loaded.</div>
</div>
</template>
<style lang="scss" scoped>
.page {
> *:not(.full-width-bg),
> .full-width-bg > * {
max-width: 56rem;
margin-inline: auto;
}
}
.brand-gradient-bg {
background: var(--brand-gradient-bg);
border-color: var(--brand-gradient-border);
}
.featured-article {
display: flex;
flex-wrap: wrap;
gap: 1rem;
width: 100%;
}
.featured-image-container {
flex: 1;
min-width: 0;
}
.featured-content {
flex: 1;
min-width: 16rem;
display: flex;
flex-direction: column;
gap: 0.5rem;
}
@media (max-width: 640px) {
.featured-article {
flex-direction: column;
}
.featured-image-container {
order: 1;
}
.featured-content {
order: 2;
min-width: 0;
}
}
</style>

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 74 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 114 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 17 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 57 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 417 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 159 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 75 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 21 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 65 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 80 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 40 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 20 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 67 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 118 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 78 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 68 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 77 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 32 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 55 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 28 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 49 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

View File

@ -0,0 +1,165 @@
{
"articles": [
{
"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 whats next.",
"thumbnail": "https://modrinth.com/news/default.jpg",
"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 were 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.jpg",
"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.jpg",
"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.jpg",
"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.jpg",
"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": "Creators can now make money on Modrinth!",
"summary": "Yes, you read the title correctly: Modrinth's creator monetization program, also known as payouts, is now in an open beta phase. Read on for more information!",
"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": "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.",
"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": "After a great first week since Modrinth launched out of beta, we have continued to improve the user interface based on feedback.",
"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": "After months of relatively quiet development, Modrinth has released many new features and improvements, including a redesign. Read on to learn more!",
"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.jpg",
"date": "2020-11-27T00:00:00.000Z",
"link": "https://modrinth.com/news/article/whats-modrinth"
}
]
}

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 64 KiB

View File

@ -51,7 +51,8 @@ pub fn config(cfg: &mut ServiceConfig) {
.service(resend_verify_email) .service(resend_verify_email)
.service(set_email) .service(set_email)
.service(verify_email) .service(verify_email)
.service(subscribe_newsletter), .service(subscribe_newsletter)
.service(get_newsletter_subscription_status),
); );
} }
@ -1321,6 +1322,37 @@ pub async fn sign_up_sendy(email: &str) -> Result<(), AuthenticationError> {
Ok(()) Ok(())
} }
pub async fn check_sendy_subscription(
email: &str,
) -> Result<bool, AuthenticationError> {
let url = dotenvy::var("SENDY_URL")?;
let id = dotenvy::var("SENDY_LIST_ID")?;
let api_key = dotenvy::var("SENDY_API_KEY")?;
if url.is_empty() || url == "none" {
tracing::info!(
"Sendy URL not set, returning false for subscription check"
);
return Ok(false);
}
let mut form = HashMap::new();
form.insert("api_key", &*api_key);
form.insert("email", email);
form.insert("list_id", &*id);
let client = reqwest::Client::new();
let response = client
.post(format!("{url}/api/subscribers/subscription-status.php"))
.form(&form)
.send()
.await?
.text()
.await?;
Ok(response.trim() == "Subscribed")
}
#[derive(Deserialize, Validate)] #[derive(Deserialize, Validate)]
pub struct NewAccount { pub struct NewAccount {
#[validate(length(min = 1, max = 39), regex(path = *crate::util::validate::RE_URL_SAFE))] #[validate(length(min = 1, max = 39), regex(path = *crate::util::validate::RE_URL_SAFE))]
@ -2387,6 +2419,35 @@ pub async fn subscribe_newsletter(
} }
} }
#[get("email/subscribe")]
pub async fn get_newsletter_subscription_status(
req: HttpRequest,
pool: Data<PgPool>,
redis: Data<RedisPool>,
session_queue: Data<AuthQueue>,
) -> Result<HttpResponse, ApiError> {
let user = get_user_from_headers(
&req,
&**pool,
&redis,
&session_queue,
Scopes::USER_READ,
)
.await?
.1;
if let Some(email) = user.email {
let is_subscribed = check_sendy_subscription(&email).await?;
Ok(HttpResponse::Ok().json(serde_json::json!({
"subscribed": is_subscribed
})))
} else {
Ok(HttpResponse::Ok().json(serde_json::json!({
"subscribed": false
})))
}
}
fn send_email_verify( fn send_email_verify(
email: String, email: String,
flow: String, flow: String,

View File

@ -0,0 +1,10 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none"
stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"
class="lucide lucide-git-graph-icon lucide-git-graph">
<circle cx="5" cy="6" r="3" />
<path d="M5 9v6" />
<circle cx="5" cy="18" r="3" />
<path d="M12 3v18" />
<circle cx="19" cy="6" r="3" />
<path d="M16 15.7A9 9 0 0 0 19 9" />
</svg>

After

Width:  |  Height:  |  Size: 448 B

View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="lucide lucide-rss-icon lucide-rss"><path d="M4 11a9 9 0 0 1 9 9"/><path d="M4 4a16 16 0 0 1 16 16"/><circle cx="5" cy="19" r="1"/></svg>

After

Width:  |  Height:  |  Size: 324 B

View File

@ -159,6 +159,7 @@ import _RestoreIcon from './icons/restore.svg?component'
import _RightArrowIcon from './icons/right-arrow.svg?component' import _RightArrowIcon from './icons/right-arrow.svg?component'
import _RotateCounterClockwiseIcon from './icons/rotate-ccw.svg?component' import _RotateCounterClockwiseIcon from './icons/rotate-ccw.svg?component'
import _RotateClockwiseIcon from './icons/rotate-cw.svg?component' import _RotateClockwiseIcon from './icons/rotate-cw.svg?component'
import _RssIcon from './icons/rss.svg?component'
import _SaveIcon from './icons/save.svg?component' import _SaveIcon from './icons/save.svg?component'
import _ScaleIcon from './icons/scale.svg?component' import _ScaleIcon from './icons/scale.svg?component'
import _ScanEyeIcon from './icons/scan-eye.svg?component' import _ScanEyeIcon from './icons/scan-eye.svg?component'
@ -213,6 +214,7 @@ import _CPUIcon from './icons/cpu.svg?component'
import _LoaderIcon from './icons/loader.svg?component' import _LoaderIcon from './icons/loader.svg?component'
import _ImportIcon from './icons/import.svg?component' import _ImportIcon from './icons/import.svg?component'
import _TimerIcon from './icons/timer.svg?component' import _TimerIcon from './icons/timer.svg?component'
import _GitGraphIcon from './icons/git-graph.svg?component'
// Editor Icons // Editor Icons
import _BoldIcon from './icons/bold.svg?component' import _BoldIcon from './icons/bold.svg?component'
@ -446,4 +448,6 @@ export const LoaderIcon = _LoaderIcon
export const ImportIcon = _ImportIcon export const ImportIcon = _ImportIcon
export const CardIcon = _CardIcon export const CardIcon = _CardIcon
export const TimerIcon = _TimerIcon export const TimerIcon = _TimerIcon
export const RssIcon = _RssIcon
export const GitGraphIcon = _GitGraphIcon
export const ArrowBigRightDashIcon = _ArrowBigRightDashIcon export const ArrowBigRightDashIcon = _ArrowBigRightDashIcon

View File

@ -0,0 +1,7 @@
module.exports = {
root: true,
extends: ['custom/library'],
env: {
node: true,
},
}

674
packages/blog/LICENSE Normal file
View File

@ -0,0 +1,674 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<https://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<https://www.gnu.org/licenses/why-not-lgpl.html>.

23
packages/blog/README.md Normal file
View File

@ -0,0 +1,23 @@
# Modrinth Blog Articles
This package contains the articles for the Modrinth blog. The articles are written in Markdown and are rendered on the Modrinth website.
## How to add a new article
Write your article in the `articles` directory. The filename should be the slug of the article, and the file should have a `.md` extension. The first line of the file should be the frontmatter, which contains metadata about the article such as the title, summary and date of writing.
### Example Frontmatter
```md
---
title: Quintupling Creator Revenue and Becoming Sustainable
short_title: Becoming Sustainable
summary: Announcing an update to our monetization program, creator split, and more!
short_summary: Announcing 5x creator revenue and updates to the monetization program.
date: 2024-09-13T12:00:00-08:00
---
```
You **can** link other articles in the frontmatter, but it's recommended you're explicit about it, for example: `https://modrinth.com/news/article/...` instead of `/news/article/...`. It's not a requirement though, you just have to be careful about it.
You can place images in the `public/{slug}/...` directory, the thumbnail must be a `.webp` file named `thumbnail.webp` in the same public directory.

View File

@ -0,0 +1,35 @@
---
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+00:00
---
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, weve 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, its 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 communitys needs—whether that means deeper integrations with Modrinths 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](https://pyro.host). 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 theyre working on some exciting new products of their own, which we cant 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 well 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 wont notice any changes right away. Long term, this means well 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 cant wait to share more soon!

View File

@ -0,0 +1,60 @@
---
title: Accelerating Modrinth's Development
summary: Our fundraiser and the future of Modrinth!
date: 2023-02-01T12:00:00-08:00
---
**Update: On [April 4, 2024](/news/article/capital-return) 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](/news/article/capital-return). 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](../two-years-of-modrinth), 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](https://x.com/modrinth/status/1615416957905342472) that [we're hiring](https://careers.modrinth.com)—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](https://www.makersfund.com/), with investors including [Ryan Johnson](https://x.com/ryanmjohnson), [Stephen Cole](https://x.com/sthenc), [Pim de Witte](https://x.com/PimDeWitte), [Chris Lee](https://www.linkedin.com/in/leechris1/), and [Andreas Thorstensson](https://x.com/andreas) 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](https://discord.modrinth.com) 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](https://en.wikipedia.org/wiki/Contributor_License_Agreement), 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.

View File

@ -0,0 +1,37 @@
---
title: Quintupling Creator Revenue and Becoming Sustainable
short_title: Becoming Sustainable
summary: Announcing an update to our monetization program, creator split, and more!
short_summary: Announcing 5x creator revenue and updates to the monetization program.
date: 2024-09-13T12:00:00-08:00
---
Just over 3 weeks ago, we [launched](/news/article/introducing-modrinth-refreshed-site-look-new-advertising-system) our new ads powered by [Aditude](https://www.aditude.com/). These ads have allowed us to improve creator revenue drastically and become sustainable. Read on for more info!
## Creator Revenue
Were excited to share we have been able to increase creator revenue by 5-8x what it was before!
Theres 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](legal/cmp-info#pending).
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 its gone up so much!](./abnormally-high-revenue.webp)
## 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 were doing and where all the money is going. Were working to develop a transparency page on our website for you to view all the graphs and numbers, but it wasnt ready in time for this blog post (for now, you can view our site-wide ad revenue in the API [here](https://api.modrinth.com/v3/payout/platform_revenue). 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 heres a graph of our revenue from the past 30 days:
![Modrinth Advertising Revenue (last 30 days)](./revenue.webp)
We have a lot of exciting things coming up still, and of course, we greatly appreciate all of your support!

View File

@ -0,0 +1,48 @@
---
title: A Sustainable Path Forward for Modrinth
summary: Our capital return and whats next.
date: 2024-04-04T12:00:00-08:00
---
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](/news/article/accelerating-development) 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 Modrinths 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 didnt 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 wouldnt 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. Weve seen other companies in this space prioritize profits and growth at the expense of the community and creators, and we didnt 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 thisEmma, Wyatt, Maya, Coolbot, Jade, Carter, and Prospectorfor 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.
Weve made great strides in this already with new moderation infrastructure including AutoMod and a built-in moderator checklist, greatly reducing moderator time per project. Were also focused on increased transparency, through providing consistent updates on Modrinths 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

View File

@ -0,0 +1,69 @@
---
title: Modrinth's Carbon Ads experiment
summary: "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."
date: 2022-09-08
---
**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](https://www.ethicalads.io/) for a long time now, but we'd like to now try out [CarbonAds](https://www.carbonads.net/).
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](https://discord.gg/EUHuJHt). 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](https://acceptableads.com/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](https://github.com/modrinth/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](https://docs.modrinth.com/docs/details/carbon/).
## 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.

View File

@ -0,0 +1,61 @@
---
title: Creators can now make money on Modrinth!
summary: "Yes, you read the title correctly: Modrinth's creator monetization program, also known as payouts, is now in an open beta phase. Read on for more information!"
date: 2022-11-12
---
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](https://github.com/modrinth/ariadne). Through our payouts algorithm ([source code](https://github.com/modrinth/labrinth/blob/master/src/routes/admin.rs#L95)), 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](https://modrinth.com/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](https://modrinth.com/dashboard/revenue).
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](https://discord.modrinth.com). If you suspect you've found any critical bugs or exploits, please email us immediately at [support@modrinth.com](mailto:support@modrinth.com) - otherwise, for non-critical bugs, report them [on GitHub](https://github.com/modrinth).
👑

View File

@ -0,0 +1,98 @@
---
title: 'Creator Update: Analytics, Organizations, Collections, and more'
short_title: The Creator Update
summary: December may be over, but were not done giving gifts.
short_summary: Adding analytics, orgs, collections, and more!
date: 2024-01-06T12:00:00-08:00
---
December may be over, but that doesnt mean were done giving gifts here at Modrinth. Over the past few months, weve 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.](./project-analytics.jpg)
![A screenshot of the analytics for a user, showing multiple different projects.](./user-analytics.jpg)
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](/dashboard/analytics).
## Organizations
Isnt 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.](./organizations.jpg)
You can create organizations from the [organizations dashboard](/dashboard/organizations). 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.](./user-orgs.jpg)
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.](./collections.jpg)
Your [followed projects](/collection/following) now make up an automatically generated private collection, which you can access from the [“Your collections” section of the dashboard](/dashboard/collections).
### Wait… arent those just modpacks?
Not quite! Modpacks are much more complex than collections. Collections are simply lists of projects. Heres a quick comparison:
| Modpacks | Collections |
| --------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| Created through a launcher, such as the [Modrinth App](/app). | Created on the [Modrinth website](/dashboard/collections). |
| 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 Modrinths staff and approved per [Modrinths rules](/legal/rules) before it can be published. | Does **not** need to be reviewed by Modrinths 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 youre 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)](./payouts.jpg)
Whether you want Applebees in America, Boek & Bladkado in Belgium, or Cineplex in Canada, weve 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? Weve got those, too.
## New Markdown editor
For the longest time, Modrinths text editor for descriptions, changelogs, reports, and more has just been a box to enter [Markdown syntax](https://en.wikipedia.org/wiki/Markdown). What about people who dont know Markdown, though? Even for those who do, writing it out by hand gets tedious after a while. Thats why we rebuilt it from the ground up to make it far easier to use.
<iframe width="560" height="315" src="https://www.youtube.com/embed/X07M-IFsqbs?si=pUca7XGdvtdd4XlD" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>
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
Wouldnt 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](https://en.wikipedia.org/wiki/OAuth) 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.](./oauth.jpg)
You can create a new OAuth application in the [Applications](/settings/applications) section of your settings. You can see which applications youve granted access to in the [Authorizations](/settings/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](https://floss.social/@modrinth) and [X/Twitter](https://twitter.com/modrinth). You can also chat with us on [Discord](https://discord.modrinth.com) if you like that.
Thanks to [intergrav](https://github.com/intergrav) for making the banner image.

View File

@ -0,0 +1,77 @@
---
title: Introducing Modrinth+, a refreshed site look, and a new advertising system!
short_title: Modrinth+ and New Ads
summary: Learn about this major update to Modrinth.
short_summary: Introducing a new ad system, a subscription to remove ads, and a redesign of the website!
date: 2024-08-21T12:00:00-08:00
---
Weve 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, were launching [Modrinth+](/plus), 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
Were launching Stage One of Modrinths refreshed look to Modrinth.com today as well. I want to stress that its not fully complete and were 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 were launching it broadly now. Please bear with us while we work to complete it promptly!
![A screenshot of the new project page](./project-page.webp)
Key new features include:
- **New download interface** to ensure users get the correct version for the Minecraft version and mod loader theyre 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 wed really appreciate it if you could gently let us know how a particular change has affected you on GitHub [here](https://github.com/modrinth/code/issues) (or upvote/comment on an existing issue) rather than declaring its 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. Its 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 weve 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, weve grown too quickly (a very good problem to have!) and dont 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](https://www.aditude.com/) 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](https://www.bisecthosting.com/) for supporting us with our ad deal for the past year.
## Modrinth App 0.8.1
Over the last few months, weve 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! Heres 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!
Dont have the Modrinth App? Check it out [here](/app)!
## 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](https://floss.social/@modrinth) and [X/Twitter](https://twitter.com/modrinth). You can also chat with us on [Discord](https://discord.modrinth.com) if you like that.
Thanks to [intergrav](https://github.com/intergrav) for making the banner image.

View File

@ -0,0 +1,42 @@
---
title: Correcting Inflated Download Counts due to Rate Limiting Issue
short_title: Correcting Inflated Download Counts
summary: A rate limiting issue caused inflated download counts in certain countries.
date: 2023-11-10T12:00:00-08:00
---
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?](./country-download-counts.jpg)
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.](./country-page-views.jpg)
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.](./downloads-table.jpg)
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](https://github.com/modrinth/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](https://workers.cloudflare.com/) 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 sources 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](https://developers.cloudflare.com/kv/concepts/how-kv-works/#consistency) for each servers 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.](./new-sisyphus.jpg)
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](/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.

View File

@ -0,0 +1,63 @@
---
title: 'This week in Modrinth development: Filters and Fixes'
summary: 'After a great first week since Modrinth launched out of beta, we have continued to improve the user interface based on feedback.'
date: 2022-03-09
---
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](https://modrinth.com).
## New features
We've added a number of new features to improve your experience.
### Click to expand gallery images
![The new expanding gallery images](./expand-gallery.jpg)
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](./version-filters.jpg)
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](./following.jpg)
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]](https://github.com/modrinth/knossos/issues/370) Fixed download buttons in the changelog page
- [[GH-384]](https://github.com/modrinth/knossos/issues/384) Fixed selecting too many Minecraft versions in the search page covering the license dropdown
- [[GH-390]](https://github.com/modrinth/knossos/issues/390) Fixed the hover state of checkboxes not updating when clicking on the label
- [[GH-393]](https://github.com/modrinth/knossos/issues/393) Fixed the padding of the donation link area when creating or editing a project
- [[GH-394]](https://github.com/modrinth/knossos/issues/394) Fixed the rounding radius of dropdowns when opening upwards
## Minotaur fixes
[Minotaur](https://github.com/modrinth/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](../redesign/#minotaur).

View File

@ -0,0 +1,67 @@
---
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-16
---
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](https://en.wikipedia.org/wiki/Software_license) 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](https://cdn.modrinth.com/licenses/mit.txt), 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](https://cdn.modrinth.com/licenses/apache.txt) 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](https://cdn.modrinth.com/licenses/lgpl-3.txt) (usually [shortened to](https://spdx.org/licenses/LGPL-3.0-only.html) LGPL-3.0).
Typically, when a copyleft license is wanted, the [GPL-3.0](https://spdx.org/licenses/GPL-3.0-only.html) or [AGPL-3.0](https://spdx.org/licenses/AGPL-3.0-only.html) 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](https://www.gnu.org/licenses/gpl-faq.html#GPLPlugins)). An exception can be added to allow linking, such as that found [here](https://gist.github.com/wafflecoffee/588f353802a3b0ea649e4fc85f75e583), 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](https://cdn.modrinth.com/licenses/cc0.txt), 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](https://cdn.modrinth.com/licenses/unlicense.txt) 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](https://opensource.guide/legal/)".
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](https://modrinth.com/legal/terms).
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.

View File

@ -0,0 +1,52 @@
---
title: 'Changes to Modrinth Modpacks'
summary: 'CurseForge CDN links requested to be removed by the end of the month'
date: 2022-05-28
---
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](https://docs.modrinth.com/docs/modpacks/format_definition/#downloads), 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.

View File

@ -0,0 +1,53 @@
---
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-15
---
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](/packages/blog/articles/redesign.md), 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!
[ATLauncher]: https://atlauncher.com
[MultiMC]: https://multimc.org
[packwiz]: https://github.com/packwiz/packwiz
[Modrinth format]: https://docs.modrinth.com/docs/modpacks/format_definition/
[documentation for creating modpacks]: https://docs.modrinth.com/docs/modpacks/creating_modpacks/
[documentation for playing modpacks]: https://docs.modrinth.com/docs/modpacks/playing_modpacks/
[`packwiz cf import`]: https://packwiz.infra.link/reference/commands/packwiz_curseforge_import/
[`packwiz mr export`]: https://packwiz.infra.link/reference/commands/packwiz_modrinth_export/
[Discord]: https://discord.gg/EUHuJHt

View File

@ -0,0 +1,40 @@
---
title: Introducing Modrinth App Beta
short_title: Modrinth App Beta and Upgraded Authentication
summary: Changing the modded Minecraft landscape with the new Modrinth App, alongside several other major features.
short_summary: Launching Modrinth App Beta and upgrading authentication.
date: 2023-08-05T12:00:00-08:00
---
The past few months have been a bit quiet on our part, but that doesnt mean we havent 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. Lets get right into it!
## Modrinth App Beta
Most of our time has been spent working on [Modrinth App](/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, were still very proud of what weve already created, and were pleased to say that its available for download on our website **right now** at [https://modrinth.app](/app). Check it out, play around with it, and have fun!
## Authentication, scoped tokens, and security
The second major thing were 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](https://github.com/trigram-mrp/fractureiser/tree/main#readme). While Modrinth was not affected directly by this attack, it provided a harrowing reminder of what were working with. Thats why were pleased to announce three major features today that will strengthen Modrinths 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.](./auth.jpg)
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 youre curious, we store passwords hashed with the Argon2id method, meaning we couldn't read them even if we wanted to.)

View File

@ -0,0 +1,30 @@
---
title: Welcome to Modrinth Beta
summary: 'After six months of work, Modrinth enters Beta, helping modders host their mods with ease!'
date: 2020-12-01
---
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](./new-design.jpg)
> 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

View File

@ -0,0 +1,56 @@
---
title: Host your own server with Modrinth Servers — now in beta
short_title: Introducing Modrinth Servers
summary: Fast, simple, reliable servers directly integrated into Modrinth.
short_summary: Host your next Minecraft server with Modrinth.
date: 2024-11-02T22:00:00-08:00
---
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](https://pyro.host). 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](./panel.jpg)
## 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.
## Whats 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](https://modrinth.gg) 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**

Some files were not shown because too many files have changed in this diff Show More