Official website for Dynamia AI, built with Next.js 15.
- Framework: Next.js 15.2.8 with App Router
- React: 19.0.0
- Language: TypeScript 5 (strict mode)
- Styling: Tailwind CSS v4
- Animations: Framer Motion
- i18n: react-i18next (English/Chinese)
- Fonts: Geist Sans & Geist Mono
- Node.js 22 (22.6 or newer within 22.x;
.nvmrcmatches CI) - npm, yarn, pnpm, or bun
# Install dependencies
npm install
# Initialize the ignored asset manifest for editor type checking
npm run generate:public-assetsRun Next.js commands from the repository root. If using nvm, run nvm install
and nvm use to select the version in .nvmrc.
npm run devOpen http://localhost:3000 to view the site.
# Development
npm run dev # Start development server
# Building
npm run build # Production build
npm run build-legacy # Production build with increased memory (if needed)
# Production
npm start # Start production server
# Code Quality
npm run lint # Run ESLint
npm run typecheck # Generate the asset manifest, then check TypeScript
npm run test:blog-assets # Test image selection, the manifest and function traces
# Search
npm run algolia:index # Generate Algolia search indexsrc/
├── app/ # Next.js App Router pages
├── components/ # Reusable React components
├── i18n/ # Internationalization (en.json, zh.json)
├── lib/ # Utility functions
└── types/ # TypeScript type definitions
Path Alias: @/* maps to ./src/*
The easiest way to deploy is using Vercel.
Check the Next.js deployment documentation for more details.
This project follows specific coding standards. See AGENTS.md for:
- Component structure patterns
- Import conventions
- TypeScript best practices
- Styling guidelines
- i18n usage rules
Company marketing editors create new blogs from the official company Feishu template, or provide an existing article URL and describe a small edit in chat, including new images. The website-blog-from-feishu skill prepares a content-only preview and draft PR with either workflow. Initial setup includes official Lark CLI, the employee's authorized company Feishu access, and verification of the internal template and article library. Setup also checks that the workflow is enabled on the default branch; creating a PR does not publish the article.
npm run build validates blog frontmatter before compiling. With the production
server running, run npm run validate:seo (defaults to http://localhost:3100;
override with SEO_TEST_URL). The checks verify server-rendered pagination,
canonical/hreflang, localized Article data, historical redirects without loops,
resource links, and real 404 responses. npm run validate:blog runs the content
metadata check independently.
Next config generates src/generated/public-asset-paths.json before compilation.
Blog share images use this path-only manifest so server functions do not bundle
the contents of public/. The file is ignored by Git and refreshed automatically
when assets are added or removed during the default webpack development server.
Only the Node.js server compiler watches the asset directory. A manifest change
can trigger one additional incremental compilation; unchanged contents are not
rewritten. Restart a Turbopack dev server after changing assets.
For a fresh checkout, npm run generate:public-assets initializes the manifest
without starting Next.js. npm run typecheck does this automatically; raw
npx tsc --noEmit and editor checks require the manifest to exist first.
npm run test:blog-assets checks image selection and build safeguards.
npm run build checks every .next/server/**/*.nft.json for public assets and
fails if the required blog traces are missing. Do not exclude src/content/blog,
which is still read by the server. The manifest uses the project directory, but
this does not add support for invoking the whole Next.js build from another cwd.
Case-only historical blog redirects live in src/lib/legacy-blog-redirects.ts
and run before locale middleware. Do not move those mappings to next.config.ts,
whose redirects match case-insensitively and can loop on the destination.