尚未收集仓库信息。
尚未检测到更新。GitHub 发布版本后会显示在这里。
制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗The marketing site for Mise, a service execution platform for hotels, built by Focus Realm.
Mise is the service execution platform (SEP) for hotels. It implements the SOPs a hotel already has as timed tasks on staff phones, captures photo and supervisor evidence as the work happens, and compounds it into an audit-ready service record. Not an LMS. No PMS integration required.
Stack:
PLAN.md explains the architecture and the reasons behind it.
| Doc | What it's for |
|---|---|
docs/LAUNCH-CHECKLIST.md | Everything to do before and at launch: Vercel, DNS, email, Search Console, open decisions |
docs/EDITING-THE-BLOG.md | Non-technical guide to Keystatic: publishing posts, adding advisors |
docs/SEO-REPORT.md | Generated crawl report: title, H1, keyword placement and word counts per URL |
docs/GEO-TEST.md | Monthly test of whether AI answer engines cite Mise |
docs/BACKLINKS.md | Prioritised authority plan with paste-ready boilerplate |
docs/current-site-inventory.md | Facts carried over from focusrealm.org |
Requirements: Node 20.9+ and pnpm 10 (corepack enable picks the version pinned in package.json).
pnpm install
cp .env.example .env.local # optional: every key has a safe default for local work
pnpm dev # http://localhost:3000
RESEND_API_KEY, form submissions are accepted and logged to the terminal in development, not emailed.| Command | What it does |
|---|---|
pnpm dev | Development server |
pnpm build | Production build. Afterwards it runs, in order:1. the copy lint (banned vocabulary and confidential terms);2. the image check (every founder and advisor has a portrait);3. IndexNow (production only).Any failure fails the build |
pnpm start | Serve the build |
pnpm lint / pnpm typecheck / pnpm format | ESLint, TypeScript, Prettier |
pnpm test:e2e | Playwright:- every route 200s, with one H1, title ≤ 60, description ≤ 158, self-canonical and valid JSON-LD;- no broken internal links;- GA4 exactly once and consent-gated;- the demo form submits;- reduced motion means no scroll-jacking |
pnpm test:visual | Screenshots every sitemap URL at 390/768/1440/1920 px in the site's single light theme, into qa/screenshots/. Also checks horizontal overflow and runs axe (WCAG 2.2 AA) at 390 and 1440. Summarise with node scripts/qa/visual-summary.mjs |
pnpm lhci | Lighthouse CI on six key pages, mobile then desktop.Performance must be ≥ 95; Accessibility, Best Practices and SEO must be 100 |
pnpm seo:report | Regenerates docs/SEO-REPORT.md from the built HTML |
pnpm check:links | Checks every external link in the built pages; --strict also fails on unverifiable ones |
pnpm audit:copy | Positioning audit (scripts/copy-audit.ts, also run in postbuild and CI): fails if housekeeping appears in a title, H1 or meta description outside its own pages, if the homepage over-weights housekeeping, if any demo CTA is a mailto:, or on the vocabulary and confidential-term bans. Writes docs/COPY-AUDIT.md |
pnpm audit:copy:live | The same audit against every URL in the live sitemap → docs/COPY-AUDIT-LIVE.md |
node scripts/verify-live.mjs | Live deployment verification (domain, headers, positioning, CTAs, GA4 and consent, SEO/GEO, OG images, link crawl) → docs/LIVE-VERIFICATION.md. Add to send one real test request through |
/opt/pw-browsers/chromium when it exists. Elsewhere, run pnpm exec playwright install chromium once, or set CHROME_PATH.pnpm build before test:e2e, test:visual, lhci, seo:report or check:links.Every key, with its purpose, is in .env.example. The ones that matter in production:
| Key | Required? | Purpose |
|---|---|---|
NEXT_PUBLIC_SITE_URL | Recommended | Canonical origin (https://misehotel.com) for canonicals, sitemap, OG and schema |
| — | — | GA4 measurement ID G-KVTTR7P7BY is fixed in lib/analytics.ts (no env override); the Search Console token is in app/layout.tsx (GOOGLE_SITE_VERIFICATION can override it) |
NEXT_PUBLIC_CONTACT_EMAIL, NEXT_PUBLIC_CONTACT_PHONE | No | Public contact details, defaults [email protected] and +91 93221 07991 |
NEXT_PUBLIC_BOOKING_URL | No | Cal.com/Calendly URL; embeds the scheduler on /demo |
RESEND_API_KEY, DEMO_INBOX_EMAIL, RESEND_FROM_EMAIL | Yes, for leads | Email delivery for the /demo form, contact form and newsletter. Every demo CTA goes to /demo. Without a key in production, the form shows an error with a prefilled email fallback to NEXT_PUBLIC_CONTACT_EMAIL instead of dropping the lead |
GOOGLE_SITE_VERIFICATION, BING_SITE_VERIFICATION | At launch | Search Console and Bing Webmaster verification meta tags |
INDEXNOW_KEY | At launch | Pings IndexNow with the sitemap on each production build |
KEYSTATIC_GITHUB_CLIENT_ID, KEYSTATIC_GITHUB_CLIENT_SECRET, KEYSTATIC_SECRET, NEXT_PUBLIC_KEYSTATIC_GITHUB_APP_SLUG | For live CMS editing | Keystatic GitHub mode |
BLOG_SHOW_DRAFTS | No | 1 forces drafts on, 0 forces them off. The default is drafts on everywhere except Vercel Production |
NEXT_PUBLIC_* values are baked in at build time, so redeploy after changing them.
sehejsharm/mise into the sehejsharms-projects team.pnpm install) and build command (pnpm build) are detected automatically. Do not override them.claude/tender-turing-pf2ike.main: merge into it, make it the GitHub default branch, and set Project → Settings → Git → Production Branch to main.vercel.json pins the framework and 301-redirects www.misehotel.com to the apex. Security headers (CSP, HSTS and others) are set in next.config.ts.
In Vercel → Project → Settings → Domains, add misehotel.com and www.misehotel.com, with www redirecting to the apex.
At the domain registrar, create the records Vercel shows. Typically:
| Host | Type | Value |
|---|---|---|
@ (apex) | A | 76.76.21.21 |
www | CNAME | cname.vercel-dns.com |
Use the exact values on Vercel's Domains page if they differ, and delete any older apex A/AAAA records.
Alternatively, point the domain's nameservers at Vercel DNS.
Wait for "Valid Configuration" and the TLS certificate (minutes to a few hours).
Confirm:
curl -sI https://www.misehotel.com → 301 to https://misehotel.com/;https://misehotel.com/sitemap.xml lists https://misehotel.com/… URLs.Then follow docs/LAUNCH-CHECKLIST.md §3–5 (email, Search Console, Bing, IndexNow).
Posts, authors, categories and advisors are edited in Keystatic at /keystatic. The full guide is docs/EDITING-THE-BLOG.md.
content/blog/*.mdoc (Markdoc with YAML front matter);content/authors/*.json, content/categories/*.json, content/advisors/*.json.docs/LAUNCH-CHECKLIST.md §6), and each save redeploys.status is draft or published. Drafts render on local and preview builds only, and are excluded from the production sitemap, RSS and listings.lib/links.ts);Quick path (no code):
/keystatic → Advisors → Add.Best-quality path (developer):
assets/raw/advisors/<slug>.jpg.{ group: "advisors", slug, seo: "<name>-advisory-board-mise" } to PEOPLE and a 4:5 focal box to CROPS in scripts/process-images.mjs.pnpm images. It writes AVIF/WebP at 400/800/1200 px and updates lib/images.manifest.json.content/advisors/<slug>.json with "photo": "advisors/<slug>", or set it in Keystatic.pnpm build.Rules:
app/ routes (App Router)
(site)/ every public page, wrapped in header/footer chrome
api/lead/ demo, contact and newsletter intake (zod, honeypot, rate limit, Resend)
keystatic/ CMS UI; API at app/api/keystatic
og/[key]/ static Open Graph PNGs per page
llms.txt/ llms-full.txt/ sitemap.ts robots.ts
components/ ui primitives, site chrome, home sections, page templates, blog, forms, fx
content/ all copy and data: site.ts (brand, founders, nav) + one typed file per page family
lib/ seo, schema (schema-dts), internal-link engine, markdown renderer, blog reader, analytics, consent, motion
scripts/ copy lint, image pipeline and check, IndexNow, SEO report, link check, QA helpers
tests/ e2e (Playwright) and visual QA
docs/ launch, SEO, GEO, backlinks, CMS docs
content/site.ts holds the canonical definition, founders and contact details. Pages, JSON-LD, OG images and llms.txt all read from it.scripts/copy-lint.mjs), run on every build:
lib/analytics.ts is the only caller of gtag. Nothing is sent before consent.--submit-test-lead/demopnpm images | Re-processes portraits and product screenshots from assets/raw/ into AVIF/WebP with blur placeholders |
pnpm analyze | Bundle analyser |