diff --git a/.github/workflows/deploy-norcalcarbmobile.yml b/.github/workflows/deploy-norcalcarbmobile.yml new file mode 100644 index 0000000..db31385 --- /dev/null +++ b/.github/workflows/deploy-norcalcarbmobile.yml @@ -0,0 +1,22 @@ +name: Deploy NorCal CARB Mobile to Cloudflare + +on: + push: + branches: [main, master] + paths: + - 'workers/norcalcarbmobile/**' + workflow_dispatch: + +jobs: + deploy: + runs-on: ubuntu-latest + name: Deploy norcalcarbmobile + steps: + - uses: actions/checkout@v4 + - name: Deploy to Cloudflare Workers + uses: cloudflare/wrangler-action@v3 + with: + apiToken: ${{ secrets.CLOUDFLARE_API_TOKEN }} + accountId: bafa242dd95d3fdce72540d20accd0a2 + workingDirectory: workers/norcalcarbmobile + command: deploy diff --git a/.github/workflows/scrape-norcalcarbmobile.yml b/.github/workflows/scrape-norcalcarbmobile.yml new file mode 100644 index 0000000..2cce675 --- /dev/null +++ b/.github/workflows/scrape-norcalcarbmobile.yml @@ -0,0 +1,91 @@ +name: Scrape live norcalcarbmobile.com + +# Runs from GitHub's servers (which can reach Squarespace). Mirrors the live +# site and commits the result to this branch so Claude can read the real +# pages. Manual trigger only — no secrets required. + +on: + workflow_dispatch: + +permissions: + contents: write + +jobs: + scrape: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + ref: claude/migrate-squarespace-cloudflare-gqs2e + + - name: Mirror the site with wget + run: | + set -euxo pipefail + mkdir -p workers/norcalcarbmobile/scraped + cd workers/norcalcarbmobile/scraped + rm -rf norcalcarbmobile.com _manifest.txt || true + wget \ + --mirror \ + --convert-links \ + --adjust-extension \ + --page-requisites \ + --no-parent \ + --tries=3 \ + --timeout=45 \ + --wait=1 \ + --random-wait \ + --user-agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.0 Safari/605.1.15" \ + https://norcalcarbmobile.com/ || true + + - name: Also try sitemap + robots (these are often served even when HTML is bot-gated) + run: | + set -euxo pipefail + cd workers/norcalcarbmobile/scraped + curl -sS -A "Mozilla/5.0 Safari/605.1.15" --max-time 30 \ + https://norcalcarbmobile.com/sitemap.xml -o sitemap.xml || true + curl -sS -A "Mozilla/5.0 Safari/605.1.15" --max-time 30 \ + https://norcalcarbmobile.com/robots.txt -o robots.txt || true + + - name: Try the ?format=json trick on the homepage (undocumented but often works) + run: | + set -euxo pipefail + cd workers/norcalcarbmobile/scraped + curl -sS -A "Mozilla/5.0 Safari/605.1.15" --max-time 30 \ + "https://norcalcarbmobile.com/?format=json" -o homepage.json || true + + - name: Manifest — what we got + run: | + set -euxo pipefail + cd workers/norcalcarbmobile/scraped + { + echo "Scrape run at $(date -u +%Y-%m-%dT%H:%M:%SZ)" + echo + echo "== File tree ==" + find . -type f | sort + echo + echo "== File sizes ==" + find . -type f -printf "%s\t%p\n" | sort -n | tail -n +1 + echo + echo "== sitemap.xml head ==" + head -n 40 sitemap.xml 2>/dev/null || echo "(not fetched)" + echo + echo "== robots.txt ==" + cat robots.txt 2>/dev/null || echo "(not fetched)" + echo + echo "== homepage.json size ==" + wc -c homepage.json 2>/dev/null || echo "(not fetched)" + } > _manifest.txt + cat _manifest.txt + + - name: Commit mirror back to branch + run: | + set -euxo pipefail + git config user.name "github-actions[bot]" + git config user.email "41898282+github-actions[bot]@users.noreply.github.com" + git add workers/norcalcarbmobile/scraped/ + if git diff --cached --quiet; then + echo "No changes to commit." + exit 0 + fi + git commit -m "Scrape live norcalcarbmobile.com for migration reference" + git push origin claude/migrate-squarespace-cloudflare-gqs2e diff --git a/workers/norcalcarbmobile/BLOG_PLAN.md b/workers/norcalcarbmobile/BLOG_PLAN.md new file mode 100644 index 0000000..c80a1b7 --- /dev/null +++ b/workers/norcalcarbmobile/BLOG_PLAN.md @@ -0,0 +1,166 @@ +# Blog plan — Easy to edit, content-plentiful + +## Goal + +A blog that: +1. **Is easy** — Bryan edits one HTML file per post in the GitHub web UI. No CMS, no admin, no database. +2. **Has plenty of content** — 30+ posts at launch, growing to 50+ in 90 days. Every post ranks for a real CARB search query. + +## Why not Squarespace's built-in blog? + +Bryan is leaving Squarespace. Keeping the blog there means still paying for a platform we're supposed to be off of. Moving it here means: +- All content on the same domain (entity signals stay consolidated) +- Free (Cloudflare Workers Static Assets) +- Version history built in (GitHub) +- Edit from a phone in the GitHub app + +## File structure + +``` +public/blog/ + index.html # Blog hub — lists all posts with excerpts + what-is-the-clean-truck-check/ + index.html + obd-vs-ovi-j1667-which-do-i-need/ + index.html + carb-penalties-deadlines-2026/ + index.html + [slug]/ + index.html +``` + +Every post follows the same HTML template — header, article, footer. Bryan only edits the `
` body. + +## Per-post template + +```html + + + + {Post Title} | NorCal CARB Mobile Blog + + + + + + + {standard header} +
+
+

{Post Title}

+

By Bryan Gillis · Licensed CARB Tester IF530523 · Published {date}

+ {POST BODY — THE ONLY THING BRYAN EDITS} +
+ +
+ {standard footer} + + +``` + +Bryan's editing surface shrinks to just the `
` body. He can write `

` and `

