尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证正在加载完整 README。 以下为已保存的摘录。
Marketing and SEO site for Camzify — an AI virtual-patrolling and video-analytics platform by Camzify Global Pte Ltd (Singapore).
This is a content site, not an application. There is no login, no dashboard, no authenticated area. The product app lives separately at app.camzify.live. Everything here exists to be found — by search engines, by AI answer engines, and by buyers — and to convert that traffic into demo requests.
Open http://localhost:3000. That is the whole setup.查看完整 README ↗Marketing and SEO site for Camzify — an AI virtual-patrolling and video-analytics platform by Camzify Global Pte Ltd (Singapore).
This is a content site, not an application. There is no login, no dashboard, no authenticated area. The product app lives separately at app.camzify.live. Everything here exists to be found — by search engines, by AI answer engines, and by buyers — and to convert that traffic into demo requests.
| Requirement | Version | Notes |
|---|---|---|
| Node.js | ≥ 18.17 | Enforced by engines. .nvmrc pins 20 LTS — run nvm use if you have nvm. |
| npm | ≥ 9 | .npmrc sets legacy-peer-deps=true, so plain npm install is correct. Do not add the flag manually. |
| PostgreSQL | any recent | Optional. Only needed for the four contact/demo forms — see below. |
npm install
npm run dev
Open http://localhost:3000. That is the whole setup.
You do not need a database, an
.envfile, or any credentials to run or build this site. All 210 pages are statically prerendered from source with no per-request data, andnpx prisma generate(which runs automatically on install) does not require a live connection. A full production build succeeds with zero environment configuration.You only need
.envif you are working on the four lead-capture form endpoints (/api/book-demo,/api/contact,/api/free-trial,/api/newsletter). Without it, every page renders normally; submitting a form returns{"success": false, "message": "Failed to send message"}because the database write has nowhere to go. That is expected, not a broken checkout.
cp .env.example .env
Fill in .env — every variable is documented inline in .env.example.
Then push the schema to your database:
npx prisma db push
You should see the dark homepage with the crimson Camzify logo, a nav bar, and a hero reading "Your site. Patrolled 24/7." with an animating 12-camera patrol grid on the right. If the page renders as unstyled black-on-white text, see Troubleshooting below.
npm run build
npm start
The build prerenders 129 routes. In the output, every page should be marked ○ (Static)
— only the four /api/* routes should be ƒ (Dynamic). If a content page shows as
ƒ, something has opted it out of static generation (usually headers(), cookies(),
or export const dynamic), and that is a bug worth fixing.
Never run
next buildwhilenext devis running. Both write to.next/, and the build strips the dev server's CSS — leaving a site that looks catastrophically broken but is only a clobbered build directory. Build to a separate directory instead:NEXT_DIST_DIR=.next-probe npx next build
| Symptom | Cause | Fix |
|---|---|---|
| Site renders with no styling at all — plain text on white | next build was run while next dev was running; they share .next/ | Stop the dev server, rm -rf .next, restart it |
Port 3000 is already in use | Another project is on 3000 | npm run dev -- -p 3411 |
ChunkLoadError in the browser console | Known Next dev race — a dynamic chunk was requested before it compiled | Handled automatically by ChunkLoadErrorHandler; the page self-reloads. If it loops, rm -rf .next |
| A Tailwind class has no effect | The value is outside the configured scale — e.g. an opacity stop other than the defaults plus our 15/25 | Add the stop to tailwind.config.ts, or use a configured one |
Form returns "Failed to send message" | ZeptoMail is not configured (ZEPTOMAIL_TOKEN, ZEPTOMAIL_FROM_ADDRESS) or rejected the send; the server log shows the response. Before: no DATABASE_URL — the Prisma write fails. Server log shows Environment variable not found: DATABASE_URL | Expected with no .env. Set DATABASE_URL and run npx prisma db push if you need the forms to work |
| Build fails on a type error | typescript.ignoreBuildErrors is false by design | Run npx tsc --noEmit to see it directly |
| Prisma client errors after editing the schema | Generated client is stale | npx prisma generate |
| Command | What it does |
|---|---|
npm run dev | Dev server with hot reload |
npm run build | prisma generate then production build. Prerenders all 210 pages as static HTML |
npm start | Serve the production build |
npm run lint | Next.js ESLint |
npx tsc --noEmit | Type check. Run before every commit |
npx eslint -c eslint.ssr.config.mjs . | SSR/hydration safety lint. Runs after every build in CI — do not skip |
npx prisma generate | Regenerate the Prisma client (also runs on postinstall) |
npx prisma db push | Push prisma/schema.prisma to the database |
npx shadcn@latest add <name> | Add a shadcn/ui primitive back into components/ui/ |
/api/* routes are dynamic.page.tsx. Editing content means editing React.ai-features, industries, use-cases, guides, platform, virtual-patrolling, compare, partners, camera-connectivity — each a hub page plus spokes, densely cross-linked.DATABASE_URL is set, also write it to four write-only tables. Nothing is read back by the site. Before this, no notification was sent — someone must check the tables.lib/site-config.ts is the single source of truth for company identity, address, phone, email and canonical URL. Never hardcode those anywhere else.lib/seo.ts generates all structured data. Every page emits one schema.org @graph that links back to shared Organization and WebSite nodes.Read these in order. If you only read one, read Adding Pages.
| Doc | Read it when |
|---|---|
CLAUDE.md | You are an AI agent working in this repo — non-negotiable rules and gotchas |
docs/ARCHITECTURE.md | You need to know where things live and why |
docs/ADDING-PAGES.md | You are adding or editing any page. Per-category recipes and copy-paste templates |
docs/SEO-GEO.md | You are writing content, or touching metadata, schema, sitemap or robots |
docs/DESIGN-SYSTEM.md | You are writing UI — tokens, typography, components, motion |
docs/CONTRIBUTING.md | Before your first change — the pre-flight checklist |
docs/DEPLOYMENT.md | You are deploying, or configuring environment variables on Vercel |
docs/SEO-GEO.md § Keyword research and docs/seo/ | You are choosing what a page should be titled or which page to write next |
| Layer | Choice |
|---|---|
| Framework | Next.js 14.2 (App Router) |
| Language | TypeScript 5.2 |
| Styling | Tailwind CSS 3.3 + CSS-variable design tokens |
| UI primitives | shadcn/ui (Radix) — only what is actually used is kept in the repo |
| Motion | framer-motion for reveals and nav; gsap + ScrollTrigger for product mockups |
| Icons | lucide-react |
| Database | PostgreSQL via Prisma 6 — lead capture only |
| Lead notifications | ZeptoMail (Zoho) transactional email API |
| Deploy | Vercel-compatible static output |
origin is github.com/Deutics/camzify-website. main is production and deploys through Vercel; development is the working branch and is merged into main by pull request.app/layout.tsx and is removed by hand when the site leaves maintenance./free-trial describes a trial the business has not confirmed.tsc --noEmit, the production build, and eslint.ssr.config.mjs./trust, and public pricing if rate-card figures are ever to be indexed. Placeholder blocks have been replaced with honest substitute content rather than left visible — see docs/SEO-GEO.md § Honesty rules.docs/seo/ has no difficulty, AI-volume or SERP columns until the account is topped up.public/ holds JPEG sources at 1600px or below plus generated WebP ladders; scripts/optimise-images.py regenerates them and lib/image-manifest.ts. Do not add a PNG or a PSD.docs/AUDIENCE-STRATEGY.md| You want to know who the buyers are and why the partner track leads |
docs/design/ | Design handoffs for the product, not the site (the console sign-in) |