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.