Conversation
Deploying modl-landing with
|
| Latest commit: |
4939eb7
|
| Status: | ✅ Deploy successful! |
| Preview URL: | https://bdd9ea0b.modl-landing.pages.dev |
| Branch Preview URL: | https://dev.modl-landing.pages.dev |
|
@greptileai lemme sniff ur bombastic crack! |
| "license": "AGPL-3.0-only", | ||
| "scripts": { | ||
| "dev": "vite", | ||
| "build": "vite build", |
There was a problem hiding this comment.
SEO generation skipped The new
scripts/postbuild-seo.mjs writes route-specific HTML for /register, /privacy, and /terms, but the build command still only runs vite build. A production build will not generate those per-route files, so direct crawls and social unfurls for those routes keep the generic SPA HTML instead of the route metadata this PR adds.
| "build": "vite build", | |
| "build": "vite build && node scripts/postbuild-seo.mjs", |
Prompt To Fix With AI
This is a comment left during a code review.
Path: package.json
Line: 8
Comment:
**SEO generation skipped** The new `scripts/postbuild-seo.mjs` writes route-specific HTML for `/register`, `/privacy`, and `/terms`, but the build command still only runs `vite build`. A production build will not generate those per-route files, so direct crawls and social unfurls for those routes keep the generic SPA HTML instead of the route metadata this PR adds.
```suggestion
"build": "vite build && node scripts/postbuild-seo.mjs",
```
How can I resolve this? If you propose a fix, please make it concise.| useEffect(() => { | ||
| document.title = route.title; | ||
| setMeta('meta[name="description"]', "content", route.description); | ||
| setMeta('link[rel="canonical"]', "href", route.url); | ||
| setMeta('meta[property="og:site_name"]', "content", siteName); | ||
| setMeta('meta[property="og:title"]', "content", route.title); | ||
| setMeta('meta[property="og:description"]', "content", route.description); | ||
| setMeta('meta[property="og:image"]', "content", defaultImageUrl); | ||
| setMeta('meta[property="og:url"]', "content", route.url); | ||
| setMeta('meta[name="twitter:title"]', "content", route.title); | ||
| setMeta('meta[name="twitter:description"]', "content", route.description); | ||
| setMeta('meta[name="twitter:image"]', "content", defaultImageUrl); | ||
| }, [route]); |
There was a problem hiding this comment.
Schema stays stale This effect updates the regular meta tags when the SPA route changes, but it leaves the
script[data-route-schema] JSON-LD from index.html unchanged. Navigating to /register, /privacy, or /terms can show the right title and canonical while still exposing the home page WebPage schema, which gives crawlers inconsistent structured data.
Prompt To Fix With AI
This is a comment left during a code review.
Path: client/src/components/SeoHead.tsx
Line: 13-25
Comment:
**Schema stays stale** This effect updates the regular meta tags when the SPA route changes, but it leaves the `script[data-route-schema]` JSON-LD from `index.html` unchanged. Navigating to `/register`, `/privacy`, or `/terms` can show the right title and canonical while still exposing the home page `WebPage` schema, which gives crawlers inconsistent structured data.
How can I resolve this? If you propose a fix, please make it concise.| - name: Configure npm for GitHub Packages | ||
| run: | | ||
| rm .npmrc | ||
| echo "@modl-gg:registry=https://npm.pkg.github.com" >> .npmrc | ||
| echo "//npm.pkg.github.com/:_authToken=${{ secrets.GITHUB_TOKEN }}" >> .npmrc |
There was a problem hiding this comment.
Registry override mismatch The repository
.npmrc now points @modl-gg packages at the Nexus registry, and the lockfile resolves @modl-gg/shared-web from Nexus. This workflow deletes that config and rewrites the scope back to GitHub Packages before npm ci, so CI can resolve the private package from the wrong registry whenever the lockfile is refreshed or the package is no longer mirrored there.
| - name: Configure npm for GitHub Packages | |
| run: | | |
| rm .npmrc | |
| echo "@modl-gg:registry=https://npm.pkg.github.com" >> .npmrc | |
| echo "//npm.pkg.github.com/:_authToken=${{ secrets.GITHUB_TOKEN }}" >> .npmrc | |
| - name: Configure npm for Nexus | |
| run: | | |
| rm .npmrc | |
| echo "@modl-gg:registry=https://nexus.modl.gg/repository/npm-releases/" >> .npmrc |
Prompt To Fix With AI
This is a comment left during a code review.
Path: .github/workflows/build.yml
Line: 30-34
Comment:
**Registry override mismatch** The repository `.npmrc` now points `@modl-gg` packages at the Nexus registry, and the lockfile resolves `@modl-gg/shared-web` from Nexus. This workflow deletes that config and rewrites the scope back to GitHub Packages before `npm ci`, so CI can resolve the private package from the wrong registry whenever the lockfile is refreshed or the package is no longer mirrored there.
```suggestion
- name: Configure npm for Nexus
run: |
rm .npmrc
echo "@modl-gg:registry=https://nexus.modl.gg/repository/npm-releases/" >> .npmrc
```
How can I resolve this? If you propose a fix, please make it concise.| <motion.div | ||
| className="text-center mb-12" | ||
| initial={{ opacity: 0, y: 20 }} | ||
| whileInView={{ opacity: 1, y: 0 }} | ||
| viewport={{ once: true, margin: "-100px" }} | ||
| transition={{ duration: 0.5 }} | ||
| className="glass-bar rounded-2xl px-6 py-4 sm:px-8 sm:py-5 flex items-center gap-6" | ||
| initial={{ opacity: 0, y: -20 }} | ||
| animate={{ opacity: 1, y: 0 }} | ||
| transition={{ duration: 0.8, ease }} | ||
| > | ||
| <h2 className="text-3xl sm:text-4xl font-bold mb-4">Powerful Moderation Tools</h2> | ||
| <p className="text-xl text-slate-400 max-w-2xl mx-auto"> | ||
| Everything you need to keep your Minecraft community safe, engaged, and supported | ||
| <h1 className="font-brand text-2xl sm:text-3xl tracking-tight shrink-0"> | ||
| <span className="text-primary">modl</span> | ||
| <span className="text-foreground/70">.gg</span> | ||
| </h1> | ||
| <span className="w-px h-6 bg-white/10 shrink-0 hidden sm:block" /> | ||
| <p className="text-sm text-muted-foreground/70 leading-relaxed"> | ||
| The comprehensive moderation and support suite for Minecraft | ||
| servers: smart punishments, web replays, efficient ticketing, robust | ||
| analytics, and a full web dashboard. | ||
| </p> | ||
| </motion.div> |
There was a problem hiding this comment.
Primary CTA removed
Home now starts with this feature bar after deleting the old navbar and hero, but the replacement only renders brand text and a description. The previous above-the-fold Register Free and documentation links are gone, so new visitors have to scroll through the feature grid before finding the registration action in pricing.
Prompt To Fix With AI
This is a comment left during a code review.
Path: client/src/components/home/FeaturesSection.tsx
Line: 901-917
Comment:
**Primary CTA removed** `Home` now starts with this feature bar after deleting the old navbar and hero, but the replacement only renders brand text and a description. The previous above-the-fold `Register Free` and documentation links are gone, so new visitors have to scroll through the feature grid before finding the registration action in pricing.
How can I resolve this? If you propose a fix, please make it concise.Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!
| "scripts": { | ||
| "dev": "vite", | ||
| "build": "vite build", | ||
| "preview": "vite preview", | ||
| "check": "tsc" | ||
| }, |
There was a problem hiding this comment.
This PR adds scripts/postbuild-seo.mjs to generate /register/index.html, /privacy/index.html, and /terms/index.html, but the build still only runs vite build. A production build will not create those route-specific HTML files, so direct route requests and crawlers will keep getting the generic SPA HTML or a host-level fallback instead of the metadata this script is meant to produce.
| "scripts": { | |
| "dev": "vite", | |
| "build": "vite build", | |
| "preview": "vite preview", | |
| "check": "tsc" | |
| }, | |
| "scripts": { | |
| "dev": "vite", | |
| "build": "vite build && node scripts/postbuild-seo.mjs", | |
| "preview": "vite preview", | |
| "check": "tsc" | |
| }, |
Prompt To Fix With AI
This is a comment left during a code review.
Path: package.json
Line: 6-11
Comment:
**SEO script unused**
This PR adds `scripts/postbuild-seo.mjs` to generate `/register/index.html`, `/privacy/index.html`, and `/terms/index.html`, but the build still only runs `vite build`. A production build will not create those route-specific HTML files, so direct route requests and crawlers will keep getting the generic SPA HTML or a host-level fallback instead of the metadata this script is meant to produce.
```suggestion
"scripts": {
"dev": "vite",
"build": "vite build && node scripts/postbuild-seo.mjs",
"preview": "vite preview",
"check": "tsc"
},
```
How can I resolve this? If you propose a fix, please make it concise.| useEffect(() => { | ||
| document.title = route.title; | ||
| setMeta('meta[name="description"]', "content", route.description); | ||
| setMeta('link[rel="canonical"]', "href", route.url); | ||
| setMeta('meta[property="og:site_name"]', "content", siteName); | ||
| setMeta('meta[property="og:title"]', "content", route.title); | ||
| setMeta('meta[property="og:description"]', "content", route.description); | ||
| setMeta('meta[property="og:image"]', "content", defaultImageUrl); | ||
| setMeta('meta[property="og:url"]', "content", route.url); | ||
| setMeta('meta[name="twitter:title"]', "content", route.title); | ||
| setMeta('meta[name="twitter:description"]', "content", route.description); | ||
| setMeta('meta[name="twitter:image"]', "content", defaultImageUrl); |
There was a problem hiding this comment.
SeoHead updates the document title and meta tags for each SPA route, but it leaves the data-route-schema JSON-LD block from client/index.html unchanged. After navigating to /register, /privacy, or /terms, the page can have the correct canonical/meta tags while structured data still describes the home page URL and description, producing inconsistent SEO metadata.
Prompt To Fix With AI
This is a comment left during a code review.
Path: client/src/components/SeoHead.tsx
Line: 13-24
Comment:
**Route schema stays stale**
`SeoHead` updates the document title and meta tags for each SPA route, but it leaves the `data-route-schema` JSON-LD block from `client/index.html` unchanged. After navigating to `/register`, `/privacy`, or `/terms`, the page can have the correct canonical/meta tags while structured data still describes the home page URL and description, producing inconsistent SEO metadata.
How can I resolve this? If you propose a fix, please make it concise.| scope: '@modl-gg' | ||
| - name: Configure npm for GitHub Packages | ||
| run: | | ||
| rm .npmrc | ||
| echo "@modl-gg:registry=https://npm.pkg.github.com" >> .npmrc | ||
| echo "//npm.pkg.github.com/:_authToken=${{ secrets.GITHUB_TOKEN }}" >> .npmrc |
There was a problem hiding this comment.
The committed .npmrc now points @modl-gg packages at the Nexus registry, but this workflow still deletes that file and rewrites it to GitHub Packages before npm ci. CI no longer tests the package registry configuration that developers and deployments get from the repository, and installs can fail or diverge if @modl-gg/shared-web is expected to come from Nexus.
Prompt To Fix With AI
This is a comment left during a code review.
Path: .github/workflows/build.yml
Line: 28-34
Comment:
**Registry config overwritten**
The committed `.npmrc` now points `@modl-gg` packages at the Nexus registry, but this workflow still deletes that file and rewrites it to GitHub Packages before `npm ci`. CI no longer tests the package registry configuration that developers and deployments get from the repository, and installs can fail or diverge if `@modl-gg/shared-web` is expected to come from Nexus.
How can I resolve this? If you propose a fix, please make it concise.| // Preload all expanded-view images so they appear instantly on click | ||
| function usePreloadImages() { | ||
| useEffect(() => { | ||
| for (const f of features) { | ||
| if (f.media) { | ||
| const img = new Image(); | ||
| img.src = f.media; | ||
| } | ||
| for (const src of f.extraMedia ?? []) { | ||
| const img = new Image(); | ||
| img.src = src; | ||
| } | ||
| } | ||
| }, []); |
There was a problem hiding this comment.
This hook creates an Image for every feature media asset as soon as the homepage mounts, including large GIFs and screenshots that are below the fold or only shown after expanding a card. That defeats the loading="lazy" behavior on the visible cards and can make the initial landing page download much more media than the visitor needs.
Prompt To Fix With AI
This is a comment left during a code review.
Path: client/src/components/home/FeaturesSection.tsx
Line: 871-884
Comment:
**Images preload immediately**
This hook creates an `Image` for every feature media asset as soon as the homepage mounts, including large GIFs and screenshots that are below the fold or only shown after expanding a card. That defeats the `loading="lazy"` behavior on the visible cards and can make the initial landing page download much more media than the visitor needs.
How can I resolve this? If you propose a fix, please make it concise.| onWheel={(event) => { | ||
| event.preventDefault(); | ||
| setConstrainedZoom(zoom + (event.deltaY < 0 ? 0.2 : -0.2)); | ||
| }} |
There was a problem hiding this comment.
The wheel handler calculates the next zoom from the zoom value captured by the current render. Trackpads and mouse wheels can fire several events before React renders again, so multiple events reuse the same stale value and some zoom steps are lost. The modal can feel stuck or jumpy when users scroll to zoom.
| onWheel={(event) => { | |
| event.preventDefault(); | |
| setConstrainedZoom(zoom + (event.deltaY < 0 ? 0.2 : -0.2)); | |
| }} | |
| onWheel={(event) => { | |
| event.preventDefault(); | |
| setZoom((value) => { | |
| const constrained = Math.min(4, Math.max(1, value + (event.deltaY < 0 ? 0.2 : -0.2))); | |
| if (constrained === 1) setPosition({ x: 0, y: 0 }); | |
| return constrained; | |
| }); | |
| }} |
Prompt To Fix With AI
This is a comment left during a code review.
Path: client/src/components/home/FeaturesSection.tsx
Line: 662-665
Comment:
**Wheel zoom drops updates**
The wheel handler calculates the next zoom from the `zoom` value captured by the current render. Trackpads and mouse wheels can fire several events before React renders again, so multiple events reuse the same stale value and some zoom steps are lost. The modal can feel stuck or jumpy when users scroll to zoom.
```suggestion
onWheel={(event) => {
event.preventDefault();
setZoom((value) => {
const constrained = Math.min(4, Math.max(1, value + (event.deltaY < 0 ? 0.2 : -0.2)));
if (constrained === 1) setPosition({ x: 0, y: 0 });
return constrained;
});
}}
```
How can I resolve this? If you propose a fix, please make it concise.
Confidence Score: 3/5
I would fix the build and registry issues before merging.
package.json,.github/workflows/build.yml, andclient/src/components/home/FeaturesSection.tsxneed the most follow-up.Important Files Changed
Prompt To Fix All With AI
Reviews (2): Last reviewed commit: "Merge branch 'main' into dev" | Re-trigger Greptile