` tags or paste from Word — everything else stays the same. + +## Content plan — 30+ seed posts + +### Cluster A: "What is" pillars (drives top-of-funnel SEO) +1. What is the CARB Clean Truck Check? +2. What is OBD testing for heavy-duty trucks? +3. What is OVI-J1667 (opacity visible inspection)? +4. What is HD-OBD reporting? +5. What is the CARB Periodic Smoke Inspection Program (PSIP)? +6. What is CARB fleet compliance? + +### Cluster B: "How to" guides (drives mid-funnel) +7. How to prepare your truck for a CARB test +8. How to read a CARB OBD test result +9. How to pass OVI-J1667 on the first try +10. How to schedule a mobile CARB test at your yard +11. How to set up a CARB account for your fleet +12. How to report HD-OBD data to CARB + +### Cluster C: Deadlines & penalties (drives urgency searches) +13. CARB Clean Truck Check deadlines for 2026 +14. CARB penalties for non-compliance (daily fines explained) +15. DMV registration holds for failed CARB tests +16. CARB phase-in schedule by vehicle weight + +### Cluster D: Vehicle-specific (long-tail) +17. CARB testing for motorhomes and RVs +18. CARB testing for agricultural diesel equipment +19. CARB testing for Class 8 semi-trucks +20. CARB testing for dump trucks and construction vehicles +21. CARB testing for school buses + +### Cluster E: City + service pages (programmatic SEO) +22. Mobile CARB test near me — Sacramento guide +23. Mobile CARB test near me — Stockton guide +24. Mobile CARB test near me — Oakland guide +25. Mobile CARB test near me — Modesto guide +26. [+ 15 more cities] + +### Cluster F: Comparisons (AI-search gold) +27. OBD vs OVI-J1667 — which does my truck need? +28. Mobile CARB test vs shop visit — cost, time, hassle +29. BIT vs CARB — what's the difference? +30. CARB vs DMV smog — do I need both? + +### Cluster G: Glossary + FAQ expansions +31. CARB Q&A glossary (100+ term dictionary) +32. Clean Truck Check FAQ (expanded, 30+ Q&A) + +## Post sources + +1. **Squarespace WordPress export** (when Bryan uploads `.xml` to `squarespace-import/`): parse and convert existing posts 1:1. Preserve slug if it ranks; 301 if not. +2. **Net new** (written by Claude, reviewed by Bryan): Cluster A–G above, using real CARB documentation + pricing. +3. **Programmatic from city pages**: every city landing page can be cross-posted as a blog with more depth. + +## How Bryan adds a new post + +1. Go to `github.com/BelichickGillisMusk/github/tree/main/workers/norcalcarbmobile/public/blog` +2. Click **Add file → Create new file** +3. Name it `slug-here/index.html` (the slash creates the folder) +4. Copy any existing post as a template; change title, date, body +5. Commit — auto-deploys in 30 seconds + +He can also edit from the GitHub mobile app. + +## SEO discipline + +Every post: +- Has a unique `` under 60 characters +- Has a unique `<meta description>` 140–160 characters +- Has exactly one `<h1>` +- Has `BlogPosting` schema with Bryan as author (fuses with Person/hasCredential entity) +- Links to at least 2 other internal pages (service or city) +- Opens with the answer in the first paragraph (LLM-quotable) +- Has a clear CTA at the bottom (call or request) + +## Blog hub (`/blog/`) + +- Lists all posts, newest first +- Shows title + 160-char excerpt + date +- `Blog` schema +- Categorized by cluster (A–G) after we have 30+ posts + +## Timeline + +- **Week 1**: Seed 10 pillar posts (Clusters A + C) — foundation +- **Week 2**: Import all Squarespace posts via XML +- **Week 3**: City posts (Cluster E) — 15–20 +- **Week 4**: Remaining clusters (B, D, F, G) + +Total at 30-day mark: **50+ posts**. Every one ranking-ready. diff --git a/workers/norcalcarbmobile/CITATIONS.md b/workers/norcalcarbmobile/CITATIONS.md new file mode 100644 index 0000000..92db51f --- /dev/null +++ b/workers/norcalcarbmobile/CITATIONS.md @@ -0,0 +1,126 @@ +# Citations — Why every design choice + +Every SEO, AI-search, and E-E-A-T decision in this migration maps to an authoritative source. If Google, OpenAI, Anthropic, or CARB publishes the guidance, it's linked here. + +--- + +## 1. AI Search / LLM Readiness + +### robots.txt explicitly allows GPTBot, ClaudeBot, PerplexityBot, Google-Extended, Applebot-Extended + +**Why**: These are the named commercial LLM crawlers. `Google-Extended` is separate from `Googlebot` — it controls whether Google can use the content for AI Overviews and Gemini training. Blocking (or not explicitly allowing) these means your content is invisible to AI answer engines. + +**Sources**: +- OpenAI GPTBot: https://platform.openai.com/docs/gptbot +- Anthropic ClaudeBot: https://support.anthropic.com/en/articles/8896518-does-anthropic-crawl-data-from-the-web-and-how-can-site-owners-block-the-crawler +- Perplexity PerplexityBot: https://docs.perplexity.ai/guides/bots +- Google-Extended: https://developers.google.com/search/docs/crawling-indexing/overview-google-crawlers +- Applebot-Extended: https://support.apple.com/en-us/119829 + +### `/llms.txt` and `/llms-full.txt` + +**Why**: Community-proposed standard for a machine-readable site index (short) and full-text dump (long) tuned for LLM ingestion. Adopted by Anthropic, Cloudflare, Vercel, Perplexity, and others for their own docs. Reduces token cost for LLMs reading your site → more complete citations. + +**Source**: https://llmstxt.org/ + +### Semantic HTML (`<main>`, `<article>`, `<section>`, one `<h1>` per page) + +**Why**: LLMs and accessibility tools parse document structure to decide what content matters. A site built with `<div>` soup looks like noise to a crawler; a site built with semantic tags is pre-labeled. + +**Source**: https://developer.mozilla.org/en-US/docs/Web/HTML/Element/main + +### Answer-first prose + standalone Q&A blocks + +**Why**: LLMs extract and quote self-contained answer blocks. "A mobile CARB test costs $75 for OBD or $250 for OVI-J1667" is quotable. A paragraph that buries the answer after three sentences of context is not. This is the same mechanism Google uses for featured snippets. + +**Source**: https://developers.google.com/search/docs/appearance/featured-snippets + +--- + +## 2. E-E-A-T (Experience, Expertise, Authoritativeness, Trustworthiness) + +### Visible owner name + CARB credential ID + photo above the fold + +**Why**: Google's Search Quality Rater Guidelines require human raters to identify *who is responsible for the website* and *the content creator's credentials*. Missing this lowers the rater score, which trains the ranking algorithm. For YMYL (Your Money or Your Life) categories — and government-regulated testing qualifies — this is a hard requirement. + +**Sources**: +- Search Quality Rater Guidelines (PDF, §2.5 "Reputation of the Website or Content Creator"): https://static.googleusercontent.com/media/guidelines.raterhub.com/en//searchqualityevaluatorguidelines.pdf +- Google Developers E-E-A-T announcement: https://developers.google.com/search/blog/2022/12/google-raters-guidelines-e-e-a-t + +### `Person` schema with `hasCredential` → `EducationalOccupationalCredential` → `recognizedBy: GovernmentOrganization` + +**Why**: The machine-readable version of "licensed by a real government body." Pairs Bryan Gillis (Person) → CARB Tester IF530523 (credential) → California Air Resources Board (recognizing authority). Google uses this to build the Knowledge Graph entry for the business. + +**Sources**: +- Schema.org Person: https://schema.org/Person +- Schema.org EducationalOccupationalCredential: https://schema.org/EducationalOccupationalCredential +- Google Structured Data overview: https://developers.google.com/search/docs/appearance/structured-data + +### `LocalBusiness` schema + Google Business Profile + Search Console all on the same domain + +**Why**: Google fuses entity signals when GBP, Search Console property, and LocalBusiness schema all point at the same domain. Splitting them (GBP on `example.com` but site on `www.example.com` or `get.example.com`) dilutes the entity — Google can't tell if it's one business or two. + +**Sources**: +- LocalBusiness structured data: https://developers.google.com/search/docs/appearance/structured-data/local-business +- Site names in search: https://developers.google.com/search/docs/appearance/site-names +- Google Business Profile help: https://support.google.com/business/answer/9157481 + +### Service-area business (no street address published on GBP) + +**Why**: Google explicitly supports businesses that serve customers at customer locations. Hiding the address on GBP is the *recommended* setting for mobile services — it doesn't hurt ranking, and it puts you in local results for every city in your service area. This is why "they won't accept my address" is a non-problem: don't publish one. + +**Source**: https://support.google.com/business/answer/9157481 + +### NAP (Name-Address-Phone) consistency across site footer + GBP + +**Why**: Inconsistent NAP is the most common cause of entity confusion in local search. Same business name, same phone format, same city spelling — everywhere. + +**Source**: https://developers.google.com/search/docs/appearance/structured-data/local-business + +--- + +## 3. Technical SEO + +### Canonical tags, `sitemap.xml`, 301 redirects from old Squarespace URLs + +**Why**: Prevents duplicate-content dilution during migration. Preserves inbound link equity. + +**Source**: https://developers.google.com/search/docs/crawling-indexing/canonicalization/define-canonical + +### `FAQPage` structured data + +**Why**: Eligible for rich results in Google Search (expandable Q&A in SERP). Directly parsed by Google AI Overviews and ChatGPT for answer extraction. + +**Source**: https://developers.google.com/search/docs/appearance/structured-data/faqpage + +### Core Web Vitals — LCP < 2.5s, CLS < 0.1, INP < 200ms + +**Why**: Google confirmed ranking signal since 2021. Static HTML on Cloudflare's edge network hits all three targets trivially — no framework, no build step, no JS hydration. + +**Source**: https://web.dev/articles/vitals + +--- + +## 4. Industry-Specific + +### OVI-J1667 terminology instead of "smoke test" + +**Why**: SAE J1667 is the international standard for opacity-based visible inspection. CARB documentation uses "OVI" (Opacity Visible Inspection). Using the official term ranks for compliance-literate searchers — fleet managers, DMV-referred customers, owner-operators who know what they need. + +**Sources**: +- SAE J1667 standard: https://www.sae.org/standards/content/j1667_202111/ +- CARB Heavy-Duty I&M program: https://ww2.arb.ca.gov/our-work/programs/heavy-duty-inspection-maintenance-hd-im + +### CARB Clean Truck Check program references + +**Source**: https://ww2.arb.ca.gov/our-work/programs/clean-truck-check-hd-im + +--- + +## 5. Hosting & Editability + +### Cloudflare Workers Static Assets (not inline HTML, not Cloudflare Pages) + +**Why**: Free at this traffic tier (~$0/mo vs. $20/mo Squarespace). Custom domain + TLS included. Global edge caching out of the box. Bryan edits plain `.html` files in the GitHub web UI — no framework, no build step, no terminal. + +**Source**: https://developers.cloudflare.com/workers/static-assets/ diff --git a/workers/norcalcarbmobile/CUTOVER.md b/workers/norcalcarbmobile/CUTOVER.md new file mode 100644 index 0000000..e9c9834 --- /dev/null +++ b/workers/norcalcarbmobile/CUTOVER.md @@ -0,0 +1,117 @@ +# Cutover — the absolute simplest version + +Do these in order. Do **not** skip step 2 (it's the only one that can break email). + +--- + +## Step 1 — Merge this PR (1 click) + +Click the green **Merge pull request** button at the top of this PR. Confirm with **Confirm merge**. That's it. + +**What happens automatically after you click**: GitHub Actions runs `wrangler deploy` and publishes the site to a preview URL like: + +> `https://norcalcarbmobile.<your-account>.workers.dev/` + +The URL shows up under the **Actions** tab once the green check appears (usually 30–60 seconds). + +**Status check**: nothing is on the real domain yet. Squarespace is still serving `norcalcarbmobile.com`. You can take as long as you want to QA before the next step. + +--- + +## Step 2 — Save your email DNS records (5 minutes, IMPORTANT) + +**Why**: You don't want `bryan@norcalcarbmobile.com` to stop receiving mail when DNS flips. + +**Easiest way (no terminal)**: open this link in a new tab: + +> https://mxtoolbox.com/SuperTool.aspx?action=mx%3anorcalcarbmobile.com + +It will show your **MX records**. Take a screenshot. Then run these three more lookups on the same site (change the dropdown to TXT, then DKIM, then DMARC): + +- TXT for `norcalcarbmobile.com` (SPF record) +- DKIM for `norcalcarbmobile.com` (try selectors: `default`, `google`, `s1`, `selector1`) +- DMARC for `norcalcarbmobile.com` + +Screenshot each one. Save them in a folder. You'll need them in step 4. + +--- + +## Step 3 — QA the preview (5–10 minutes) + +Open the preview URL from Step 1. Click around: + +- [ ] Home loads +- [ ] Click "Services" — page loads +- [ ] Click "Service Areas" — page loads, all city sections show up +- [ ] Click "FAQ" — questions all expand/show correctly +- [ ] Click "About" — your name + CARB ID IF530523 visible +- [ ] Click "Contact" — phone + email work as click-to-call/mailto +- [ ] Click any blog post — reads cleanly +- [ ] Click "Call 916-890-4427" on mobile — actually dials + +If anything looks off, reply in chat and I'll fix it. **Do not move to step 4 until preview is good.** + +--- + +## Step 4 — Add the domain to Cloudflare (10 minutes) + +1. Go to https://dash.cloudflare.com/ +2. Top-right: **Add a site** +3. Type `norcalcarbmobile.com` → **Continue** +4. Pick the **Free** plan → **Continue** +5. Cloudflare scans your existing DNS records. **Verify the MX/SPF/DKIM/DMARC records from your screenshots are all there**. If anything is missing, click **Add record** and add it. **For MX and TXT records: keep the cloud icon GREY (DNS only) — not orange.** +6. Cloudflare will give you 2 nameservers like `lola.ns.cloudflare.com` and `walt.ns.cloudflare.com`. Copy them. + +--- + +## Step 5 — Point Squarespace at Cloudflare's nameservers (5 minutes) + +1. Log in to Squarespace. +2. **Settings** → **Domains** → click `norcalcarbmobile.com`. +3. Find **Nameservers** (sometimes called "Use custom nameservers"). +4. Replace Squarespace's nameservers with the two Cloudflare nameservers from step 4. +5. Save. + +DNS takes 5–60 minutes to propagate worldwide. While it's propagating, both Squarespace and Cloudflare may serve traffic depending on the visitor. + +--- + +## Step 6 — Tell me you're at this step + +Reply in chat: "DNS is on Cloudflare". I will then push a one-line change to `wrangler.toml` that attaches the custom domain. After that, `https://norcalcarbmobile.com/` serves the new site within 1–2 minutes (Cloudflare provisions SSL automatically). + +--- + +## Step 7 — Verify email still works + +From your phone or another email account, send an email to `bryan@norcalcarbmobile.com`. Confirm it arrives. If it doesn't, check Cloudflare DNS → confirm MX/SPF/DKIM/DMARC records match the screenshots from step 2. + +--- + +## Step 8 — Post-launch checklist (do over the next 7 days) + +- [ ] Resubmit sitemap in [Google Search Console](https://search.google.com/search-console): add property `norcalcarbmobile.com`, submit `https://norcalcarbmobile.com/sitemap.xml`. +- [ ] In [Google Business Profile](https://business.google.com/), open both Sacramento and Oakland listings → Edit → Website → confirm URL is `https://norcalcarbmobile.com/` → Save (forces a refresh). +- [ ] Update website link on **Yelp**, **BBB**, **Bing Places**, **Apple Business Connect** if they're stale. +- [ ] Send a test invoice or any other workflow that depends on the domain to confirm everything works end-to-end. +- [ ] **+7 days from launch**: cancel Squarespace subscription. Save the cancellation confirmation email. + +--- + +## What I'll handle for you + +- All ongoing site edits (call, email, Slack, or comment in GitHub) +- Wiring native Google Calendar booking on `/api/schedule` +- Adding more blog posts (~30 more queued in BLOG_PLAN.md) +- Adding city-specific landing pages +- Domain transfer to Cloudflare as registrar (saves ~$15/yr) at +30 days + +--- + +## What you decide — not blockers, can flip later + +| Question | Default | Reply with one word to change | +|---|---|---| +| Background color | white | "charcoal" | +| CTA color | red | "green" | +| Font | system | "Inter" | diff --git a/workers/norcalcarbmobile/MIGRATION_ADDENDUM.md b/workers/norcalcarbmobile/MIGRATION_ADDENDUM.md new file mode 100644 index 0000000..8d3766d --- /dev/null +++ b/workers/norcalcarbmobile/MIGRATION_ADDENDUM.md @@ -0,0 +1,158 @@ +# Migration Addendum — Gaps consolidated + +Reconciles this plan with the parallel Manus checklist. Captures every item either side caught, plus things neither caught. + +--- + +## A. Gaps Manus caught that we should add + +### A1. MX records / email continuity (CRITICAL) + +**Risk**: If `norcalcarbmobile.com` has email accounts (`bryan@`, `sales@`, etc.) hosted via Squarespace's Google Workspace integration or any other MX, **changing DNS will break email** unless MX records are preserved. + +**Action before DNS flip**: +1. Run `dig norcalcarbmobile.com MX` and screenshot the output. These are the records that must continue working after cutover. +2. In Cloudflare DNS dashboard, recreate every MX record exactly. Do NOT proxy MX records (orange cloud OFF — grey cloud only for MX, TXT, SPF, DKIM, DMARC). +3. Also preserve: SPF (`TXT v=spf1 ...`), DKIM (`TXT default._domainkey...`), DMARC (`TXT _dmarc...`), and any `_acme-challenge` for Let's Encrypt. +4. **Test before flipping**: send a test email to `bryan@norcalcarbmobile.com` *before* changing nameservers. Confirm receipt. Then change nameservers. + +**If email is Squarespace-hosted**: leaving Squarespace cancels the email plan. Migrate to Cloudflare Email Routing (free, forwards `@norcalcarbmobile.com` → personal Gmail) or Google Workspace direct (~$6/user/mo) **before** cancelling Squarespace. + +### A2. Domain transfer to Cloudflare as registrar (optional, post-launch) + +Manus suggests transferring the domain registration itself to Cloudflare. This is **not required for migration** — we just change nameservers — but worth doing later because: +- Cloudflare charges at-cost renewal (typically $9.77/yr for `.com` vs Squarespace's $25/yr). +- One vendor for DNS + registrar is simpler. + +Sequence: +1. **Now**: change nameservers only (no transfer). Site goes live. +2. **+30 days post-launch**: initiate transfer (ICANN requires 60 days from any prior change). +3. Get auth code from current registrar (Squarespace), enter in Cloudflare, pay transfer fee (which adds 1 year of registration), confirm via email. + +Not blocking the migration. Park as a follow-up. + +--- + +## B. Things this plan has that Manus appears to lack + +Don't lose these in the merge: + +| Item | Why it matters | +|---|---| +| `Person` + `hasCredential` JSON-LD with CARB Tester IF530523 | E-E-A-T signal Google explicitly requires per Search Quality Rater Guidelines §2.5 | +| `LocalBusiness.location` array with Sacramento + Oakland | Google fuses both offices into one entity | +| `/llms.txt` + `/llms-full.txt` | AI search readiness (ChatGPT/Claude/Perplexity) | +| `robots.txt` allowlist for GPTBot/ClaudeBot/PerplexityBot/Google-Extended/Applebot-Extended/CCBot | Without this, AI engines can't quote the site | +| FAQPage schema with 13 self-contained Q&A | Eligible for Google rich results + AI extraction | +| Service-area-business GBP setting (no street address) | Correct configuration for mobile services per Google's own guidance | +| `CITATIONS.md` with sources for every design choice | Defensible — every decision is backed by a Google/OpenAI/Anthropic/CARB doc | +| 30+ post blog plan with cluster strategy | Programmatic SEO scaling | +| OVI-J1667 terminology throughout (not "smoke test") | Ranks for compliance-literate searchers (fleet managers) | + +--- + +## C. Items NEITHER plan caught — add now + +### C1. Cloudflare Turnstile on the contact form +**What**: Free CAPTCHA replacement, invisible by default. Ships with one `<script>` tag + secret in the worker. +**Why**: A `mailto:` link gets harvested. A real form gets spam. Turnstile blocks it without breaking UX. +**When**: Add when we wire up `/api/schedule` (post-launch). + +### C2. Final Squarespace backup before DNS flip +**What**: Run `wget --mirror` one more time the morning of cutover. Commit to `workers/norcalcarbmobile/squarespace-snapshot-final/`. +**Why**: If something breaks 2 weeks after cutover, we have an exact byte-for-byte copy of what was live. (Wayback Machine is unreliable for missed pages.) + +### C3. Wayback Machine "Save Page Now" for top 20 URLs +**What**: Submit each top-trafficked URL to https://web.archive.org/save/ before flipping DNS. +**Why**: Insurance. If a redirect drops a URL, the old version is preserved at archive.org — you can recover content and the URL keeps a snapshot for entity continuity. + +### C4. Google Business Profile post-DNS verification +**What**: After DNS cuts over, log into GBP, click "Refresh" on the website link, confirm GBP can reach the new site at the same domain. Verify both Sacramento and Oakland listings. +**Why**: Sometimes GBP caches a 5xx response from the migration window and de-emphasizes the listing. Forcing a refresh fixes it. + +### C5. NAP cross-update on directories +**What**: Update website link (and address mode if changing to service-area) on: +- Yelp +- BBB +- Google Business Profile (Sac + Oak both) +- Yellow Pages / Yellowpages.com +- Manta +- Foursquare +- Apple Business Connect +- Bing Places +**Why**: `sameAs` in our schema only fuses entity if the directory entries actually match. Stale directory entries with a different phone or address pull the entity apart. + +### C6. CARB / state directory listings +**What**: If CARB or DMV publishes a list of licensed testers, ensure tester ID IF530523 lists `norcalcarbmobile.com`. Same for any compliance directories used by fleet managers. +**Why**: This is the highest-trust backlink possible — a `.gov` or `.ca.gov` link confirming the credential. + +### C7. Plausible or GA4 added day-1 +**What**: Pick analytics before launch. Plausible (~$9/mo, privacy-first, simple) or GA4 (free, complex). Add the script tag to all pages. +**Why**: Without it, the 30/60/90-day KPI table in `MIGRATION_PLAN.md` has no numbers. Search Console alone misses non-search traffic. + +### C8. UptimeRobot or similar monitor +**What**: Free uptime monitor pinging `https://norcalcarbmobile.com/` every 5 minutes. Alerts to Bryan's phone on 4xx/5xx. +**Why**: Cloudflare is reliable, but a wrangler.toml typo could 502 the site overnight. Alert in 5 minutes, not 5 days. + +### C9. Cancellation reminder for Squarespace (calendar item) +**What**: 7 days post-launch → confirm new site is solid → cancel Squarespace subscription. +**Why**: Easy to forget. $20/mo bleed. + +--- + +## D. Stylistic decisions Bryan needs to make (current vs Manus proposal) + +Manus is suggesting a redesign brief (charcoal background, safety-green/yellow CTAs, Inter/Roboto fonts). The current build uses Navy `#002244` + Red `#C60C30` + system fonts. + +| Decision | Current (this branch) | Manus proposal | Recommendation | +|---|---|---|---| +| Background | White `#ffffff` | Charcoal `#0f1b2e` | Charcoal-on-dark looks tougher / industrial. Navy header on white body (current) loads faster and reads better in sunlight on mobile (truck cabs!). **Stick with current** unless you specifically want a dark-mode look. | +| Hero text color | Navy on white | White on charcoal | Same trade-off. Truck drivers searching on bright phones favor light backgrounds. | +| CTA color | Red `#C60C30` | Safety green/yellow | Red has higher conversion globally per CRO research. Safety green/yellow signals "compliance/industrial" — on-brand for CARB. **Either works**; pick by gut. | +| Font | System fonts | Inter or Roboto | System = faster (no FOUT, no extra request). Inter = more modern look. **Stick with system** for Core Web Vitals. | + +If you want the charcoal/safety-green look, one CSS file change flips it — we're not locked in. + +--- + +## E. Updated cutover checklist (combined) + +### Phase 1: Pre-flip (this week) +- [x] Branch with home + CSS + wrangler + worker pushed +- [ ] Push remaining pages (about, services, areas, faq, contact, privacy, terms, 404) +- [ ] Push SEO/config (sitemap, llms, _redirects, _headers, robots) +- [ ] Push blog hub placeholder + first 10 pillar posts +- [ ] Run final `wget --mirror` of Squarespace site → commit to `squarespace-snapshot-final/` +- [ ] Submit top 20 URLs to Wayback Machine +- [ ] **CRITICAL**: screenshot current MX/TXT/DKIM/DMARC records via `dig` +- [ ] Decide email plan: Cloudflare Email Routing (free, forward to Gmail) or Google Workspace (paid) +- [ ] Add Plausible or GA4 script + +### Phase 2: Cutover (the day) +- [ ] Merge migration branch → main → GitHub Actions deploys to `*.workers.dev` +- [ ] QA the preview URL (every link, every form CTA) +- [ ] In Cloudflare dashboard: add `norcalcarbmobile.com` as a site (if not already) +- [ ] Add nameservers from Cloudflare to Squarespace's domain settings +- [ ] **Recreate all MX/SPF/DKIM/DMARC records in Cloudflare DNS — grey cloud only** +- [ ] Send test email → confirm delivery +- [ ] Uncomment `routes = [...]` in `wrangler.toml` → commit → Cloudflare attaches custom domain +- [ ] Verify SSL (Cloudflare Universal SSL auto-provisions — check `https://norcalcarbmobile.com/`) +- [ ] Spot-check 20 old URLs return 301 → 200 + +### Phase 3: Post-flip (Day 0–7) +- [ ] Resubmit `sitemap.xml` to Google Search Console +- [ ] Refresh website link in both GBP listings (Sac + Oak) +- [ ] Update website link on Yelp, BBB, Bing Places, Apple Business Connect +- [ ] PageSpeed Insights check — LCP/CLS/INP green +- [ ] Set up UptimeRobot monitor +- [ ] Calendar reminder: cancel Squarespace +7 days + +### Phase 4: +30 days +- [ ] Initiate domain transfer Squarespace → Cloudflare (saves ~$15/yr renewal) +- [ ] First KPI check vs. baseline (organic clicks, indexed pages, position) +- [ ] Wire up `/api/schedule` with native Google Calendar integration + Turnstile +- [ ] Publish remaining blog posts (Cluster B, D, F, G) + +--- + +*Source review: this addendum incorporates the Manus migration checklist (Phase 2: Domain Transfer; Phase 3: Post-Migration; Part 2: Redesign Brief) plus items neither plan originally caught.* diff --git a/workers/norcalcarbmobile/public/404.html b/workers/norcalcarbmobile/public/404.html new file mode 100644 index 0000000..e857bce --- /dev/null +++ b/workers/norcalcarbmobile/public/404.html @@ -0,0 +1,39 @@ +<!DOCTYPE html> +<html lang="en"> +<head> +<meta charset="UTF-8"> +<meta name="viewport" content="width=device-width, initial-scale=1"> +<title>Page Not Found | NorCal CARB Mobile + + + + + + +

