Commit Graph

154 Commits

Author SHA1 Message Date
Ripley 5c04195cb1 chore: adopt template scripts and git hooks, retire phase-versioning
Ten scripts from ~/.openclaw/Projects/Template, taken one at a time and
configured against this deployment rather than copied wholesale.

Configured, not just copied:
- check-env.sh   SPEC written from what server/index.js actually reads — 24
                 variables, each with the consequence of getting it wrong
- secrets.sh     plus this project's own shapes: a bare 60+ hex run, which is
                 how the Zoho WebToLead tokens leaked into four commits, and a
                 reCAPTCHA key shape as NOTED rather than a failure, because the
                 site key and the secret key are indistinguishable by shape
- status.sh      nebula / qn-website-dev
- healthcheck.sh /api/health, asserting 200 AND "status":"ok" AND "db":"ok".
                 The template probed /healthz, which does not exist here
- preflight.sh   https://qn.isnull.dev, no --auth — there are no accounts
- verify.sh      GUARD_DIR=scripts/verify.d, since this project has no test
                 runner and no typecheck for it to detect
- backup.sh      ENGINE block replaced for SQLite: better-sqlite3's online
                 .backup() inside the container, verified with PRAGMA
                 integrity_check before anything is renamed into place
- restore-check.sh  rewritten rather than configured — the template's is
                 pg_restore/psql end to end with no seam. Replays the dump from
                 SQL into a scratch database and times it

Three guards in scripts/verify.d, because verify.sh would otherwise detect
nothing and exit 2: the build, the tracked-tree secret scan, and a check that
every document carries a valid Status, Governs and Review trigger.

Every guard was proven to fail before being trusted, per GUARDS.md rule 1:
healthcheck against a 200 that is not this app, secrets against the real
historical leak replayed out of 033bdf6, doc-headers against both a missing
Review trigger and the Status word "Historical", restore-check against a
truncated dump, an empty database and a raised row floor.

pre-commit is ADAPTED, not the template's. That one runs `npx tsc --noEmit` and
`npx vitest run`; this project has neither, so unchanged it would refuse every
commit. It runs the secret scan and `npm run build`. Hooks are not activated by
this commit — `git config core.hooksPath .githooks` is a separate, per-clone act.

package.json: adds `verify`, and corrects the version to 0.9.3. It said 0.8.3
while the last four commits said batch 0.9.0 through 0.9.3 — the second drift of
the phase-versioning rule, which is retired in the following commit.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-18 01:18:20 -05:00
null ac6f5d1f78 feat(seo): publish privacy policy, remove street address, prerender all routes (batch 0.9.3)
Client directive (Levi Halford, 2026-08-01) ahead of Google/Meta lead forms.

Privacy policy:
- Publish approved policy verbatim at /privacy-policy (src/data/privacyPolicy.js
  is the single source of truth; 292/292 source lines verified present)
- Privacy Policy link in the footer of every page
- Effective/Last Updated 2026-07-31, privacy@queuenorth.com as mailto

Remove St. Petersburg street address from every surface named in the brief:
footer, contact page, schema markup, SEO metadata, Google Maps links. Collapse
ProfessionalService + Organization schema into a single Organization with
areaServed: United States; drop geo coordinates, priceRange, openingHours.
Add the approved US-coverage sentence to About. No replacement address.

Crawler visibility (the site previously served 0 bytes of body HTML without JS):
- Prerender all 19 routes at build time via src/entry-server.jsx + scripts/prerender.js
- Hoist title/meta/canonical/JSON-LD into <head>; renderToString does not do this
  and react-helmet-async's context is empty under React 19
- Serve prerendered HTML; return a real 404 for unknown paths instead of 200
- Hydrate instead of discarding the prerendered markup

