# Highland Games Studio — Website Marketing and devblog site for Highland Games Studio. _Where summits become worlds._ Built with **Next.js 16** (App Router), **React 19**, **Tailwind CSS 4** and **Framer Motion**. Devblog posts are authored in MDX and rendered with `next-mdx-remote`. ## Getting started ```bash npm install npm run dev ``` Open [http://localhost:3000](http://localhost:3000). ## Scripts | Command | Description | | ------------------ | ---------------------------------------- | | `npm run dev` | Start the dev server | | `npm run build` | Production build | | `npm run start` | Serve the production build | | `npm run lint` | Run ESLint | To regenerate the favicon from the studio logo (requires `sharp`): ```bash node scripts/build-favicon.mjs ``` ## Project structure ```text app/ Routes, layouts, server actions, metadata (sitemap/robots/feed/OG) app/components/ Shared UI (Navbar, Footer, forms, social links) content/devblog/ Devblog posts as .mdx (frontmatter: title, date, excerpt, tags, game) lib/ Data + helpers (games registry, devblog loader, site URL) public/ Static assets (studio logos, hero video) scripts/ One-off build scripts (favicon generation) ``` ## Configuration Copy `.env.example` to `.env.local` and fill in the values. - **Site URL** — set `NEXT_PUBLIC_SITE_URL` per environment (used by metadata, sitemap, robots, RSS and JSON-LD). Defaults to `https://highlandgamesstudio.com` — see `lib/site.ts`. - **Contact form (Resend)** — the contact form sends email via [Resend](https://resend.com). Set `RESEND_API_KEY`, `CONTACT_TO_EMAIL` (who receives messages) and `CONTACT_FROM_EMAIL` (sender, must be on a domain verified in Resend). Without these, the form returns a friendly error instead of sending. See `app/actions/contact.ts`. ## Adding a devblog post Create a file in `content/devblog/`, e.g. `2026-06-01-my-post.mdx`: ```mdx --- title: "My post title" date: "2026-06-01" excerpt: "One-line summary for listings and SEO." author: "Highland Games Studio" tags: ["devlog"] game: "emberwild" --- Your MDX content here. ``` ## Deployment Pushes to `master` deploy to the Hetzner server via the Gitea Actions workflow (`.gitea/workflows/deploy.yml`), which SSHes in, pulls, builds, and restarts the PM2 process (`highland`, in `/var/www/highland`). Requires these **repo secrets** (Gitea → repo → Settings → Actions → Secrets): `SSH_HOST`, `SSH_USER`, `SSH_PORT`, `SSH_PRIVATE_KEY`. Server-side prerequisites (one-time): - A registered Gitea `act_runner` with the `ubuntu-latest` label. - `/var/www/highland` is a clone of this repo whose `origin` can pull the **private** Gitea repo non-interactively (deploy key or token in the remote URL). - Node + `pm2` installed, with the app running as the `highland` process. ## Known TODOs - Wire the newsletter form to a real email provider (contact form now uses Resend). - Replace placeholder content (game, team members, social links).