+
+
+

That page moved — or never existed.

+

Try one of these instead, or call us.

+ +
+
+
+
+ diff --git a/workers/norcalcarbmobile/public/_headers b/workers/norcalcarbmobile/public/_headers new file mode 100644 index 0000000..435739f --- /dev/null +++ b/workers/norcalcarbmobile/public/_headers @@ -0,0 +1,28 @@ +# Default security headers for all pages +/* + X-Content-Type-Options: nosniff + X-Frame-Options: SAMEORIGIN + Referrer-Policy: strict-origin-when-cross-origin + Permissions-Policy: camera=(), microphone=(), geolocation=() + Strict-Transport-Security: max-age=31536000; includeSubDomains; preload + +# Long-lived cache for static assets +/assets/* + Cache-Control: public, max-age=31536000, immutable + +# Short cache + correct content types for crawler-facing files +/sitemap.xml + Cache-Control: public, max-age=3600 + Content-Type: application/xml; charset=utf-8 + +/robots.txt + Cache-Control: public, max-age=3600 + Content-Type: text/plain; charset=utf-8 + +/llms.txt + Cache-Control: public, max-age=3600 + Content-Type: text/plain; charset=utf-8 + +/llms-full.txt + Cache-Control: public, max-age=3600 + Content-Type: text/plain; charset=utf-8 diff --git a/workers/norcalcarbmobile/public/_redirects b/workers/norcalcarbmobile/public/_redirects new file mode 100644 index 0000000..a6c7c45 --- /dev/null +++ b/workers/norcalcarbmobile/public/_redirects @@ -0,0 +1,75 @@ +# Squarespace boilerplate → home or contact +/cart / 301 +/checkout / 301 +/booking /contact/ 301 +/book /contact/ 301 +/book-now /contact/ 301 +/book-near-me /contact/ 301 +/contact-us /contact/ 301 +/thank-you /contact/ 301 + +# Service / pricing pages from Squarespace +/mobile-carb-clean-truck-check /services/ 301 +/obd-and-ovi-mobile /services/ 301 +/obd-and-ovi-mobile-1 /services/ 301 +/obd-75-near-me /services/#obd 301 +/j1667-199 /services/#OVI-J1667 301 +/j1667 /services/#OVI-J1667 301 +/motorhome-testing-250 /services/#rv 301 +/motorhome /services/#rv 301 +/carb-agricultural-vehicles /services/#agricultural 301 +/clean-truck-services /services/ 301 +/carb-cost-near-me /services/ 301 + +# Educational pages → FAQ + about +/what-is-clean-truck-check /faq/#what-is-clean-truck-check 301 +/clean-truck-check /faq/#what-is-clean-truck-check 301 +/carb-penalties-deadlines /faq/ 301 +/carb-penalties /faq/ 301 +/compliance-team /about/ 301 +/compliance-app /faq/ 301 +/account-setup /faq/#tester-id 301 +/carb-account-setup /faq/#tester-id 301 +/qa-glossary /faq/ 301 +/glossary /faq/ 301 +/faqs /faq/ 301 + +# City pages from Squarespace → service-areas anchors +/sacramento /service-areas/#sacramento 301 +/stockton /service-areas/#stockton 301 +/modesto /service-areas/#modesto 301 +/roseville /service-areas/#roseville 301 +/lodi /service-areas/#lodi 301 +/tracy /service-areas/#tracy-livermore 301 +/tracy-livermore /service-areas/#tracy-livermore 301 +/hayward /service-areas/#hayward 301 +/fairfield /service-areas/#fairfield 301 +/antioch /service-areas/#antioch 301 +/san-jose /service-areas/#san-jose 301 +/napa /service-areas/#napa 301 +/napa-valley /service-areas/#napa 301 +/oakland /service-areas/#oakland 301 +/bay-area /service-areas/#bay-area 301 +/east-bay /service-areas/#east-bay 301 +/north-bay /service-areas/#north-bay 301 +/butte-county /service-areas/#butte-county 301 +/orange-county /service-areas/#orange-county 301 +/san-diego /service-areas/#san-diego 301 +/carb-service-locations /service-areas/ 301 + +# Reviews / external +/google-reviews-map / 301 +/reviews / 301 + +# Legal +/privacy-policy /privacy/ 301 +/terms-and-conditions /terms/ 301 +/tos /terms/ 301 + +# Squarespace asset paths +/s/* / 301 + +# Misc Squarespace +/new-page / 301 +/member-site / 301 +/norcal-carb-mobile-2026 / 301 diff --git a/workers/norcalcarbmobile/public/about/index.html b/workers/norcalcarbmobile/public/about/index.html new file mode 100644 index 0000000..bfb7d15 --- /dev/null +++ b/workers/norcalcarbmobile/public/about/index.html @@ -0,0 +1,127 @@ + + + + + +About Bryan Gillis — Owner, NorCal CARB Mobile | CARB Tester ID IF530523 + + + + + + + + + + + + + + + + +
+
+
+ +

Bryan Gillis — Owner & Licensed CARB Tester

+

CARB Tester ID IF530523 · Licensed by the California Air Resources Board · Sacramento • Oakland

+
+
+
+
+
+
Bryan Gillis, Owner NorCal CARB Mobile, CARB Tester IF530523
+
+

Who we are

+

NorCal CARB Mobile is a licensed mobile emissions testing company owned and operated by Bryan Gillis. We come directly to your yard, your lot, or your job site — eliminating the cost and downtime of hauling heavy vehicles to a fixed shop.

+

Bryan holds CARB Tester ID IF530523, issued by the California Air Resources Board. Every test NorCal CARB Mobile performs is official, documented, and accepted for California registration, CARB Clean Truck Check compliance, and HD-OBD reporting.

+
Owner
Bryan Gillis
CARB Tester ID
IF530523
Licensing authority
California Air Resources Board
Offices
Sacramento • Oakland
Coverage
Northern California-wide
+
+
+
+
+
+
+

Why a licensed mobile tester?

+
+

Official CARB credential

License ID IF530523 means every result NorCal CARB Mobile issues is a state-recognized document. Not a printout from a third-party app — an official CARB record.

+

We know the regulations

CARB rules change. Clean Truck Check phases in by vehicle weight, model year, and engine family. HD-OBD reporting deadlines. We track this so you don’t have to.

+

Experience with fleets and RVs

From owner-operators to multi-truck fleets, from pickup-towed RVs to Class A motorhomes. If CARB requires it, we can test it.

+

We back our work

Free retest within 150 days on a failed test. If we made an error, we fix it at zero cost. No fine print.

+
+
+
+
+
+

Our offices

+
+

Sacramento

Our primary office, serving the Sacramento Metro, Central Valley (Stockton, Modesto, Lodi), and the I-5 / Hwy 99 corridors north to Butte County.

+

Oakland

East Bay and Bay Area hub, serving Oakland, Hayward, Antioch, Fairfield, San Jose, Napa, North Bay, and extended areas.

+
+

See the full service area list →

+
+
+
+
+

Ready to schedule with Bryan?

+

Call, email, or use the contact form. We respond within the hour during business hours.