SEO/perf:
- Titles <=60 and descriptions <=160 chars across all pages
- Add BreadcrumbList to interior pages, WebSite to home
- Generate sitemap.xml from the route list with git-derived lastmod
- 301 duplicate URL forms (trailing slash, //, /index.html), preserving query
- Immutable caching for content-hashed assets; no-cache for HTML
- Split the 522 KB bundle into app/react-vendor/router/icons
- loading/decoding/fetchpriority + per-route hero preload; drop unused asset

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-08-01 01:45:52 -05:00
null 196389ddf3 fix(brand): update veteran-owned badge to certified mark logo (batch 0.9.2) 2026-06-14 16:17:42 -05:00
null d074e597b2 feat(zoho): WebToLead forwarding mode, veteran-owned certified badge, Docker/env/CI updates (batch 0.9.1) 2026-06-14 16:08:29 -05:00
null 05b27d216a feat: Dockerfile/docker-compose updates, server improvements, contact form with recaptcha, API integration (batch 0.9.0) 2026-06-14 15:37:26 -05:00
null 76cb558e8b chore: bump version to v0.8.3 2026-05-28 01:10:38 -05:00
null a8d9492a80 added 404 2026-05-28 00:41:24 -05:00
null 0f272fcf19 error and injection 2026-05-28 00:18:08 -05:00
null 3a61000c12 fix scroll 2026-05-27 23:40:09 -05:00
null e625a24b6e redirect to contact form 2026-05-27 22:33:54 -05:00
null f35de43952 fix footer 2026-05-27 22:19:04 -05:00
null c43d3bc955 company name footer one line 2026-05-27 22:08:46 -05:00
null 1dcfbfc7a7 chore: bump version to v0.8.2 2026-05-27 21:56:47 -05:00
null ec14701795 center footer 2026-05-27 21:54:44 -05:00
null 78967ff56f phone 2026-05-27 21:49:21 -05:00
null cc1970fd1d added phone numebr hamburger 2026-05-27 21:44:06 -05:00
null 8c1e0f4c3d ui 2026-05-27 21:35:12 -05:00
null fb12d8cf3c 1 2026-05-27 21:23:17 -05:00
null a3ba03b7e1 cisco about 2026-05-27 21:15:54 -05:00
null f59d053afd mobile navbar text per owner 2026-05-27 21:04:30 -05:00
null 033bdf6625 Form now POSTs to Zoho 2026-05-27 20:57:55 -05:00
null 548e20e6f0 . 2026-05-27 14:43:50 -05:00
null 225c4e5485 chore: bump version to v0.8.1 2026-05-27 14:33:13 -05:00
null 8f20670292 breadcrumbs 2026-05-27 14:27:30 -05:00
null 0cfa048d0d injection security 2026-05-27 14:14:24 -05:00
null 4410f01d48 Missing `Description` or `aria-describedby={undefined}` for {DialogContent}. 2026-05-27 14:11:48 -05:00
null 6bab4b5c89 corrections 2026-05-27 14:10:28 -05:00
null f9b36c198b badges size 2026-05-27 13:58:31 -05:00
null 4b17e9f109 badges 2026-05-27 13:28:13 -05:00
null 6de9490764 badge center 2026-05-27 12:51:08 -05:00
null a81e97fb31 mobile view 2026-05-27 12:42:25 -05:00
null 362a7e0059 heatmap 2026-05-26 17:08:55 -05:00
null 431d1157b3 chore: bump version to 0.8.0 2026-05-26 13:44:27 -05:00
null 510edace07 removed duplicate card 2026-05-26 13:41:46 -05:00
null 8731903463 updated badges homepage 2026-05-26 13:36:16 -05:00
null a2a32687ff branding 2026-05-26 13:29:37 -05:00
null f0f0cfd599 #181 2026-05-26 13:04:57 -05:00
null 335601b00e remove submit ticket 2026-05-26 12:55:23 -05:00
null 85d7ae4bb1 logo enlarge 2026-05-26 12:44:10 -05:00
null bfcf7f114c #176 2026-05-26 12:31:26 -05:00
null f2a5e2c1bc Hero name widen 2026-05-26 12:26:13 -05:00
null d626c34ba2 parternership branding 2026-05-26 12:22:11 -05:00
null fd1e2b6f50 update 2026-05-25 20:26:50 -05:00
null afec6547c1 RECAPTCHA 2026-05-25 20:20:15 -05:00
null 7f48847049 CTA 2026-05-25 20:08:04 -05:00
null 07a43b9b7c visual update services 2026-05-25 20:03:56 -05:00
null 9b5f9f885c text 2026-05-25 20:02:36 -05:00
null fca9336656 close 184 2026-05-25 19:54:39 -05:00
null e489245104 service military 2026-05-25 19:51:03 -05:00
null 80b1747ffe branding 2026-05-25 19:44:10 -05:00