Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
68 commits
Select commit Hold shift + click to select a range
c8a586c
Backend routes for choosing username in OAuth flow
aecsocket Apr 12, 2026
64f8755
fix up oauth flow routes
aecsocket Apr 13, 2026
fe3aba5
improve URL-related OAuth code
aecsocket Apr 14, 2026
7ea0635
Use user-provided callback addr instead of SELF_ADDR
aecsocket Apr 14, 2026
7484afa
Revert "Use user-provided callback addr instead of SELF_ADDR"
aecsocket Apr 14, 2026
66f3c39
fix flow
aecsocket Apr 14, 2026
57b4f21
fix: backend response for create oauth account
tdgao Apr 17, 2026
c54906e
Merge branch 'main' into boris/dev-908-backend-changes
tdgao Apr 17, 2026
c19ce11
feat: new auth flow (#5840)
tdgao Apr 22, 2026
bdc2b4a
Merge branch 'main' into boris/dev-908-backend-changes
tdgao Apr 22, 2026
52a972d
refactor: pnpm prepr
tdgao Apr 22, 2026
aac61dc
fix: make sure staging uses staging
clrxbl Apr 24, 2026
547921b
fix: hcaptcha styles
tdgao Apr 24, 2026
ed53fe5
fix: copy
tdgao Apr 24, 2026
3bfe670
remove: auth/welcome page as its no longer used
tdgao Apr 24, 2026
042dde0
refactor: bring root page card styles into individual components and …
tdgao Apr 24, 2026
71c1deb
fix: account settings modals to use new modal and fix lots of bad styles
tdgao Apr 24, 2026
c99564f
refactor: pnpm prepr
tdgao Apr 24, 2026
f1ce310
feat: implement last signed in indicator
tdgao Apr 24, 2026
8946e4c
fix: append number when generated name from email is taken
tdgao Apr 24, 2026
4183702
refactor: pnpm prepr
tdgao Apr 24, 2026
fcab720
fix: last sign in badge color
tdgao Apr 24, 2026
4389315
fix: qa issues
tdgao Apr 24, 2026
abcac5f
refactor: pnpm prepr
tdgao Apr 24, 2026
65bd893
fix: hover effect on native date picker
tdgao Apr 24, 2026
cad6bd4
chore: temp staging undo
IMB11 Apr 24, 2026
3ccb813
Merge branch 'boris/dev-908-backend-changes' of https://github.com/mo…
IMB11 Apr 24, 2026
ece35f9
Revert "chore: temp staging undo"
IMB11 Apr 24, 2026
6f2e04c
feat: handle app create account
tdgao Apr 24, 2026
0a0b192
Merge branch 'boris/dev-908-backend-changes' of github.com:modrinth/c…
tdgao Apr 24, 2026
918c4a9
fix: last signed in style
tdgao Apr 24, 2026
652a9b0
fix: add initOnMounted for SSR race
tdgao Apr 24, 2026
9646083
refactor: use typescript
tdgao Apr 24, 2026
f4d6543
refactor: pnpm prepr
tdgao Apr 24, 2026
4ce82b0
Merge branch 'main' into boris/dev-908-backend-changes
IMB11 Apr 27, 2026
3ce8f85
refactor: use typescript for reset-password
tdgao Apr 27, 2026
ec7c893
refactor: convert verify-email to use typescript
tdgao Apr 27, 2026
44da0ed
refactor: convert authorize.vue to use typescript
tdgao Apr 27, 2026
872dcbc
fix: authorize.vue error states
tdgao Apr 27, 2026
d6356ea
feat: small style updates
tdgao Apr 27, 2026
e974672
feat: implement date picker component
tdgao Apr 27, 2026
f32f732
feat: improve UX and styles for range select
tdgao Apr 27, 2026
a5be011
refactor: pnpm prepr
tdgao Apr 27, 2026
b9be6ab
fix: range select border styles
tdgao Apr 27, 2026
2aca44b
feat: implement date picker component in create account
tdgao Apr 27, 2026
62f20b9
feat: implement preserve date for date picker
tdgao Apr 27, 2026
c391fb1
update rust toolchain
aecsocket Apr 28, 2026
292b8f4
Merge branch 'main' into boris/dev-908-backend-changes
aecsocket Apr 28, 2026
c7a5336
increase recursion limit
aecsocket Apr 28, 2026
d753b87
fix: date picker can be null
tdgao Apr 30, 2026
9184de9
fix: calculate age based on user's timezone
tdgao Apr 30, 2026
5480826
fix: number input icons color
tdgao Apr 30, 2026
01a7ee8
fix: date picker icons
tdgao Apr 30, 2026
cf58559
feat: improve styles
tdgao Apr 30, 2026
d834ce3
fix: add width on date
tdgao Apr 30, 2026
ecd69f8
fix: hover color bad on number input
tdgao Apr 30, 2026
e08da23
fix lints
aecsocket Apr 30, 2026
addb6c6
feat: add default date open view
tdgao Apr 30, 2026
05a1a10
fmt
aecsocket Apr 30, 2026
27d54a9
Merge branch 'main' into boris/dev-908-backend-changes
tdgao May 11, 2026
63d00cb
fix: account.vue
tdgao May 11, 2026
faed8c3
fix: remove default date to open 13 years ago
tdgao May 11, 2026
ff7c0cb
fix: edit copy on info banner
tdgao May 11, 2026
d48ad87
fix: cannot hover over project card tooltip items (#6071)
tdgao May 11, 2026
0f1483d
feat: improve add dependency flow (#6075)
tdgao May 12, 2026
db9689b
fix: open modrinth project links in the app (#6072)
Prospector May 12, 2026
b566237
pin tanstack versions + set pnpm min age to 7 days
Prospector May 12, 2026
d709bbe
squash commits
aecsocket May 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .github/instructions/i18n-convert.instructions.md
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,6 @@ Please follow these rules precisely:
Use existing patterns from our codebase:

- Variables/plurals: see `apps/frontend/src/pages/frog.vue`
- Rich-text link tags: see `apps/frontend/src/pages/auth/welcome.vue` and `apps/frontend/src/error.vue`
- Rich-text link tags: see `apps/frontend/src/error.vue`

When you finish, there should be no hard-coded English strings left in the template—everything comes from `formatMessage` or `<IntlFormatted>`.
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ The website and app `prepr` commands

Each project may have its own `CLAUDE.md` with detailed instructions:

- [`apps/labrinth/CLAUDE.md`](apps/labrinth/CLAUDE.md) — Backend API
- [`apps/labrinth/AGENTS.md`](apps/labrinth/AGENTS.md) — Backend API
- [`apps/frontend/CLAUDE.md`](apps/frontend/CLAUDE.md) - Frontend Website

## Code Guidelines
Expand Down
2 changes: 1 addition & 1 deletion apps/app-frontend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@
"@modrinth/utils": "workspace:*",
"@sentry/vue": "^8.27.0",
"@sfirew/minecraft-motd-parser": "^1.1.6",
"@tanstack/vue-query": "^5.90.7",
"@tanstack/vue-query": "5.90.7",
"@tauri-apps/api": "^2.5.0",
"@tauri-apps/plugin-dialog": "^2.2.1",
"@tauri-apps/plugin-fs": "^2.4.5",
Expand Down
31 changes: 30 additions & 1 deletion apps/app-frontend/src/App.vue
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
import { Intercom, shutdown as shutdownIntercom } from '@intercom/messenger-js-sdk'
import {
AuthFeature,
ModrinthApiError,
NodeAuthFeature,
nodeAuthState,
PanelVersionFeature,
Expand Down Expand Up @@ -98,6 +99,7 @@ import { command_listener, warning_listener } from '@/helpers/events.js'
import { cancelLogin, get as getCreds, login, logout } from '@/helpers/mr_auth.ts'
import { create_profile_and_install_from_file } from '@/helpers/pack'
import { list } from '@/helpers/profile.js'
import { mergeUrlQuery, parseModrinthLink } from '@/helpers/project-links.ts'
import { get as getSettings, set as setSettings } from '@/helpers/settings.ts'
import { get_opening_command, initialize_state } from '@/helpers/state'
import {
Expand Down Expand Up @@ -1028,6 +1030,28 @@ async function installUpdate() {
}, 250)
}

async function openModrinthProjectLinkInApp(parsed) {
const { slug, pathSuffix, url } = parsed
const loadToken = loading.begin()
try {
const { id } = await tauriApiClient.labrinth.projects_v2.check(slug)
const query = mergeUrlQuery(route.query, url)
await router.push({
path: `/project/${id}${pathSuffix}`,
query,
hash: url.hash || undefined,
})
} catch (err) {
if (err instanceof ModrinthApiError && err.statusCode === 404) {
openUrl(url.href)
} else {
handleError(err)
}
} finally {
loading.end(loadToken)
}
}

function handleClick(e) {
let target = e.target
while (target != null) {
Expand All @@ -1040,7 +1064,12 @@ function handleClick(e) {
!target.href.startsWith('https://tauri.localhost') &&
!target.href.startsWith('http://tauri.localhost')
) {
openUrl(target.href)
const parsed = parseModrinthLink(target.href)
if (parsed) {
void openModrinthProjectLinkInApp(parsed)
} else {
openUrl(target.href)
}
}
e.preventDefault()
break
Expand Down
83 changes: 83 additions & 0 deletions apps/app-frontend/src/helpers/project-links.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
import type { LocationQuery, LocationQueryRaw } from 'vue-router'

const MODRINTH_HOSTNAMES = new Set(['modrinth.com', 'www.modrinth.com'])

const SUPPORTED_PROJECT_TYPES = new Set([
'mod',
'modpack',
'resourcepack',
'datapack',
'plugin',
'shader',
'server',
'project',
])

export function parseModrinthLink(
href: string,
): { slug: string; pathSuffix: string; url: URL } | null {
let url: URL
try {
url = new URL(href)
} catch {
return null
}

if (!MODRINTH_HOSTNAMES.has(url.hostname.toLowerCase())) {
return null
}

const segments = url.pathname.split('/').filter((p) => p.length > 0)
if (segments.length < 2) {
return null
}

if (SUPPORTED_PROJECT_TYPES.has(segments[0].toLowerCase())) {
const slug = segments[1]
if (!slug) {
return null
}

const rest: string[] = segments.slice(2)
const pathSuffix = toValidAppSubpath(rest)
if (pathSuffix === null) {
return null
}

return { slug, pathSuffix, url }
} else {
return null
}
}

const SUPPORTED_SUBPATHS = ['versions', 'gallery']

function toValidAppSubpath(rest: string[]): string | null {
if (rest.length === 0) {
return ''
}

const subroute = rest[0].toLowerCase()
if (rest.length === 1 && SUPPORTED_SUBPATHS.includes(subroute)) {
return `/${subroute}`
}

if (rest.length === 2 && subroute === 'version') {
return `/version/${rest[1]}`
}

return null
}

export function mergeUrlQuery(routeQuery: LocationQuery, linkUrl: URL): LocationQueryRaw {
const newQuery: LocationQueryRaw = { ...routeQuery }
const keys = new Set<string>()
linkUrl.searchParams.forEach((_value, key) => {
keys.add(key)
})
for (const key of keys) {
const values = linkUrl.searchParams.getAll(key)
newQuery[key] = values.length === 1 ? values[0] : values
}
return newQuery
}
2 changes: 1 addition & 1 deletion apps/frontend/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,7 @@
"@modrinth/ui": "workspace:*",
"@modrinth/utils": "workspace:*",
"@sentry/nuxt": "^10.33.0",
"@tanstack/vue-query": "^5.90.7",
"@tanstack/vue-query": "5.90.7",
"@types/three": "^0.172.0",
"@vitejs/plugin-vue": "^6.0.3",
"@vue-email/components": "^0.0.21",
Expand Down
2 changes: 2 additions & 0 deletions apps/frontend/src/app.vue
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ import { I18nDebugPanel, LoadingBar, NotificationPanel } from '@modrinth/ui'

import { setupProviders } from '~/providers/setup.ts'

import { useAuth } from './composables/auth'

const auth = await useAuth()
setupProviders(auth)
</script>
Loading
Loading