+ +
+
+
+ + + diff --git a/workers/norcalcarbmobile/public/assets/site.css b/workers/norcalcarbmobile/public/assets/site.css new file mode 100644 index 0000000..f65b956 --- /dev/null +++ b/workers/norcalcarbmobile/public/assets/site.css @@ -0,0 +1,128 @@ +/* NorCal CARB Mobile — site.css + Manus theme: charcoal #0f1b2e background, safety lime #a3e635 CTAs, Inter font. + Mobile-first, no framework. */ + +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&display=swap'); + +:root { + --navy: #e8edf3; /* primary visible text/border on dark */ + --navy-ink: #e8edf3; /* body text on dark */ + --red: #a3e635; /* safety lime — CTA accent */ + --red-dark: #84cc16; /* darker lime for hover */ + --bg: #0f1b2e; /* page background — deep charcoal */ + --bg-soft: #172238; /* slightly lighter charcoal for alt sections */ + --surface: #1a2840; /* cards / header / footer surface */ + --mute: #9ba8bc; /* muted text */ + --soft: #172238; /* alt section background */ + --line: #2a3a5a; /* borders on dark */ + --on-accent: #0f1b2e; /* dark text on lime button */ + --max: 1100px; +} + +* { box-sizing: border-box; margin: 0; padding: 0; } +html { scroll-behavior: smooth; -webkit-text-size-adjust: 100%; } +body { font-family: Inter, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; color: var(--navy-ink); background: var(--bg); line-height: 1.6; font-size: 17px; } +a { color: var(--red); text-decoration: underline; text-underline-offset: 2px; } +a:hover { color: var(--red-dark); } +img { max-width: 100%; height: auto; display: block; } +.container { max-width: var(--max); margin: 0 auto; padding: 0 20px; } + +.skip { position: absolute; left: -9999px; top: 0; background: var(--surface); color: #fff; padding: 10px 16px; z-index: 9999; } +.skip:focus { left: 10px; top: 10px; } + +.site-header { background: var(--surface); color: #fff; position: sticky; top: 0; z-index: 100; box-shadow: 0 1px 0 rgba(0,0,0,0.5); border-bottom: 1px solid var(--line); } +.site-header a { color: #fff; text-decoration: none; } +.header-inner { display: flex; align-items: center; justify-content: space-between; padding: 14px 0; gap: 16px; flex-wrap: wrap; } +.brand { font-weight: 800; font-size: 18px; letter-spacing: 0.2px; } +.brand small { display: block; font-size: 11px; font-weight: 500; color: var(--mute); letter-spacing: 1.2px; text-transform: uppercase; } +.nav { display: flex; gap: 18px; font-size: 15px; font-weight: 600; flex-wrap: wrap; } +.nav a { padding: 6px 2px; border-bottom: 2px solid transparent; } +.nav a:hover, .nav a[aria-current="page"] { border-bottom-color: var(--red); } +.call-btn { background: var(--red); color: var(--on-accent) !important; padding: 10px 18px; border-radius: 6px; font-weight: 800; text-decoration: none !important; } +.call-btn:hover { background: var(--red-dark); } + +.hero { background: linear-gradient(180deg, var(--bg) 0%, var(--bg-soft) 100%); color: #fff; padding: 64px 0 56px; } +.hero h1 { font-size: clamp(28px, 5vw, 44px); line-height: 1.15; margin-bottom: 14px; font-weight: 800; color: #fff; } +.hero h1 .accent { color: var(--red); } +.hero .lede { font-size: clamp(17px, 2.2vw, 20px); color: var(--mute); max-width: 760px; margin-bottom: 24px; } +.hero .cta-row { display: flex; gap: 12px; flex-wrap: wrap; } +.btn-primary, .btn-secondary { display: inline-block; padding: 14px 26px; border-radius: 8px; font-weight: 700; font-size: 16px; text-decoration: none; transition: transform 0.15s ease; } +.btn-primary { background: var(--red); color: var(--on-accent); } +.btn-primary:hover { background: var(--red-dark); color: var(--on-accent); transform: translateY(-1px); } +.btn-secondary { background: transparent; color: #fff; border: 2px solid #fff; } +.btn-secondary:hover { background: #fff; color: var(--bg); } +.badges { display: flex; gap: 28px; margin-top: 36px; flex-wrap: wrap; color: var(--mute); font-size: 14px; } +.badges strong { color: #fff; display: block; font-size: 16px; } + +.crumbs-hero { font-size: 14px; color: var(--mute); margin-bottom: 16px; } +.crumbs-hero a { color: var(--red); } +.crumbs-hero a:hover { color: var(--red-dark); } + +main section { padding: 56px 0; } +main section.alt { background: var(--soft); } +h2 { font-size: clamp(24px, 3.5vw, 34px); color: #fff; margin-bottom: 12px; font-weight: 800; line-height: 1.2; } +h3 { font-size: 20px; color: #fff; margin-bottom: 8px; font-weight: 700; } +p { margin-bottom: 14px; } +ul, ol { padding-left: 22px; margin-bottom: 14px; } +li { margin-bottom: 6px; } +.sub { color: var(--mute); font-size: 17px; margin-bottom: 32px; max-width: 720px; } + +hr { border: none; border-top: 1px solid var(--line); margin: 40px 0; } + +.grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(260px, 1fr)); gap: 20px; } +.card { background: var(--surface); border: 1px solid var(--line); border-radius: 12px; padding: 24px; transition: box-shadow 0.15s, border-color 0.15s, transform 0.15s; } +.card:hover { box-shadow: 0 4px 16px rgba(163,230,53,0.10); border-color: rgba(163,230,53,0.3); } +.card.alt { background: var(--bg-soft); } +.card h3 { margin-bottom: 8px; } +.card .price { font-size: 24px; color: var(--red); font-weight: 800; margin: 8px 0 4px; } +.card .price small { color: var(--mute); font-size: 13px; font-weight: 500; } + +.about-grid { display: grid; grid-template-columns: 1fr; gap: 32px; align-items: start; } +@media (min-width: 720px) { .about-grid { grid-template-columns: 320px 1fr; gap: 40px; } } +.about-photo img { border-radius: 12px; width: 100%; max-width: 320px; } + +.price-block { margin: 20px 0; padding: 16px 20px; background: var(--surface); border: 1px solid var(--line); border-radius: 8px; display: inline-block; } +.price-lg { font-size: 32px; font-weight: 800; color: var(--red); } +.price-unit { font-size: 14px; color: var(--mute); font-weight: 600; } + +.faq-list .faq-item { border: 1px solid var(--line); border-radius: 10px; padding: 18px 22px; margin-bottom: 14px; background: var(--surface); } +.faq-item h2 { font-size: 20px; color: #fff; margin-bottom: 8px; font-weight: 700; } +.faq-item h3 { margin-bottom: 6px; } +.faq-item p { margin: 0 0 10px; color: var(--navy-ink); } +.faq-item p:last-child { margin-bottom: 0; } +.faq-item ul { margin-bottom: 10px; color: var(--navy-ink); } + +.contact-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(220px, 1fr)); gap: 20px; margin-top: 24px; } +.info-tile { background: var(--surface); border-left: 4px solid var(--red); padding: 18px 20px; border-radius: 6px; } +.info-tile h3 { font-size: 14px; text-transform: uppercase; letter-spacing: 1.2px; color: var(--mute); margin-bottom: 6px; font-weight: 700; } +.info-tile p, .info-tile a { font-size: 20px; font-weight: 700; color: #fff; text-decoration: none; } +.info-tile a:hover { color: var(--red); } + +.callout { background: rgba(163,230,53,0.06); border-left: 4px solid var(--red); padding: 16px 20px; border-radius: 6px; margin: 16px 0; color: var(--navy-ink); } +.callout dl { display: grid; grid-template-columns: auto 1fr; gap: 6px 16px; margin: 0; } +.callout dt { font-weight: 700; color: #fff; font-size: 14px; } +.callout dd { color: var(--navy-ink); font-size: 14px; margin: 0; } + +footer { background: var(--surface); color: var(--mute); padding: 48px 0 24px; border-top: 1px solid var(--line); } +footer a { color: #fff; text-decoration: none; } +footer a:hover { text-decoration: underline; color: var(--red); } +.footer-grid { display: grid; grid-template-columns: repeat(auto-fit, minmax(180px, 1fr)); gap: 32px; margin-bottom: 32px; } +.footer-grid h4 { color: #fff; font-size: 14px; text-transform: uppercase; letter-spacing: 1.2px; margin-bottom: 12px; } +.footer-grid ul { list-style: none; padding: 0; } +.footer-grid li { margin-bottom: 8px; font-size: 15px; } +.footer-bottom { border-top: 1px solid var(--line); padding-top: 20px; font-size: 13px; color: var(--mute); line-height: 1.9; } + +.center { text-align: center; } +.muted { color: var(--mute); } +.tight { max-width: 760px; margin-left: auto; margin-right: auto; } + +table { color: var(--navy-ink); width: 100%; border-collapse: collapse; } +table th { color: #fff; text-align: left; padding: 8px; } +table td { padding: 8px; } +table tr { border-bottom: 1px solid var(--line); } + +@media (max-width: 640px) { + .site-header .nav { gap: 12px; font-size: 14px; } + .badges { gap: 18px; } + main section { padding: 40px 0; } +} diff --git a/workers/norcalcarbmobile/public/blog/_template.html b/workers/norcalcarbmobile/public/blog/_template.html new file mode 100644 index 0000000..92b4e32 --- /dev/null +++ b/workers/norcalcarbmobile/public/blog/_template.html @@ -0,0 +1,53 @@ + + + + + + + +POST TITLE | NorCal CARB Mobile Blog + + + + + + + + + + + + +
+
+ + +

POST TITLE

+

Bryan Gillis · Licensed CARB Tester IF530523 · Published May 5, 2026

+
+
+ +
+

Lead with the answer. Then explain.

+

Subheading

+

Body paragraph.

+
+
+

Call to Schedule — 916-890-4427

+
+
+
+ diff --git a/workers/norcalcarbmobile/public/blog/carb-penalties-for-non-compliance/index.html b/workers/norcalcarbmobile/public/blog/carb-penalties-for-non-compliance/index.html new file mode 100644 index 0000000..a714616 --- /dev/null +++ b/workers/norcalcarbmobile/public/blog/carb-penalties-for-non-compliance/index.html @@ -0,0 +1,50 @@ + + + + + +CARB Penalties for Non-Compliance | NorCal CARB Mobile + + + + + + + + + + +
+

CARB penalties for non-compliance

Bryan Gillis · Licensed CARB Tester IF530523 · May 5, 2026

+
+

Short answer: A missed CARB test costs more than the test. Fines start at $1,000 per day. DMV blocks your registration. Repeat violations stack and trigger fleet-level audits. Skipping a $75 OBD or $250 OVI-J1667 to save money is the most expensive savings move you can make.

+

1. Daily fines

+

$1,000 per day, per vehicle, accruing from the missed compliance date. CARB does not need to catch you in the act — the database knows when your test was due. Most fines are assessed retroactively after the fact.

+

2. DMV registration hold

+

This is the immediate, automatic penalty. If your truck isn't compliant in CARB's system, DMV will not renew the registration. The truck can't legally operate until you fix it. As of 2026, the hold extends to trailers in some cases.

+

3. Roadside out-of-service order

+

CHP and CARB inspectors can pull a non-compliant truck off the road on the spot. Driver loses the load. Carrier loses the customer.

+

4. Fleet audits

+

Repeat non-compliance across multiple vehicles in a fleet triggers a CARB audit. Auditors review every vehicle, every test record, and every emissions repair. Audits typically last weeks and result in cumulative fines.

+

5. Reputation cost

+

Major shippers (Walmart, Amazon, Target, etc.) and freight brokers require carriers to be CARB-compliant before tendering loads. A non-compliance flag on the truck can lock you out of contracts.

+

The math

+ + + + + + + +
ScenarioCost
OBD test on time$75
OVI-J1667 on time$250
Missed by 30 days$30,000 + DMV hold
Fleet of 10 trucks, 30 days late$300,000 + audit risk
+

Don't be the sample in row 4.

+
+

Call 916-890-4427

+

Related

+ +
+
+
+ diff --git a/workers/norcalcarbmobile/public/blog/carb-testing-for-motorhomes-and-rvs/index.html b/workers/norcalcarbmobile/public/blog/carb-testing-for-motorhomes-and-rvs/index.html new file mode 100644 index 0000000..c3b0a9e --- /dev/null +++ b/workers/norcalcarbmobile/public/blog/carb-testing-for-motorhomes-and-rvs/index.html @@ -0,0 +1,41 @@ + + + + + +CARB Testing for Motorhomes and RVs | NorCal CARB Mobile + + + + + + + + + + +
+

CARB testing for motorhomes and RVs

Bryan Gillis · Licensed CARB Tester IF530523 · May 5, 2026

+
+

Short answer: Diesel motorhomes (Class A, B, C) and diesel RVs operating in California are subject to CARB Clean Truck Check rules just like commercial trucks. The same engine-year rule applies: 2013+ needs OBD ($75), pre-2013 needs OVI-J1667 ($250). Some need both.

+

Who's covered

+
  • Class A diesel pushers (Newmar, Tiffin, Entegra, Foretravel, etc.)
  • Class C diesel (Mercedes Sprinter chassis, Ford E-450 with diesel option)
  • Diesel-powered Class B conversions
  • Toy haulers on a diesel chassis
+

Gas-powered RVs are not under Clean Truck Check (they go through DMV smog if applicable). Towed RVs without their own engine don't need testing — just the tow vehicle.

+

What's different about RVs

+

Three things to know:

+
  1. Storage location matters. If your RV lives in storage 350 days a year, it still needs testing during the days it's on California roads. We can come to the storage lot.
  2. OBD ports are sometimes hidden. RV builders bury the dash port behind trim panels. We've seen them all. Have the manual handy if you know it's tricky.
  3. Smoke testing on Class A is loud. Snap-acceleration on a 400hp Cummins is dramatic. Pick a time/place that works for the campsite.
+

Pricing

+
  • OBD only (2013+ engine): $75
  • OVI-J1667 only (pre-2013 engine): $250
  • Both: $325 (combined)
+

Same retest policy applies: free retest within 150 days on fail.

+

Where we test

+

Storage facilities, RV parks, dealerships, your driveway. Anywhere accessible in Northern California from our Sacramento or Oakland office.

+
+

