Research moving companies through USDOT and MC identity, FMCSA authority, state mover registrations, regulatory evidence, complaints, safety records, and consumer moving rules. No ranking or marketpla
翻译准备中
生活方式TypeScript · HTMLGitHub @savitz25在线运营者未确认
试用过了吗? 点一下就好,无需登录。
尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证Research moving companies through USDOT and MC identity, FMCSA authority, state mover registrations, regulatory evidence, complaints, safety records, and consumer moving rules. No ranking or marketplace.
翻译准备中
取自仓库 README
正在加载完整 README。 以下为已保存的摘录。
Production domain: https://www.movetrusthub.com
This repo is the source of truth for that domain (Move-trust-Hub → Vercel Move project).
Sibling network repos: Conumers-Trust-Hub (Ask) · Insurance-trust-hub · Lender-Trust-Hub
Network / multi-domain: see docs/NETWORK-DEPLOY.md and docs/NETWORK-PR-CHECKLIST.md.
Post-deploy smoke: npm run smoke:network (production HTTP checks across all four apex domains).
Monorepo paths under app/insurance or app/lender do not deploy Insurance or Lender apex sites. Those domains use the standalone repos above.查看完整 README ↗Production domain: https://www.movetrusthub.com
This repo is the source of truth for that domain (Move-trust-Hub → Vercel Move project).
Sibling network repos: Conumers-Trust-Hub (Ask) · Insurance-trust-hub · Lender-Trust-Hub
Network / multi-domain: see docs/NETWORK-DEPLOY.md and docs/NETWORK-PR-CHECKLIST.md.
Post-deploy smoke: npm run smoke:network (production HTTP checks across all four apex domains).
Monorepo paths under
app/insuranceorapp/lenderdo not deploy Insurance or Lender apex sites. Those domains use the standalone repos above.
The most trusted, transparent directory for comparing interstate moving companies in the United States.
A production-ready, full-stack Next.js 15 website featuring 25+ major movers (Allied, United, North American, JK Moving, etc.), advanced filters, side-by-side comparison, verified reviews, FMCSA licensing data, reputation scoring, interactive coverage maps, educational resources, admin tools, and excellent SEO.
lib/data.ts with seamless fallback from Supabase → local seed dataapp/
layout.tsx # Root layout + SEO metadata + Navbar/Footer
page.tsx # Homepage (hero, stats, top movers, value props)
companies/
page.tsx # Directory (SSR initial data)
[slug]/page.tsx # Dynamic company profile
compare/page.tsx # Comparison tool
admin/page.tsx # Simple CMS-like admin (demo)
api/companies/route.ts
(marketing)/ # Marketing pages (about, contact, resources)
globals.css
sitemap.ts
robots.ts
components/
ui/ # Reusable primitives (button, card, badge, star-rating, dialog...)
directory/
compare/
reviews/
map/
navbar.tsx, footer.tsx
lib/
data.ts # Unified data access (Supabase + seed fallback)
supabase/
utils.ts
data/
seed-companies.ts # 25 high-quality realistic companies
seed-reviews.ts
store/
compare-store.ts # Zustand persisted selection
supabase/
schema.sql # Complete production schema + RLS + indexes
types/
index.ts # Core Company / Review / Filter types
cd interstate-movers-usa
npm install
# Copy contents of supabase/schema.sql into the Supabase SQL Editor and execute
.env.local:NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
# For seeding only (server-side)
SUPABASE_SERVICE_ROLE_KEY=your-service-role-key
npm run seed
If Supabase vars are not present, the site gracefully falls back to the high-quality local seed data (perfect for demos and development).
npm run dev
Visit http://localhost:3000
npm run build — Production build (includes sitemap generation)npm run lintnpm run typechecknpm run seed — Populate Supabase| Variable | Required | Purpose |
|---|---|---|
| NEXT_PUBLIC_SUPABASE_URL | No* | Live data source |
| NEXT_PUBLIC_SUPABASE_ANON_KEY | No* | Public client access |
| SUPABASE_SERVICE_ROLE_KEY | Only for seed | Admin seeding script |
| RESEND_API_KEY | For email leads | Powers quote request notifications via Resend |
| RESEND_FROM | Recommended for prod | Sender address e.g. Move Trust Hub <[email protected]> (requires verified domain in Resend) |
| QUOTE_TEAM_EMAIL | No | Recipient for new quote leads (defaults to [email protected]) |
*Without Supabase the site uses realistic local seed data.
Quote requests from the "Get Free Quotes" modal are:
[Quote Lead Captured]) — 100% reliable for visibilityquote_requests table in Supabase (when the two NEXT_PUBLIC_ keys are set)RESEND_API_KEY is present)To deliver emails to the team (and confirmation to leads):
movetrusthub.com). Follow the DNS instructions (TXT, MX or CNAME records).RESEND_API_KEY (the one you created in Resend)RESEND_FROM="Move Trust Hub <[email protected]>" (or hello@... — must match the verified domain)QUOTE_TEAM_EMAIL if you want a different internal inboxUntil the domain is verified, Resend's test sender ([email protected]) only allows sending to the address associated with your Resend account. External addresses (e.g. [email protected]) will get a 403.
Once verified + envs set, the next form submission will:
The modal always shows success to the user immediately (non-blocking). Check the Network tab or browser console for [Quote Email Sent] logs containing messageIds from Resend for tracking.
Edit data/seed-companies.ts and data/seed-reviews.ts. The data layer will pick it up.
Visit /admin while running. Add/edit/delete. (Session-only until you persist.)
Use the Supabase dashboard or write a small import script. The schema is fully normalized with proper indexes and RLS.
The lib/data.ts file is the single source of truth — extend the functions there when you add new sources (Airtable, CSV, etc.).
sitemap.ts + robots.ts#0A4D8C) + teal accents (#0F766E)The project is already optimized for Vercel (edge functions not required, but easy to add).
The site has been evolved into a customer-focused marketing and lead-generation platform (inspired by moving.com, moveadvisor.com, and movingleads.com) while keeping all the powerful research tools you loved:
The directory, comparison tool, and moving calculator remain core features but are now framed as powerful free tools that help users make better decisions (and naturally lead to quote requests).
In a real production setup you would send these leads to your CRM/email system or a Supabase leads table.
A self-contained, production-ready Moving Size Calculator has been added at /moving-calculator.
items-volume.xlsx).app/moving-calculator/page.tsx (client component)data/furniture.ts (typed + categorized)store/calculator-store.ts (Zustand + persist middleware)components/navbar.tsxCopy these files/folders:
app/moving-calculator/page.tsxdata/furniture.tsstore/calculator-store.ts/moving-calculatorEnsure you have the required dependencies (already in this project):
npm install zustand framer-motion sonner lucide-react
If you don't have shadcn/ui components yet, the page uses:
@/components/ui/*)(Optional) Update app/layout.tsx metadata or add a link in your marketing pages.
The calculator is 100% client-side. No API calls required.
To customize the furniture list: edit data/furniture.ts. Each item needs name, volume (cu ft), and category.
To change move size brackets / recommendations: edit the MOVE_SIZES array inside the page component.
The page is fully functional as /moving-calculator. It matches the trustworthy blue/green design language of the rest of the site.
Run the dev server and visit http://localhost:3000/moving-calculator to test.
All seed data is synthesized to be realistic and representative based on publicly known characteristics of these brands. In a real production site you would regularly refresh from:
Always display fresh "last updated" dates.
Bulk-enriches all mortgage lender profiles with Google Places, BBB, CFPB, and county experience scores. Results are stored in Supabase (lenders table) and exported to data/lender/enrichments.json for static profile pages.
| Variable | Required | Purpose |
|---|---|---|
GOOGLE_PLACES_API_KEY | Recommended | Google Places API (New) — ratings & review snippets |
BBB_API_KEY | Optional | Official BBB partner API (falls back to public scrape) |
SUPABASE_SERVICE_ROLE_KEY | For DB persist | Upsert enriched rows to lenders |
NEXT_PUBLIC_SUPABASE_URL | For DB persist | Lender Supabase project URL |
CRON_SECRET | For scheduled refresh | Auth header for /api/refresh/lenders |
# Apply migration first (Supabase SQL editor or CLI)
# supabase/migrations/20260710190000_lender_enrichment.sql
# Dry-run single lender
npx tsx --require ./scripts/stub-server-only.cjs scripts/enrich-lenders-batch.ts --slug=<lender-slug>
# Dry-run first 10 lenders
npx tsx --require ./scripts/stub-server-only.cjs scripts/enrich-lenders-batch.ts --limit=10
# Live run (writes JSON + Supabase)
npx tsx --require ./scripts/stub-server-only.cjs scripts/enrich-lenders-batch.ts --confirm --mode=full
Process all 647 lenders in batches to respect rate limits:
npx tsx --require ./scripts/stub-server-only.cjs scripts/enrich-lenders-batch.ts --confirm --mode=full --limit=40 --offset=0
npx tsx --require ./scripts/stub-server-only.cjs scripts/enrich-lenders-batch.ts --confirm --mode=full --limit=40 --offset=40
# ... repeat until offset >= 647
vercel.json includes:
/api/refresh/lenders?mode=incremental&limit=40 at 08:00 UTC/api/refresh/lenders?mode=full&limit=80 Sunday 03:00 UTCManual trigger (admin session or cron secret):
curl -H "Authorization: Bearer $CRON_SECRET" "https://www.movetrusthub.com/api/refresh/lenders?mode=incremental&limit=5"
scripts/output/lender-enrichment-*.json/lender/lenders/<slug> and verify Trust Signals section?minRating=4.5&bbbAccredited=true--limit=10 without --confirm should not write filesEducational / informational use. Not affiliated with any listed moving company.
Built with care for customers who deserve transparency when making one of life's biggest and most stressful decisions.
Questions or feedback? Open an issue or email the contact address listed on the site.