Schedule RV Testing — 916-890-4427

+

Related

+ +
+
+
+ diff --git a/workers/norcalcarbmobile/public/blog/clean-truck-check-deadlines-2026/index.html b/workers/norcalcarbmobile/public/blog/clean-truck-check-deadlines-2026/index.html new file mode 100644 index 0000000..9a754f9 --- /dev/null +++ b/workers/norcalcarbmobile/public/blog/clean-truck-check-deadlines-2026/index.html @@ -0,0 +1,40 @@ + + + + + +CARB Clean Truck Check Deadlines for 2026 | NorCal CARB Mobile + + + + + + + + + + +
+

CARB Clean Truck Check deadlines for 2026

Bryan Gillis · Licensed CARB Tester IF530523 · May 5, 2026

+
+

Short answer: Clean Truck Check is fully phased in for 2026 — every heavy-duty diesel truck operating in California (GVWR 14,001 lbs+) must be tested twice per year. Compliance is enforced by DMV registration holds. The state can also assess fines starting at $1,000 per day for non-compliance.

+

The 2026 testing cycle

+

Most fleets are now on a twice-yearly cadence:

+
  • One full OBD test (2013+) or OVI-J1667 (pre-2013) by a licensed tester (us)
  • One self-reported submission via CARB's online portal between licensed tests
+

Specific deadlines fall on a 6-month rolling window from the previous compliance date. Set a calendar reminder for the same day every 6 months. Or just call us — we track your fleet's dates if we tested it last cycle.

+

What changed in 2026

+
  • Roadside camera enforcement expanded — more readers along major freight corridors (I-5, I-80, I-880)
  • Fines now stack daily for repeat non-compliance instead of per-incident
  • DMV holds now block trailer registration too, not just power unit registration
  • Some out-of-state carriers operating >5 days per year in CA are pulled into compliance
+

What happens if you miss

+
  • DMV registration hold (truck can't be re-registered until compliant)
  • $1,000/day fine assessed by CARB after notice
  • Possible roadside out-of-service order during inspection
  • Reputation damage with brokers and shippers who require compliance docs
+

How to stay ahead

+

For owner-operators: book your test 60 days before the compliance date. For fleets: schedule a recurring quarterly visit — we test all your trucks in one stop. Get on the calendar.

+
+

Call 916-890-4427

+

Related

+ +
+
+
+ diff --git a/workers/norcalcarbmobile/public/blog/how-to-prepare-for-a-carb-test/index.html b/workers/norcalcarbmobile/public/blog/how-to-prepare-for-a-carb-test/index.html new file mode 100644 index 0000000..484c895 --- /dev/null +++ b/workers/norcalcarbmobile/public/blog/how-to-prepare-for-a-carb-test/index.html @@ -0,0 +1,44 @@ + + + + + +How to Prepare Your Truck for a CARB Test | NorCal CARB Mobile + + + + + + + + + + +
+

How to prepare your truck for a CARB test

Bryan Gillis · Licensed CARB Tester IF530523 · May 5, 2026

+
+

Most CARB test failures are avoidable. Here's a 5-step checklist that gets the majority of trucks through on the first try.

+

1. Drive at least one full duty cycle the day before

+

If you cleared codes recently or had work done, the truck's readiness monitors need to complete before an OBD test will pass. A drive cycle is roughly: cold start, 15+ minutes of mixed driving with at least one highway pull, then a normal shutdown. Plug in a scan tool and check that all monitors say "ready" before we arrive.

+

2. Don't clear codes in the week before

+

Some operators try to clear the Check Engine light hoping the issue is gone. CARB's tool detects recently cleared modules — it'll fail you for that alone. If you have an active code, fix the underlying issue, then drive the truck enough to verify it's actually resolved before the test.

+

3. DEF tank topped off and DEF system functional

+

Diesel Exhaust Fluid (DEF) systems are a top failure point. Make sure:

+
  • DEF tank is at least 1/4 full
  • DEF quality light isn't lit
  • DEF dosing system isn't throwing inducement codes
+

Bad DEF or a failing dosing module = OBD failure.

+

4. For OVI-J1667: warm up the engine first

+

Cold engines smoke. Drive the truck for 20-30 minutes before we arrive, or at minimum let it idle to operating temperature. The opacity reading on a cold truck will be artificially high and you'll fail something you'd otherwise pass.

+

5. Have the truck accessible

+

Sounds obvious, but: park where we can get the OBD port (driver's seat side, usually under the dash) or the exhaust stack reachable. Make sure batteries are charged. If we show up to a dead truck or a truck buried in a yard, the visit gets billed even if we can't test.

+

Bonus: have your VIN and registration ready

+

Speeds up the visit. We need them for the report.

+
+

Schedule a Test — 916-890-4427

+

Related

+ +
+
+
+ diff --git a/workers/norcalcarbmobile/public/blog/index.html b/workers/norcalcarbmobile/public/blog/index.html new file mode 100644 index 0000000..709a092 --- /dev/null +++ b/workers/norcalcarbmobile/public/blog/index.html @@ -0,0 +1,48 @@ + + + + + +NorCal CARB Mobile Blog — CARB Testing, Clean Truck Check, Compliance + + + + + + + + + + + + + + + + +
+

Blog — CARB Testing, Clean Truck Check & Compliance

Plain-English answers on CARB rules, deadlines, and what your truck or fleet actually needs. Written by licensed CARB Tester IF530523.

+
+

What is the CARB Clean Truck Check?

May 5, 2026 · Bryan Gillis

California's mandatory emissions testing program for heavy-duty diesel trucks. Who has to comply, what's tested, what it costs, and what happens if you don't.

+ +

What is OVI-J1667 (Smoke / Opacity Testing)?

May 5, 2026 · Bryan Gillis

Opacity Visible Inspection per SAE J1667. The official term for what most people call a "smoke test." Required for pre-2013 heavy-duty diesel. Cost: $250.

+ +

What is HD-OBD reporting?

May 5, 2026 · Bryan Gillis

HD-OBD reporting is the electronic submission of OBD test data to CARB. We handle this as part of every test — here's what's actually transmitted.

+ + + + + +

More posts coming weekly. Topics queued: vehicle-specific guides (semi-trucks, dump trucks, school buses), city-specific testing guides, glossary, and CARB Q&A expansions.

+
+

Need a test now?

Skip the reading. Call us, get a confirmed appointment in the hour.

+
+ + diff --git a/workers/norcalcarbmobile/public/blog/mobile-carb-test-vs-shop-visit/index.html b/workers/norcalcarbmobile/public/blog/mobile-carb-test-vs-shop-visit/index.html new file mode 100644 index 0000000..77f029e --- /dev/null +++ b/workers/norcalcarbmobile/public/blog/mobile-carb-test-vs-shop-visit/index.html @@ -0,0 +1,48 @@ + + + + + +Mobile CARB Test vs Shop Visit — Cost, Time, Hassle | NorCal CARB Mobile + + + + + + + + + + +
+

Mobile CARB test vs shop visit — cost, time, hassle

Bryan Gillis · Licensed CARB Tester IF530523 · May 5, 2026

+
+

Short answer: Hauling a Class 8 truck to a brick-and-mortar shop just to plug into the OBD port costs more in downtime than the test. Mobile testing eliminates the trip and the wait.

+

The honest cost comparison

+ + + + + + + + + +
Cost componentShop visitMobile test
Test fee$95-$150$75 OBD / $250 OVI
Drive time (round trip)1-2 hrs @ $80/hr = $80-160$0
Driver cost during wait$30-50 (sitting in shop)$0 (driver works)
Fuel for trip$30-60$0
Lost load opportunityHalf-day = $200-400$0 (truck stays loaded)
Real total$435-820$75-250
+

The mobile test is cheaper even before you factor in the hassle.

+

For fleets, the gap is bigger

+

Sending 10 trucks to a shop one at a time = 10 trips = ~5 days of cumulative downtime. Mobile fleet visit = one morning at your yard, all 10 trucks tested. The math is brutal in your favor.

+

Are mobile results equivalent?

+

Yes. Identical. Mobile testers use the same CARB-licensed equipment and the same HD-OBD reporting interface. Tester ID IF530523 issues an official, state-recognized result. Nothing about "mobile" makes the test less valid.

+

When you'd still go to a shop

+
  • You're already at the shop for repairs. Test while you're there.
  • You don't have a safe outdoor spot to do the test. (Rare — most yards work.)
  • You don't trust mobile services because someone burned you once. Fair. Try us once and we'll change your mind.
+
+

Schedule Mobile Testing — 916-890-4427

+

Related

+ +
+
+
+ diff --git a/workers/norcalcarbmobile/public/blog/obd-vs-ovi-j1667/index.html b/workers/norcalcarbmobile/public/blog/obd-vs-ovi-j1667/index.html new file mode 100644 index 0000000..9298e05 --- /dev/null +++ b/workers/norcalcarbmobile/public/blog/obd-vs-ovi-j1667/index.html @@ -0,0 +1,44 @@ + + + + + +OBD vs OVI-J1667 — Which CARB Test Does My Truck Need? | NorCal CARB Mobile + + + + + + + + + + +
+

OBD vs OVI-J1667 — which does my truck need?

Bryan Gillis · Licensed CARB Tester IF530523 · May 5, 2026

+
+

Short answer: Look at the engine model year on the emissions sticker under the hood (not the truck registration year).

+
  • 2013 or newer engine → OBD testing ($75)
  • Pre-2013 engine → OVI-J1667 smoke/opacity testing ($250)
  • Some compliance programs (PSIP audits, fleet inspections) → both
+

Don't have the sticker handy? Call us with the VIN, we'll confirm in a minute.

+

Why the cutoff is 2013

+

2013 is when CARB required all heavy-duty diesel engines to have full HD-OBD compliance — meaning the ECM tracks emissions performance in real time and stores diagnostic codes for any failure. Before that, OBD wasn't standardized enough across manufacturers to be a reliable compliance tool, so CARB used opacity (OVI-J1667) instead.

+

When you might need both

+
  • Roadside Periodic Smoke Inspection Program (PSIP) audit — CARB occasionally requires a smoke test even on a 2013+ truck
  • Failed OBD that pointed to a smoke-causing issue — the agent may want OVI confirmation that the repair worked
  • Fleet compliance audit — some fleet rules require both as a baseline
+

Cost / time comparison

+ + + + + +
TestCostTimeEngine year
OBD$7515-20 min2013+
OVI-J1667$25020-30 minPre-2013
+

RVs and motorhomes follow the same engine-year rule. More on RV testing.

+
+

Call 916-890-4427

+

Related

+ +
+
+
+ diff --git a/workers/norcalcarbmobile/public/blog/what-is-hd-obd-reporting/index.html b/workers/norcalcarbmobile/public/blog/what-is-hd-obd-reporting/index.html new file mode 100644 index 0000000..393dadb --- /dev/null +++ b/workers/norcalcarbmobile/public/blog/what-is-hd-obd-reporting/index.html @@ -0,0 +1,40 @@ + + + + + +What is HD-OBD Reporting? | NorCal CARB Mobile + + + + + + + + + + +
+

What is HD-OBD reporting?

Bryan Gillis · Licensed CARB Tester IF530523 · May 5, 2026

+
+

Short answer: HD-OBD reporting is the electronic submission of heavy-duty on-board diagnostic test data to CARB's database. Under Clean Truck Check, OBD results have to be transmitted electronically — a paper printout doesn't count anymore. NorCal CARB Mobile handles this submission as part of every OBD test.

+

What gets transmitted

+

For each OBD test, the licensed tester's tool sends CARB:

+
  • VIN and license plate
  • Engine identifier (engine model, family, calibration ID)
  • Active and pending diagnostic trouble codes (DTCs)
  • Readiness monitor status (which emissions self-tests have completed)
  • MIL (malfunction indicator lamp) status
  • Tester ID, date, and location
+

This is the same data CARB engineers analyze when they're auditing fleet emissions performance.

+

Why it replaced paper

+

Paper smog certificates can be forged, lost, or backdated. Electronic reporting goes straight from the licensed tester's tool into CARB's database. The vehicle is updated as compliant within minutes — no waiting on mail, no walking paperwork into the DMV.

+

What it means for you

+

Nothing extra. We do it. As soon as the test passes, your truck shows compliant in CARB's system. If you ever need proof, the record is there.

+

What if reporting fails

+

Cell or WiFi at your yard goes down? The data is queued and submitted as soon as we have a signal. The test is still valid — reporting is the delivery mechanism, not the test itself.

+
+

Call 916-890-4427

+

Related

+ +
+
+
+ diff --git a/workers/norcalcarbmobile/public/blog/what-is-obd-testing/index.html b/workers/norcalcarbmobile/public/blog/what-is-obd-testing/index.html new file mode 100644 index 0000000..2b82f71 --- /dev/null +++ b/workers/norcalcarbmobile/public/blog/what-is-obd-testing/index.html @@ -0,0 +1,42 @@ + + + + + +What is OBD Testing for Heavy-Duty Trucks? | NorCal CARB Mobile + + + + + + + + + + +
+

What is OBD testing for heavy-duty trucks?

Bryan Gillis · Licensed CARB Tester IF530523 · May 5, 2026

+
+

Short answer: OBD (on-board diagnostic) testing reads emissions data and fault codes directly from a truck's engine control module. It's required for 2013 and newer heavy-duty diesel vehicles under CARB's Clean Truck Check. The test costs $75 per vehicle and takes about 15-20 minutes.

+

What we actually do

+

A licensed CARB tester (CARB ID IF530523) connects an OBD scan tool to the OBD port — same port the dealer uses for diagnostics, usually under the dash. The tool pulls:

+
  • Emissions-related fault codes (DTCs)
  • Readiness monitor status (whether emission systems have run their self-tests)
  • Engine identification (engine model, family, calibration ID)
+

The data is submitted electronically to CARB's database — this is called HD-OBD reporting. More on HD-OBD here.

+

Pass or fail

+

You pass if there are no active emissions fault codes and the readiness monitors are complete. You fail if:

+
  • An emissions DTC is active (Check Engine light territory)
  • Required readiness monitors haven't run (truck hasn't been driven enough)
  • The MIL (malfunction indicator) has been commanded on for an emissions reason
+

If you fail, fix the issue — typically a sensor, EGR valve, DPF, or DEF system component — and we'll retest free within 150 days.

+

Why it's required

+

Modern diesel engines are heavily emissions-controlled. CARB wants confirmation that the controls (DPF, SCR, EGR) are still working as designed. Reading the OBD codes is the fastest, most accurate way to verify that.

+

Cost and time

+
  • $75 per vehicle at your location
  • 15-20 minutes per truck
  • Documentation issued on-site
  • Free retest within 150 days on fail
+
+

Schedule OBD Testing — 916-890-4427

+

Related

+ +
+
+
+ diff --git a/workers/norcalcarbmobile/public/blog/what-is-ovi-j1667/index.html b/workers/norcalcarbmobile/public/blog/what-is-ovi-j1667/index.html new file mode 100644 index 0000000..10b29d6 --- /dev/null +++ b/workers/norcalcarbmobile/public/blog/what-is-ovi-j1667/index.html @@ -0,0 +1,41 @@ + + + + + +What is OVI-J1667 (Smoke / Opacity Testing)? | NorCal CARB Mobile + + + + + + + + + + +
+

What is OVI-J1667 (Smoke / Opacity Testing)?

Bryan Gillis · Licensed CARB Tester IF530523 · May 5, 2026

+
+

Short answer: OVI-J1667 is the Opacity Visible Inspection performed to SAE standard J1667. A licensed tester does a snap-acceleration test and measures exhaust opacity with calibrated equipment. It's the official version of what most people call a "smoke test" — required for pre-2013 heavy-duty diesel vehicles. Cost: $250 per vehicle.

+

Why "OVI-J1667" and not just "smoke test"

+

SAE International published J1667 as the standard procedure for measuring exhaust opacity on heavy-duty diesel engines. CARB adopted it for the Periodic Smoke Inspection Program (PSIP) and Clean Truck Check. "OVI" is CARB's terminology — Opacity Visible Inspection. Same procedure, formal name. If your truck is being inspected to J1667, you're getting an OVI.

+

How the test works

+
  1. Truck warmed up to operating temperature
  2. Tester clamps an opacity meter probe onto the exhaust stack
  3. Three snap-accelerations from idle to full throttle, no load
  4. Opacity meter records peak opacity for each acceleration
  5. Pass/fail determined by averaging the readings against the CARB threshold for that model year and engine
+

Total time: 20-30 minutes once the truck is warm.

+

What you get

+

An official SAE J1667 test report with:

+
  • Opacity readings for each acceleration
  • Vehicle identification (VIN, plate, engine)
  • Tester ID (IF530523) and signature
  • Pass/fail determination
+

Accepted by CARB and DMV. Free retest within 150 days on fail.

+

Who needs OVI-J1667 vs OBD

+

Pre-2013 engines = OVI-J1667. 2013+ = OBD. Full breakdown here.

+
+

Schedule OVI-J1667 — 916-890-4427

+

Related

+ +
+
+
+ diff --git a/workers/norcalcarbmobile/public/blog/what-is-the-clean-truck-check/index.html b/workers/norcalcarbmobile/public/blog/what-is-the-clean-truck-check/index.html new file mode 100644 index 0000000..1b4f839 --- /dev/null +++ b/workers/norcalcarbmobile/public/blog/what-is-the-clean-truck-check/index.html @@ -0,0 +1,44 @@ + + + + + +What is the CARB Clean Truck Check? | NorCal CARB Mobile + + + + + + + + + + +
+

What is the CARB Clean Truck Check?

Bryan Gillis · Licensed CARB Tester IF530523 · May 5, 2026

+
+

Short answer: The CARB Clean Truck Check is California's mandatory emissions testing program for heavy-duty diesel trucks (GVWR 14,001 lbs or more). It requires either OBD testing or OVI-J1667 (smoke/opacity) testing depending on model year. Penalties for non-compliance start at $1,000 per day.

+

Who has to comply

+

Almost every heavy-duty diesel truck operating in California. The rule covers:

+
  • Truck tractors, single-unit trucks, and buses with a GVWR of 14,001 lbs or more
  • Vehicles registered in California and vehicles registered out of state but operating in California
  • Class A, B, and C diesel motorhomes
  • Some agricultural and off-road equipment under separate CARB rules
+

Light-duty vehicles (under 14,001 lbs GVWR) are not part of Clean Truck Check — those go through DMV smog.

+

What's actually tested

+

The test depends on your truck's model year:

+
  • 2013 and newer engines: OBD testing ($75). A licensed tester plugs into the OBD port, reads the emissions data and any fault codes, and submits the results to CARB electronically (HD-OBD reporting).
  • Pre-2013 engines: OVI-J1667 testing ($250). The licensed tester performs a snap-acceleration test and measures exhaust opacity to SAE J1667 standard.
+

How often

+

Twice per year for most trucks (one OBD/OVI test plus one self-reported submission), phased in by weight class and engine model year. The program ramped up between 2024 and 2026.

+

What happens if you fail

+

You get an official failure report listing the cause (a fault code, smoke level, or both). Repair the issue, and we can retest free within 150 days. If you ignore the failure, expect a registration hold at DMV and daily fines from CARB.

+

Why mobile testing

+

The whole point of Clean Truck Check is on-the-road compliance. Hauling a Class 8 truck to a brick-and-mortar shop just to plug into the OBD port costs more in downtime than the test itself. We come to your yard, depot, or job site and have you back to work in 20 minutes.

+
+

Need a test?

+

Call 916-890-4427 or request online.

+

Related

+ +
+
+
+ diff --git a/workers/norcalcarbmobile/public/contact/index.html b/workers/norcalcarbmobile/public/contact/index.html new file mode 100644 index 0000000..f1bf034 --- /dev/null +++ b/workers/norcalcarbmobile/public/contact/index.html @@ -0,0 +1,93 @@ + + + + + +Contact NorCal CARB Mobile — Schedule a Mobile CARB Test | 916-890-4427 + + + + + + + + + + + + + + + + +
+
+
+ +

Contact NorCal CARB Mobile

+

Call to schedule, ask a question, or get a fleet quote. We respond within the hour during business hours.

+
+
+
+
+
+ + +

Hours

Mon–Fri 6am–5pm
Saturday 8am–4pm
Closed Sunday

+

Offices

Sacramento
Oakland

+
+
To schedule fastest: have your VIN(s) ready and the location where vehicles will be tested. We confirm timing within the hour.
+

Send a request

+

Email sales@norcalcarbmobile.com with:

+
    +
  • Number of vehicles
  • +
  • Vehicle model years (or VINs if you have them)
  • +
  • Your location (city + ZIP, or address for fleet visit)
  • +
  • Preferred time window
  • +
  • Phone number for confirmation
  • +
+

We’ll respond with a confirmed appointment, or call to discuss if anything needs clarification.

+

An online booking form with calendar availability is in progress. Until then, call or email is fastest.

+
+
+
+
+

Or just call

+

Fastest path to a confirmed appointment.

+ +
+
+
+ + + diff --git a/workers/norcalcarbmobile/public/faq/index.html b/workers/norcalcarbmobile/public/faq/index.html new file mode 100644 index 0000000..22f2f6a --- /dev/null +++ b/workers/norcalcarbmobile/public/faq/index.html @@ -0,0 +1,106 @@ + + + + + +CARB Testing FAQ — Mobile Smog & Emissions Testing Questions | NorCal CARB Mobile + + + + + + + + + + + + + + + + +
+
+
+ +

CARB Testing FAQ

+

Common questions about OBD testing, OVI-J1667 (smoke/opacity), Clean Truck Check compliance, pricing, and how mobile testing works. Answered by Licensed CARB Tester IF530523.

+
+
+
+
+

What is the CARB Clean Truck Check?

The CARB Clean Truck Check is a mandatory emissions testing program from the California Air Resources Board for heavy-duty diesel trucks operating in California. It requires OBD testing for 2013 and newer trucks and OVI-J1667 (smoke/opacity) testing for older trucks. The program phases in by vehicle weight class, model year, and engine family. Penalties for non-compliance start at $1,000 per day.

+

What is OBD testing for heavy-duty trucks?

OBD (on-board diagnostic) testing reads emissions data and fault codes directly from your truck’s ECM. Required for 2013 and newer heavy-duty diesel vehicles under CARB’s Clean Truck Check. A licensed tester connects to the OBD port and the results are submitted electronically to CARB.

Cost: $75 per vehicle. Free retest within 150 days on fail.

+

What is OVI-J1667 testing (smoke / opacity)?

OVI-J1667 is the Opacity Visible Inspection performed to SAE standard J1667. A licensed tester performs a snap-acceleration smoke test and measures exhaust opacity with calibrated equipment. It is the official test for pre-2013 heavy-duty diesel vehicles. “OVI-J1667” and “smoke test” refer to the same procedure.

Cost: $250 per vehicle. Free retest within 150 days on fail.

+

How much does mobile CARB testing cost?

  • OBD testing: $75 per vehicle
  • OVI-J1667 (smoke/opacity): $250 per vehicle
  • Motorhome / RV: $75 OBD + $250 OVI-J1667
  • Fleet (3+ vehicles): Custom quote — call or email

Retests after a failure are free within 150 days. No hidden fees.

+

What vehicles need CARB emissions testing?

Heavy-duty diesel trucks and buses with a GVWR of 14,001 lbs or more operating in California. 2013 and newer trucks need OBD testing. Pre-2013 trucks need OVI-J1667 (smoke/opacity) testing. Agricultural equipment 25 hp or greater may also be subject to CARB periodic compliance checks. Motorhomes and RVs with diesel engines follow the same rules by model year.

+

Do I need OBD testing, OVI-J1667, or both?

It depends on your vehicle’s model year:

  • 2013 or newer: OBD testing ($75)
  • Pre-2013: OVI-J1667 smoke/opacity testing ($250)
  • Some programs: Both tests required

Call us with your VIN and we’ll confirm exactly what your truck needs before you schedule.

+

How long does a mobile CARB test take?

OBD testing: approximately 15–20 minutes per vehicle. OVI-J1667 (smoke/opacity): approximately 20–30 minutes per vehicle. Fleet visits are scheduled to minimize downtime — multiple vehicles in one appointment. Official documentation is issued on-site before we leave.

+

What happens if my vehicle fails?

You receive an official failure report with the reason for failure. Once you repair the issue (clear the fault codes, fix the emissions problem, address the smoke/opacity), contact us. Free retests are available within 150 days of the original test at no additional charge.

+

Can you test at my yard or fleet depot?

Yes — mobile testing at your yard, depot, parking lot, or job site is exactly what NorCal CARB Mobile does. You don’t haul trucks to a shop. We come to your location anywhere in Northern California. Fleet visits can test multiple vehicles in a single appointment.

+

How do I schedule a CARB test?

Call 916-890-4427 or use the contact form. Tell us the number of vehicles, their model years, your location, and a preferred time window. We confirm within the hour during business hours (Mon–Fri 6am–5pm, Saturday 8am–4pm).

+

What is CARB Tester ID IF530523?

IF530523 is the California Air Resources Board tester license number for Bryan Gillis, owner of NorCal CARB Mobile. All tests performed by NorCal CARB Mobile are issued under this license number. Results are official and accepted for California registration, CARB compliance filing, and DMV purposes.

+

Where does NorCal CARB Mobile serve?

We serve all of Northern California from two offices: Sacramento and Oakland. Coverage includes Sacramento metro, Stockton, Modesto, Roseville, Lodi, Tracy, Hayward, Antioch, Fairfield, San Jose, Napa, North Bay, Bay Area, Butte County, plus extended coverage including Orange County and San Diego. See the full service area list →

+

What is HD-OBD reporting?

HD-OBD (Heavy-Duty On-Board Diagnostic) reporting is the electronic submission of OBD test data to CARB. Under the Clean Truck Check program, OBD results must be transmitted to CARB’s database to confirm compliance. NorCal CARB Mobile handles this submission as part of every OBD test — no extra steps from you.

+
+
+
+
+

Still have questions?

+

Call us. We know CARB regulations and will tell you straight what your truck needs.

+ +
+
+
+ + + diff --git a/workers/norcalcarbmobile/public/index.html b/workers/norcalcarbmobile/public/index.html new file mode 100644 index 0000000..3511409 --- /dev/null +++ b/workers/norcalcarbmobile/public/index.html @@ -0,0 +1,171 @@ + + + + + +NorCal CARB Mobile — Mobile CARB & Smog Testing That Comes to You + + + + + + + + + + + + + + + + + +
+
+
+

Mobile CARB Testing that comes to you — anywhere in Northern California.

+

Licensed OBD, OVI-J1667 (smoke/opacity), fleet, and RV emissions testing. No trip to a shop. No downtime. Official results you can register with today.

+ +
+
Bryan Gillis — Owner & CARB TesterLicense ID IF530523 · Licensed & insured
+
Mon–Fri 6am–5pmSaturday 8am–4pm
+
We come to youSacramento • Oakland • NorCal-wide
+
+
+
+
+
+

What we test

+

Straightforward pricing. If your test fails, your retest is free within 150 days.

+
+

OBD Testing

On-board diagnostic testing for 2013+ heavy-duty trucks. Meets CARB Clean Truck Check requirements.

$75 per vehicle
+

OVI-J1667 (Smoke / Opacity)

Opacity Visible Inspection per SAE J1667 — smoke/opacity testing with official CARB documentation on-site.

$250 per vehicle
+

Motorhome / RV Testing

Full-service testing for motorhomes and RVs. We handle the paperwork and compliance.

$75 OBD  +  $250 OVI-J1667
+

Fleet Compliance

Multi-vehicle testing at your yard. Volume pricing for fleets of 3 or more.

Custom quote in 1 business day
+
+

See all services and what’s included →

+
+
+
+
+

Why mobile testing beats a shop visit

+
+

Zero downtime

We test at your yard, your driveway, your job site. Your truck keeps earning.

+

Same-day results

Official pass/fail documentation the moment the test clears. Digital and printed.

+

Free retest on fail

If you fail, clear the codes and we come back — no charge — within 150 days.

+

Licensed tester

CARB Tester ID IF530523. All results valid for California registration.

+
+
+
+
+
+

Serving Northern California — Sacramento & Oakland

+

Two offices: Sacramento and Oakland. Covering Northern California from the Bay Area through the San Joaquin Valley and Central Valley.

+
    +
  • Sacramento, Elk Grove, Roseville, Rancho Cordova, Folsom
  • +
  • Stockton, Lodi, Galt, Tracy, Manteca, Ripon, Escalon
  • +
  • Modesto, Turlock, Merced
  • +
  • Oakland, Hayward, Antioch, Fairfield
  • +
  • San Jose, Napa, North Bay, Bay Area
  • +
  • Extended: Butte County, Orange County, San Diego
  • +
+

See all service areas →

+
+
+
+
+

Ready to schedule?

+

Tell us your vehicle(s), your location, and a time window. We’ll confirm within the hour during business hours.

+ +
+
+
+ + + diff --git a/workers/norcalcarbmobile/public/llms-full.txt b/workers/norcalcarbmobile/public/llms-full.txt new file mode 100644 index 0000000..6865e6c --- /dev/null +++ b/workers/norcalcarbmobile/public/llms-full.txt @@ -0,0 +1,95 @@ +# NorCal CARB Mobile — full content for LLM ingestion + +Licensed mobile CARB emissions testing across Northern California. Owner: Bryan Gillis. CARB Tester ID IF530523. Two offices: Sacramento and Oakland. Phone: 916-890-4427. Email: sales@norcalcarbmobile.com. + +## Owner & credential + +NorCal CARB Mobile LLC is owned and operated by Bryan Gillis. Bryan holds CARB Tester ID IF530523, issued by the California Air Resources Board. Every test issued by NorCal CARB Mobile is an official CARB-recognized document accepted for California registration, CARB Clean Truck Check compliance, and HD-OBD reporting. + +## Services and pricing + +### OBD Testing — $75 per vehicle +On-board diagnostic testing reads emissions data and fault codes directly from the truck's ECM. Required for 2013 and newer heavy-duty diesel vehicles under the CARB Clean Truck Check program. Test takes 15-20 minutes. Free retest within 150 days on fail. + +### OVI-J1667 (Smoke / Opacity Testing) — $250 per vehicle +Opacity Visible Inspection performed to SAE standard J1667. A snap-acceleration smoke test where exhaust opacity is measured with calibrated equipment. Required for pre-2013 heavy-duty diesel vehicles. "OVI-J1667" and "smoke test" refer to the same procedure. Test takes 20-30 minutes. Free retest within 150 days on fail. + +### Motorhome / RV Testing — $75 OBD + $250 OVI-J1667 +Full CARB testing for Class A, B, and C motorhomes and diesel RVs. We come to your storage facility, campsite, or driveway. We handle paperwork and CARB documentation. + +### Agricultural Vehicle Testing +CARB emissions testing for tractors, combines, irrigation engines, and diesel ag equipment 25 hp or greater operating in California. Subject to CARB In-Use Off-Road Diesel Regulation. On-site at your farm or equipment yard. + +### Fleet Compliance Testing — custom quote +Multi-vehicle CARB testing at your yard, depot, or parking lot. Volume scheduling for fleets of 3+ vehicles. Volume pricing for 5+ vehicles. One invoice for all vehicles. Custom quote within 1 business day. + +## Service area + +We serve all of Northern California from two offices: Sacramento and Oakland. Coverage includes: + +- Sacramento metro (Sacramento, Elk Grove, Roseville, Rancho Cordova, Folsom) +- San Joaquin County (Stockton, Lodi, Galt, Tracy, Manteca) +- Stanislaus County (Modesto, Turlock, Merced) +- Alameda County / East Bay (Oakland, Hayward, Fremont, Berkeley, Alameda, San Leandro) +- Contra Costa County (Antioch, Pittsburg, Brentwood) +- Solano County (Fairfield, Vacaville, Vallejo) +- Santa Clara County / South Bay (San Jose, Santa Clara, Sunnyvale) +- Napa Valley and North Bay (Napa, St. Helena, Calistoga, Marin, Sonoma) +- Butte County (Chico, Oroville) +- Extended coverage: Orange County, San Diego + +If in California and you need a licensed CARB test, call 916-890-4427. + +## CARB Clean Truck Check + +The CARB Clean Truck Check is a mandatory emissions testing program from the California Air Resources Board for heavy-duty diesel trucks operating in California. It requires OBD testing for 2013+ trucks and OVI-J1667 (smoke/opacity) testing for older trucks. Phases in by vehicle weight class, model year, and engine family. Penalties for non-compliance start at $1,000 per day. + +Vehicles needing CARB testing: heavy-duty diesel trucks and buses with GVWR of 14,001 lbs or more operating in California. 2013+ trucks need OBD. Pre-2013 trucks need OVI-J1667. Some compliance programs require both. Diesel motorhomes/RVs follow the same rules by model year. + +## HD-OBD reporting + +HD-OBD (Heavy-Duty On-Board Diagnostic) reporting is the electronic submission of OBD test data to CARB. Under the Clean Truck Check program, OBD results must be transmitted to CARB's database. NorCal CARB Mobile handles this submission as part of every OBD test — no extra steps from the customer. + +## OBD vs OVI-J1667 — which do I need? + +- 2013 or newer heavy-duty diesel: OBD testing ($75) +- Pre-2013 heavy-duty diesel: OVI-J1667 smoke/opacity testing ($250) +- Some programs: both tests required + +Call with the VIN to confirm exactly what your truck needs. + +## How scheduling works + +Call 916-890-4427 or email sales@norcalcarbmobile.com. Provide: +- Number of vehicles +- Vehicle model years (or VINs) +- Location (city + ZIP, or address for fleet visit) +- Preferred time window +- Phone number + +We confirm within the hour during business hours. Fleet visits are scheduled to minimize downtime by testing multiple vehicles in a single appointment. + +## What happens if a vehicle fails + +The customer receives an official failure report listing the reason for failure. Once the customer repairs the issue, contact us. Free retests are available within 150 days of the original test at no additional charge. + +## Why mobile testing + +- Zero downtime: we test at your yard, driveway, or job site +- Same-day results: official pass/fail issued on-site +- CARB-accepted: results valid for California registration and compliance +- Free retest: within 150 days on fail +- Licensed tester: all results issued under CARB Tester ID IF530523 + +## Hours + +- Monday–Friday: 6:00 AM – 5:00 PM PT +- Saturday: 8:00 AM – 4:00 PM PT +- Sunday: closed + +## Contact + +- Phone: 916-890-4427 +- Email: sales@norcalcarbmobile.com +- Offices: Sacramento, Oakland +- Website: https://norcalcarbmobile.com/ diff --git a/workers/norcalcarbmobile/public/llms.txt b/workers/norcalcarbmobile/public/llms.txt new file mode 100644 index 0000000..9daee21 --- /dev/null +++ b/workers/norcalcarbmobile/public/llms.txt @@ -0,0 +1,24 @@ +# NorCal CARB Mobile + +> Licensed mobile CARB emissions testing across Northern California. OBD ($75), OVI-J1667 (smoke/opacity, $250), motorhome/RV, fleet, and agricultural diesel testing. Owner: Bryan Gillis, CARB Tester ID IF530523, recognized by the California Air Resources Board. Two offices: Sacramento and Oakland. Phone: 916-890-4427. Email: sales@norcalcarbmobile.com. + +## Pages + +- [Home](https://norcalcarbmobile.com/): Mobile CARB testing services overview, pricing, owner credential. +- [Services](https://norcalcarbmobile.com/services/): OBD $75, OVI-J1667 $250, motorhome/RV, fleet compliance, agricultural. +- [Service Areas](https://norcalcarbmobile.com/service-areas/): Northern California coverage from two offices — Sacramento and Oakland. Includes Stockton, Modesto, Roseville, Lodi, Tracy, Hayward, Antioch, Fairfield, San Jose, Napa, North Bay, Bay Area, Butte County, plus extended coverage to Orange County and San Diego. +- [FAQ](https://norcalcarbmobile.com/faq/): CARB Clean Truck Check, OBD vs OVI-J1667, pricing, scheduling, HD-OBD reporting. +- [About](https://norcalcarbmobile.com/about/): Bryan Gillis, owner and licensed CARB tester (IF530523). +- [Contact](https://norcalcarbmobile.com/contact/): Phone, email, hours, two-office NAP. +- [Blog](https://norcalcarbmobile.com/blog/): Articles on CARB testing, Clean Truck Check, compliance deadlines. + +## Key facts + +- **Phone**: 916-890-4427 +- **Email**: sales@norcalcarbmobile.com +- **Hours**: Mon–Fri 6am–5pm PT, Saturday 8am–4pm PT, closed Sunday +- **Owner**: Bryan Gillis +- **Credential**: CARB Tester ID IF530523, California Air Resources Board +- **Offices**: Sacramento, Oakland +- **Pricing**: OBD $75 / OVI-J1667 $250 / Motorhome+RV $75+$250 / Fleet custom +- **Retest policy**: Free retest within 150 days on a failed test diff --git a/workers/norcalcarbmobile/public/privacy/index.html b/workers/norcalcarbmobile/public/privacy/index.html new file mode 100644 index 0000000..4db3a09 --- /dev/null +++ b/workers/norcalcarbmobile/public/privacy/index.html @@ -0,0 +1,50 @@ + + + + + +Privacy Policy | NorCal CARB Mobile + + + + + + + + + +
+
+
+

Privacy Policy

+

Last updated: May 2026

+
+
+
+

Who we are

+

NorCal CARB Mobile LLC (“we,” “us,” “our”) operates the website norcalcarbmobile.com. Owner: Bryan Gillis. CARB Tester ID IF530523.

+

Information we collect

+

We collect information you give us directly when you contact us — name, phone number, email address, vehicle information (VIN, year, make, model), and service location. We collect this only to schedule and perform CARB testing services.

+

We may collect minimal analytics about site visits (page views, referring source, approximate location at the city level) using a privacy-respecting analytics tool. We do not use cookies for advertising or tracking across sites.

+

How we use information

+

To schedule appointments, contact you about service, send official CARB documentation after testing, and meet our legal obligations (CARB reporting, tax records, etc.). We do not sell your information.

+

Sharing

+

We share testing results with the California Air Resources Board (CARB) as required by law. We do not share your personal information with third parties for marketing purposes.

+

Data retention

+

We retain customer records for the period required by California law for emissions testing records and tax filings. After that, records are deleted.

+

Your rights

+

You have the right to request a copy of the personal information we hold about you, to correct inaccuracies, and to request deletion (subject to legal retention requirements). To exercise these rights, email sales@norcalcarbmobile.com.

+

California residents (CCPA / CPRA)

+

California residents have additional rights under the California Consumer Privacy Act and California Privacy Rights Act, including the right to know what personal information we collect and the right to opt out of the sale of personal information. We do not sell personal information.

+

Contact

+

Questions about this policy: sales@norcalcarbmobile.com or 916-890-4427.

+
+
+ + diff --git a/workers/norcalcarbmobile/public/robots.txt b/workers/norcalcarbmobile/public/robots.txt new file mode 100644 index 0000000..741f9f1 --- /dev/null +++ b/workers/norcalcarbmobile/public/robots.txt @@ -0,0 +1,44 @@ +# robots.txt for norcalcarbmobile.com +# Allow everyone, including AI search crawlers (citations matter) + +User-agent: * +Allow: / + +Sitemap: https://norcalcarbmobile.com/sitemap.xml + +# AI search crawlers — explicit allow +User-agent: GPTBot +Allow: / + +User-agent: ChatGPT-User +Allow: / + +User-agent: OAI-SearchBot +Allow: / + +User-agent: ClaudeBot +Allow: / + +User-agent: anthropic-ai +Allow: / + +User-agent: Claude-Web +Allow: / + +User-agent: PerplexityBot +Allow: / + +User-agent: Perplexity-User +Allow: / + +User-agent: Google-Extended +Allow: / + +User-agent: Applebot-Extended +Allow: / + +User-agent: CCBot +Allow: / + +User-agent: Bingbot +Allow: / diff --git a/workers/norcalcarbmobile/public/service-areas/index.html b/workers/norcalcarbmobile/public/service-areas/index.html new file mode 100644 index 0000000..7289809 --- /dev/null +++ b/workers/norcalcarbmobile/public/service-areas/index.html @@ -0,0 +1,126 @@ + + + + + +CARB Testing Service Areas — Northern California | NorCal CARB Mobile + + + + + + + + + + + + + + + +
+
+
+ +

CARB Testing Service Areas — All of Northern California

+

Two offices — Sacramento and Oakland — means we cover NorCal from the Central Valley through the Bay Area. If you’re in California and need a CARB test, call us.

+ +
+
+
+
+

Sacramento & Sacramento County

+

Our Sacramento office serves the greater Sacramento metro area — Sacramento, Elk Grove, Citrus Heights, Rancho Cordova, Folsom, and Carmichael. Mobile OBD ($75) and OVI-J1667 ($250) testing at your fleet yard, depot, dealership, or driveway. Same-day documentation, official CARB-licensed results.

+
+

Oakland & Alameda County

+

Our Oakland office is the East Bay hub. Mobile CARB testing in Oakland, Berkeley, Emeryville, Alameda, San Leandro, and across Alameda County. We test at the Port of Oakland, container depots, trucking terminals, and private fleets. Both OBD and OVI-J1667 available on-site.

+
+

Stockton & San Joaquin County

+

Stockton is a major freight corridor and we’re there often. Coverage includes Stockton, Lodi, Manteca, Tracy, Ripon, and Escalon. Common stops: warehouse fleets along I-5 and Hwy 99, ag operators in San Joaquin County. OBD and OVI-J1667 available.

+
+

Modesto & Stanislaus County

+

Modesto, Turlock, Ceres, Riverbank, Oakdale — CARB testing across Stanislaus County for trucking, agriculture, and dairy operations. We come to your facility for fleet visits.

+
+

Roseville & Placer County

+

Roseville, Rocklin, Lincoln, Auburn, and Granite Bay. We service Placer County with on-site OBD and OVI-J1667. Common customers: construction operators along Hwy 80, dealership service departments.

+
+

Lodi & Galt

+

Lodi, Galt, Acampo, and southern Sacramento County. CARB testing for ag fleets, vineyards with diesel equipment, and trucking based off Hwy 99.

+
+

Tracy & Livermore (Tri-Valley)

+

Tracy, Livermore, Manteca, and the I-580 / I-205 corridor. Major distribution and warehouse zone — we run fleet visits to logistics operators frequently. Both OBD and OVI-J1667 on-site.

+
+

Hayward & East Bay

+

Hayward, San Leandro, Fremont, Union City, Newark. East Bay coverage out of our Oakland office. Mobile CARB testing for fleets, dealerships, and owner-operators.

+
+

Fairfield & Solano County

+

Fairfield, Vacaville, Vallejo, and Solano County. We cover the Hwy 80 corridor between Sacramento and the Bay. Both OBD and OVI-J1667 testing available on-site.

+
+

Antioch & East Contra Costa

+

Antioch, Pittsburg, Brentwood, Oakley, and East Contra Costa County. We cover the Delta region and Hwy 4 corridor for trucking and ag operators.

+
+

San Jose & South Bay

+

San Jose, Santa Clara, Sunnyvale, Milpitas, and the South Bay. Mobile CARB testing for fleets, dealerships, and owner-operators across Silicon Valley and Santa Clara County. OBD and OVI-J1667 available.

+
+

Napa Valley (Napa, St. Helena, Calistoga)

+

Napa Valley coverage including Napa, Yountville, St. Helena, and Calistoga. Vineyard diesel equipment, hospitality fleet vehicles, and local trucking. CARB testing on-site.

+
+

Bay Area (full coverage)

+

From Oakland we cover the entire Bay Area — East Bay, South Bay, North Bay, Peninsula, and San Francisco. We schedule routes to minimize travel time. Call to confirm coverage in your specific city.

+
+

East Bay (comprehensive)

+

Comprehensive East Bay testing: Oakland, Hayward, Fremont, Berkeley, Alameda, San Leandro, Pleasanton, Dublin, Livermore, Walnut Creek, Concord, Antioch. One office covers the whole region.

+
+

North Bay (Marin, Sonoma, Solano)

+

North Bay coverage: Marin County, Sonoma County, and northern Solano. Petaluma, Santa Rosa, San Rafael, Novato. Wine country diesel ops, trucking, and ag.

+
+

Butte County (Chico, Oroville)

+

Extended coverage for Butte County — Chico, Oroville, Paradise. We schedule trips north on Hwy 99 / I-5. Call to coordinate timing.

+
+

Orange County

+

Extended coverage for Orange County customers. Call to schedule. Common scenario: customers with CA-registered vehicles in SoCal who need a licensed mobile tester.

+
+

San Diego

+

Extended coverage for San Diego County. Call to schedule. We coordinate trips for fleet customers needing multiple vehicles tested.

+
+
+
+
+

Don’t see your city?

+

If you’re in California and need a licensed CARB test, call. We’ll tell you availability and travel time honestly.

+ +
+
+
+ + + diff --git a/workers/norcalcarbmobile/public/services/index.html b/workers/norcalcarbmobile/public/services/index.html new file mode 100644 index 0000000..8587a86 --- /dev/null +++ b/workers/norcalcarbmobile/public/services/index.html @@ -0,0 +1,143 @@ + + + + + +Mobile CARB Testing Services & Pricing | NorCal CARB Mobile + + + + + + + + + + + + + + + + +
+
+
+ +

Mobile CARB Testing Services & Pricing

+

Licensed tester Bryan Gillis (CARB ID IF530523) comes to your location. OBD, OVI-J1667, motorhome/RV, agricultural, and fleet testing. Official CARB documentation issued on-site.

+ +
+
+
+
+
+

OBD Testing — $75 per vehicle

+

What it is: On-board diagnostic testing reads fault codes and emissions data directly from your truck’s ECM. Required for 2013 and newer heavy-duty diesel vehicles under CARB’s Clean Truck Check program.

+

Who needs it: Any 2013+ GVWR 14,001 lb+ diesel truck operating in California. Fleet owners subject to HD-OBD reporting.

+

What you get: Official CARB OBD results, valid for state registration and compliance filing. If you fail, we retest free within 150 days.

+
$75 per vehicle
+

Schedule OBD testing →

+
+
+
+

OVI-J1667 (Smoke / Opacity Testing) — $250 per vehicle

+

What it is: Opacity Visible Inspection performed to SAE standard J1667. A licensed tester performs a snap-acceleration smoke test and measures exhaust opacity with calibrated equipment. The official term for what most people call a “smoke test.”

+

Who needs it: Pre-2013 heavy-duty diesel vehicles. Older trucks and buses subject to CARB Periodic Smoke Inspection Program (PSIP).

+

What you get: Official SAE J1667 test report with opacity readings, vehicle data, and tester ID IF530523. Accepted by CARB and DMV. Free retest within 150 days on fail.

+
$250 per vehicle
+

Schedule OVI-J1667 testing →

+
+
+
+

Motorhome & RV Testing

+

What it is: Full CARB emissions testing for motorhomes, RVs, and coaches. Depending on the vehicle’s engine, we perform OBD testing, OVI-J1667 opacity testing, or both.

+

Who needs it: Class A, B, and C motorhomes. Diesel-powered RVs subject to California emissions requirements.

+

What you get: We handle the paperwork and CARB documentation. We come to your storage facility, campsite, or driveway.

+
$75 OBD  +  $250 OVI-J1667
+

Schedule RV testing →

+
+
+
+

Agricultural Vehicle Testing

+

What it is: CARB emissions testing for tractors, combines, irrigation engines, and other agricultural diesel equipment subject to California’s In-Use Off-Road Diesel Regulation.

+

Who needs it: Agricultural operators with diesel equipment 25 hp or greater operating in California.

+

What you get: On-site testing at your farm or equipment yard. Official documentation. We understand the agricultural compliance schedule.

+

Schedule agricultural testing →

+
+
+
+

Fleet Compliance Testing

+

What it is: Multi-vehicle CARB testing at your yard, depot, or parking lot. We schedule all your vehicles in one visit (or a series of visits) to minimize disruption.

+

Who needs it: Trucking companies, logistics operators, municipalities, and any business running 3 or more heavy-duty diesel vehicles in California.

+

What you get: Custom testing schedule, bulk coordination, one invoice for all vehicles. Volume pricing for 5+ vehicles.

+
Custom quote — response within 1 business day
+

Get a fleet quote →

+
+
+
+
+
+

What’s included with every test

+
+

We come to you

No hauling. We test at your yard, lot, driveway, or job site anywhere in Northern California.

+

Same-day documentation

Official pass/fail report issued on-site. Digital and printed copies available.

+

Free retest on fail

Clear the codes or repair the issue, and we return at no charge within 150 days.

+

CARB-accepted results

All testing performed by Licensed CARB Tester IF530523. Valid for registration and compliance filing.

+
+
+
+
+
+

Schedule your test

+

Tell us what you need tested, your location, and a preferred time window. We confirm within the hour during business hours.

+ +

Mon–Fri 6am–5pm • Saturday 8am–4pm • Sacramento • Oakland

+
+
+
+ + + diff --git a/workers/norcalcarbmobile/public/sitemap.xml b/workers/norcalcarbmobile/public/sitemap.xml new file mode 100644 index 0000000..5cf19f4 --- /dev/null +++ b/workers/norcalcarbmobile/public/sitemap.xml @@ -0,0 +1,12 @@ + + + https://norcalcarbmobile.com/monthly1.0 + https://norcalcarbmobile.com/services/monthly0.9 + https://norcalcarbmobile.com/service-areas/monthly0.9 + https://norcalcarbmobile.com/about/monthly0.8 + https://norcalcarbmobile.com/faq/monthly0.8 + https://norcalcarbmobile.com/contact/monthly0.7 + https://norcalcarbmobile.com/blog/weekly0.7 + https://norcalcarbmobile.com/privacy/yearly0.3 + https://norcalcarbmobile.com/terms/yearly0.3 + diff --git a/workers/norcalcarbmobile/public/terms/index.html b/workers/norcalcarbmobile/public/terms/index.html new file mode 100644 index 0000000..950f90b --- /dev/null +++ b/workers/norcalcarbmobile/public/terms/index.html @@ -0,0 +1,44 @@ + + + + + +Terms of Service | NorCal CARB Mobile + + + + + + + + + +
+

Terms of Service

Last updated: May 2026

+
+

Service

+

NorCal CARB Mobile LLC provides licensed mobile emissions testing services in California, including OBD testing, OVI-J1667 (smoke/opacity) testing, and CARB compliance documentation. Testing is performed under CARB Tester ID IF530523.

+

Pricing & payment

+

Standard pricing: OBD testing $75 per vehicle, OVI-J1667 testing $250 per vehicle. Fleet pricing (3+ vehicles) is custom. Payment is due at time of service unless we have a written net-terms agreement. We accept card, ACH, check, and select digital payment methods.

+

Retest policy

+

If a vehicle fails a CARB test we performed, we will retest the same vehicle once at no charge within 150 days of the original test. The free retest covers our service fee only and does not cover repairs or parts. After 150 days, standard pricing applies.

+

Cancellations & rescheduling

+

Please give 24 hours notice to cancel or reschedule a confirmed appointment. Same-day cancellations on confirmed fleet visits may be subject to a service fee equal to the travel cost.

+

Customer responsibilities

+

Customer must provide a safe location for testing, accurate vehicle information, and access to the vehicle’s OBD port (for OBD testing). Customer is responsible for any pre-existing vehicle conditions; we test compliance and do not perform repairs.

+

Limitation of liability

+

NorCal CARB Mobile’s liability is limited to the amount paid for the specific service. We are not liable for indirect, consequential, or incidental damages, including downtime, lost revenue, or third-party fines unrelated to our testing accuracy. Testing results are official CARB-recognized documents based on the vehicle’s condition at the time of test.

+

Governing law

+

These terms are governed by the laws of the State of California. Any dispute will be resolved in the courts of Sacramento County, California.

+

Contact

+

Questions: sales@norcalcarbmobile.com or 916-890-4427.

+
+
+ + diff --git a/workers/norcalcarbmobile/worker.js b/workers/norcalcarbmobile/worker.js new file mode 100644 index 0000000..05d4b28 --- /dev/null +++ b/workers/norcalcarbmobile/worker.js @@ -0,0 +1,34 @@ +// worker.js — NorCal CARB Mobile +// Pass-through to Workers Static Assets. /api/* reserved for future endpoints +// (e.g. native Google Calendar booking via /api/schedule). + +export default { + async fetch(request, env) { + const url = new URL(request.url); + + // Reserved hook for native Google Calendar booking. Returns a friendly + // 503 until the real endpoint is wired (uses GOOGLE_API_KEY from secrets). + if (url.pathname === "/api/schedule") { + return new Response( + JSON.stringify({ + status: "not_yet_wired", + message: "Online scheduling is in progress. Please call 916-890-4427 or email sales@norcalcarbmobile.com to book.", + phone: "+19168904427", + email: "sales@norcalcarbmobile.com" + }), + { status: 503, headers: { "content-type": "application/json", "cache-control": "no-store" } } + ); + } + + // Catch-all for any other /api/* path. + if (url.pathname.startsWith("/api/")) { + return new Response(JSON.stringify({ error: "not_implemented" }), { + status: 501, + headers: { "content-type": "application/json" } + }); + } + + // Everything else: serve from static assets. + return env.ASSETS.fetch(request); + } +}; diff --git a/workers/norcalcarbmobile/wrangler.toml b/workers/norcalcarbmobile/wrangler.toml new file mode 100644 index 0000000..e1f8541 --- /dev/null +++ b/workers/norcalcarbmobile/wrangler.toml @@ -0,0 +1,21 @@ +name = "norcalcarbmobile" +main = "worker.js" +compatibility_date = "2026-03-01" +account_id = "bafa242dd95d3fdce72540d20accd0a2" + +# Workers Static Assets — serves /public/ directly and falls through to worker.js +# for anything not matched by a file. +[assets] +directory = "./public" +binding = "ASSETS" +not_found_handling = "404-page" +html_handling = "auto-trailing-slash" + +# Production custom domains. Wrangler auto-creates DNS + SSL on deploy. +# IMPORTANT: do not attach these until the preview (*.workers.dev) is approved. +# To cut over, uncomment the routes below and push. +# +# routes = [ +# { pattern = "norcalcarbmobile.com", custom_domain = true }, +# { pattern = "www.norcalcarbmobile.com", custom_domain = true } +# ]