embeddedera-site¶
The EmbeddedEra web presence: embeddedera.com (registrar Squarespace ex-Google Domains, DNS at Google nameservers, site on WordPress.com, mail on Google Workspace), its subdomains, and the eventual static site + store page.
Repo: ~/embeddedera-site → github.com/angelEmbeddedEra/embeddedera-site (private) — the step-by-step guides live there (docs/01…05); to-dos live here.
Pick up here (read this first in a new session)¶
What it is. embeddedera.com IS the Astro 5 + Tailwind v4 static site on Cloudflare Pages (cutover 2026-09-11 ~07:30 ET), with Pages Functions for the two /api/* endpoints. WordPress.com is no longer served; cancel the plan after 2026-09-18.
Where the code is (on the Plex box).
- Repo: github.com/angelEmbeddedEra/embeddedera-site (private). Two local checkouts of the same repo:
- ~/embeddedera-site — branch main = PRODUCTION (what embeddedera.com serves). Only receives merges from the dev branch. Tag v1-mirror = the old WordPress-mirror version.
- ~/embeddedera-site-apple — branch apple-style = DEV; all new work happens here (git worktree). 17 pages EN+ES, 12 services in 5 families, quote/contact forms, uploads.
- Key files: src/i18n/{en,es}.ts (ALL copy, both languages), src/site.ts (business facts, socials, nav, WEB3FORMS_KEY, BOOKING_URL, SERVICES), src/pages/*.astro (EN) + src/pages/es/*.astro (thin wrappers), src/layouts/Base.astro (SEO, JSON-LD, hreflang), src/lib/quote-form.ts (form logic), functions/api/{upload.ts,file/key.ts} (R2 uploads), public/{_headers,_redirects,_routes.json,robots.txt,llms.txt}, scripts/{deploy.sh,llms.mjs,og.mjs,icons.mjs}, docs/*.md (guides + spanish-review.md).
Previews / hosting.
- PRODUCTION: Pages project embeddedera-apple, production branch main, custom domains embeddedera.com + www (DNS: proxied CNAMEs to embeddedera-apple.pages.dev; the old WordPress A records 192.0.78.24/25 were deleted). R2 binding UPLOADS + secret UPLOAD_SECRET.
- DEV preview: Pages project embeddedera-site, production branch apple-style → https://embeddedera-site.pages.dev (same R2 binding/secret, shares the uploads bucket).
- LAN preview of main: user unit site-preview.service → http://site.lan (NPM proxy host).
- REVERT (if ever needed): delete the two CNAMEs and re-create A embeddedera.com → 192.0.78.24 and 192.0.78.25 (proxied), CNAME www → embeddedera.com; WordPress.com must still be active.
How to build and deploy.
cd ~/embeddedera-site-apple && source ~/.nvm/nvm.sh
npm run build && npx astro check && npm run check:functions
set -a; . ~/.config/cloudflare/env; set +a
bash scripts/deploy.sh embeddedera-site apple-style # DEV preview (from ~/embeddedera-site-apple)
# release: cd ~/embeddedera-site && git merge apple-style && git push && npm ci && bash scripts/deploy.sh embeddedera-apple main # PRODUCTION
wrangler inside the repo root (its autoconfig rewrites astro.config); never wrangler deploy (that is Workers, not Pages).
Services and where their keys live (all 0600, also in Vaultwarden):
- Cloudflare API token claude-plex (Pages, DNS, Access, Analytics read, Email Routing rules, Bot Mgmt, R2): ~/.config/cloudflare/env (+ CLOUDFLARE_ACCOUNT_ID, CLOUDFLARE_ZONE_ID, UPLOAD_SECRET).
- Web3Forms access key (forms → email to hello@; free plan = browser submissions only, no autoresponder): ~/.config/web3forms/env; the key is also public in site.ts by design.
- R2 bucket embeddedera-uploads (ENAM, 90-day auto-delete). hCaptcha via Web3Forms' shared sitekey (no account).
- cal.com: https://cal.com/embeddedera/20-minute-call (account adiaz@). Uptime Kuma: monitor #11, login in ~/.config/credentials/kuma.txt, client venv ~/.local/share/kuma-venv.
- Email: hello@ (public), alerts@ (machines), plus purchasing/sales/info/marketing/billing/socialmedia — all Workspace aliases on adiaz@. Gmail label EmbeddedEra/Leads. Claude's connectors: Gmail = adiaz@ (Workspace; verified 2026-09-11 — the [EE-] emails are there), Google Calendar = angelgdo7@gmail.com (the training calendar).
- Google Business Profile (verification pending), Bing Places, Cloudflare Web Analytics (auto-inject after cutover), DMARC p=none, AI-crawler blocking OFF on the zone.
How the work gets done. Orchestrator session + one Sonnet builder at a time (general-purpose agent, model: sonnet; the worker/scout agent types are not visible to the Agent tool in these sessions). Brief → builder edits the worktree without committing → I build/check, commit, push, deploy, verify with curl. Copy changes go in BOTH dictionaries. Apple-style rules: one idea per screen, big type, our dark palette (bg #0b0d10, copper #c8813f), no cards, pill + "›" links, "we" voice (About uses "I"), no pricing, no equipment brands, no client names, no board counts.
Decisions on file: website-stack (Astro + Pages, own components, no theme), Real Cow product parked, pricing off the site for now, standards line pending research, WordPress content mirrored then superseded.
The record set to recreate on Cloudflare (inventory 2026-09-10)¶
| Type | Name | Value | Proxy |
|---|---|---|---|
| A | @ |
192.0.78.24 | DNS only (WordPress.com terminates TLS) |
| A | @ |
192.0.78.25 | DNS only |
| CNAME | www |
embeddedera.com | DNS only |
| MX | @ |
1 aspmx.l.google.com · 5 alt1.aspmx.l.google.com · 5 alt2.aspmx.l.google.com · 10 alt3.aspmx.l.google.com · 10 alt4.aspmx.l.google.com | — |
| TXT | @ |
v=spf1 include:_spf.google.com ~all |
— |
| TXT | google._domainkey |
v=DKIM1; k=rsa; p=MIIBIjAN… (copy the full value from the current DNS panel — long) |
— |
| TXT | www |
same SPF (harmless duplicate) | — |
Not present today: DMARC (_dmarc), AAAA, CAA. Add _dmarc TXT "v=DMARC1; p=none; rua=mailto:adiaz@embeddedera.com" after the move — observe-only, no risk. |
Planned subdomains¶
tesla→ Cloudflare Pages projecttesla-key(Tesla Fleet API public key host)store→ the store (eBay store link now; own shop later)angelor root → portfolio when published
Gotchas¶
- Mail is the only thing that breaks on a bad migration: the five MX + SPF + DKIM must be present on Cloudflare BEFORE the nameservers change. Cloudflare's import scan usually finds them; verify each against this table.
- Keep the WordPress.com A records "DNS only" (grey cloud) at first; turn the proxy on later only if WordPress.com's SSL keeps working.
- Changing nameservers ≠ transferring the registrar. The domain stays registered at Squarespace; only DNS hosting moves.
Open¶
See ~/Notes/tasks.md — this section is now generated from the task register.
Log¶
- 2026-09-11 17:05: Google API key stored (
GOOGLE_API_KEYin~/.config/google/env, projectembeddedera, restricted to PageSpeed/Search Console/Sheets/Drive/YouTube/Custom Search). First audit of the live site: mobile performance 97→99, desktop 100, accessibility 100, SEO 100, best practices 92→100; LCP 2.0 s mobile / 0.4 s desktop, CLS 0, TBT 0. The audit found a real bug: our CSP blocked Cloudflare's Web Analytics beacon, so no analytics had been recorded since cutover. Fixed (script-src+connect-srcallowstatic.cloudflareinsights.com), deployed to production, console errors now zero and the beacon loads (it is injected at the edge only for browser user agents, socurlwithout a UA shows nothing — not a fault). - 2026-09-11 17:00: Service-account key creation is blocked by the Workspace org policy
iam.disableServiceAccountKeyCreation(Google "secure by default"). Decision: leave the policy alone. It only blocked the Search Console automation, which is a convenience; revisit with a one-time OAuth consent or a monthly CSV export when that work actually starts. - 2026-09-11 14:45: Engineering notes section added on
apple-style(collectionnotes, /notes index + article pages, Article JSON-LD, footer + home links, llms.txt section, Spanish index that says articles are English). First article "When your microcontroller goes end-of-life" (1,421 words). Worker also fixed the ES toggle 404 on article pages and a UTC date-shift bug. On the dev preview only — not yet promoted to production. - 2026-09-11 13:30:
quote-draftsroutine live — prompt~/.claude/routines/quote-drafts.md, wrapper~/.local/bin/quote-drafts, cron*/30 7-19 * * 1-5. Reads[EE-threads with the Gmail connector, writes a REPLY DRAFT with the 1-3 missing questions per request type, labels the thread EmbeddedEra/Leads. Send tools are explicitly disallowed; it can only draft. First run skipped all six self-tests correctly. Log~/.claude/routines/quote-drafts.log, ntfy on error. - 2026-09-11 13:05: Lunch session — filters and cal.com done; Google Cloud left half-done across three projects (see Open). PageSpeed audit still blocked until one project has the API + an unrestricted key.
- 2026-09-11 12:10: Gmail filters created (alerts@ → Notifications/skip inbox; [EE- → EmbeddedEra/Leads, starred, important). cal.com now checks angelgdo7 for conflicts. PageSpeed API key in progress (GCP project
embeddederaunder the Workspace org). - 2026-09-11 09:35: State at end of the morning session — LIVE on Cloudflare Pages; dev branch
apple-style(preview embeddedera-site.pages.dev), prodmain(project embeddedera-apple). Done today: forms + attachments + captcha, Spanish, R&D + CAD services, AI-discoverability files, security headers, redirects, Search Console sitemap, Kuma monitor, alerts@ alias + billing alerts, lunch checklist event. Waiting on Angel: lunch list (Gmail filters, cal.com conflict calendar, send the two drafts, PageSpeed key, LinkedIn), Spanish review replies, testimonial, affiliate sign-ups, photo shoot 2026-09-19, WordPress cancel after 2026-09-18. - 2026-09-11 09:30: Bing — Angel is letting Bing Places' automatic sync from Google handle it; no separate Bing Webmaster setup.
- 2026-09-11 09:25: Search Console — Domain property was already verified (WordPress.com era); sitemap
https://embeddedera.com/sitemap-index.xmlsubmitted; indexing requested for /, /services/, /es/. Google still shows the old WordPress snippet + favicon until recrawl. - 2026-09-11 07:30: CUTOVER.
apple-stylemerged intomain(tagv1-mirrormarks the old mirror),embeddedera-appleproduction branch set tomain, custom domains attached, DNS switched (A records deleted, proxied CNAMEs to the project).embeddedera-siteproject repurposed as the DEV preview forapple-style(same R2 binding). Workflow from now: work onapple-style→ dev preview → merge tomain→ deploy production. - 2026-09-11 07:10: R&D positioning live (Home screen "Your outsourced R&D department.", service "Hardware R&D and Product Development" first under Design, FAQ, titles/descriptions/knowsAbout). 12 services. Gmail: label EmbeddedEra/Leads created; drafts for the Spanish review (friend) and the testimonial (client) in Angel's Drafts.
- 2026-09-11 06:35: Angel added the Workspace alias alerts@embeddedera.com and three Cloudflare usage-billing notifications (R2 storage, Class A, Class B) to it. Rule: hello@ for humans/leads, alerts@ for machines.
- 2026-09-11 06:20: File attachments live on /quote (both languages): Pages Functions
functions/api/upload.ts+functions/api/file/key.ts, R2 bucketembeddedera-uploads(ENAM, 90-day auto-delete, free tier 10 GB), bindingUPLOADS, secretUPLOAD_SECRET(in~/.config/cloudflare/env), HMAC-signed download links in the Web3Forms email. Tested: upload 200, signed download 200, tampered token 404, .exe 415, bad id 400. Deploy now viascripts/deploy.sh <project> <branch>(stages dist+functions; wrangler must run inside the stage). Gotcha: first bucket needs R2 enabled in the dashboard (Angel did, card on file, free tier). Billing alert must be set in the dashboard (token can't). - 2026-09-11 06:00: Uptime Kuma monitor #11
embeddedera.com(HTTP, 60 s, ntfy "Ntfy IPhone") added via theuptime-kuma-apiclient in~/.local/share/kuma-venv; Kuma admin login in~/.config/credentials/kuma.txt(the~/.config/kuma/dir ended up root-owned from the sudo reset — Angel tosudo chown -R angel:angel ~/.config/kuma). - 2026-09-11 03:00: Spanish site live on the preview under /es/ (18 pages, Astro built-in i18n, dictionaries
src/i18n/{en,es}.ts, hreflang/canonical per language, ES⇄EN toggle, forms localized with alanguagefield; English text byte-identical after the extraction). Intake forms fixed (hidden required fields blocked submit) and hCaptcha added; booking link on the site; conformal coating added. Audit: 0 broken links/anchors across 9 EN pages, structure consistent; small wording fixes queued. - 2026-09-11 00:15: Web3Forms key in
~/.config/web3forms/env(free plan: browser submissions only). Intake forms (/quote, six request types, request IDs) being built. cal.com booking link: https://cal.com/embeddedera/20-minute-call (free personal plan, Google Calendar connected). Google Business Profile created by Angel (verification pending). - 2026-09-10 23:55: Site says EmbeddedEra LLC, founded April 2024; lead time "as fast as four weeks… depending on parts availability" on Home, Services and FAQ. Pricing and standards lines drafted, waiting on Angel. Photo shoot on the calendar Sat 2026-09-19 13:00.
- 2026-09-10 23:40: Workspace aliases exist on adiaz@: purchasing, sales, socialmedia, info, marketing, billing, hello (added tonight). Site now shows hello@ as the public address. Cloudflare Web Analytics added in the dashboard with automatic setup (injects once the domain is proxied through Pages).
- 2026-09-10 23:30: Token extended (Analytics read, Email Routing Rules, Bot Management). AI-crawler blocking set to
disabledon the zone via API (wasonly_on_ad_pages). Email Routing rejected as the hello@ route: it replaces MX and would break Workspace mail → Workspace alias instead. Web Analytics creation needs a permission API tokens can't carry → dashboard step. - 2026-09-10 23:25: Five families / eleven services on
apple-style(added Software → "Apps and Software for Hardware Products"; Design → "Enclosures, Fixtures and Mechanical Parts"; third capability "Enclosures and fixtures, made here", text-only; no machine brands on the site by Angel's instruction). /privacy, touch icons, web manifest. Live preview 659c698. - 2026-09-10 23:10: DMARC
_dmarcTXT (p=none, rua=adiaz@) added via API. Email Routing and Web Analytics need token permissions the current token lacks → to-do. Security headers (public/_headers) and old-WordPress-URL redirects (public/_redirects) added; robots allows for AI crawlers, llms.txt/llms-full.txt (build script), /faq with FAQPage schema, definitional paragraph on About. - 2026-09-10 22:50: Consolidation done on
apple-style(headline "From schematic to tested board.", one voice, four service families Design/Firmware/Build and test/Redesign, specs strip, location folded into contact). Platforms broadened (STM32, ESP32, Nordic nRF, Microchip, TI, Arduino; BLE/Wi-Fi/Ethernet/CAN/USB/RS-485/radio). Nine services now, incl. "Reverse Engineering and Legacy Boards". Live preview https://embeddedera-apple.pages.dev. Rule 4 (prefer API-key services) added to global rules. - 2026-09-10 22:00: Apple-style is the chosen direction. Credibility pass done (first-person About, capabilities, how-it-works, quote checklist, OG image), Real Cow parked, images remapped to the right sections, board counts removed. Seven services now incl. "Obsolete Parts and Board Redesign" (own landing page /obsolete-parts-redesign) and "Automated Test Fixtures and 100% Production Testing"; "Universal Tester" name gone from live pages. JSON-LD ProfessionalService + search titles/descriptions + footer keyword line. Latest
apple-style971be2e → https://embeddedera-apple.pages.dev. - 2026-09-10 21:00: Two candidate looks side by side.
main(mirror of WordPress, dark, cards) → https://embeddedera-site.pages.dev. Branchapple-style(one idea per screen, big type, same copy/images/colors; worktree~/embeddedera-site-apple) → its own Pages project embeddedera-apple at https://embeddedera-apple.pages.dev because branch-alias URLs on a new project have no TLS cert for a while (handshake alert 40). Angel picks; the loser's branch stays in git. - 2026-09-10 20:30: v1 = mirror of the live WordPress pages (Home/Services/About/Contact, WP copy verbatim, dark theme). Case studies, Tools, Docs parked in
src/_parked/for phase 2. Deployed by direct upload to Pages projectembeddedera-site→ https://embeddedera-site.pages.dev (all 4 pages 200). Cloudflare API tokenclaude-plex(Pages:Edit, Zone DNS:Edit, Access:Edit on embeddedera.com) in~/.config/cloudflare/envwith account/zone ids. Gotcha: runningwranglerinside the repo auto-added the Workers adapter + wrangler.jsonc — reverted; always runwrangler pages deployfrom outside the repo. LAN preview: user unitsite-preview.service→ http://site.lan via NPM. - 2026-09-10 19:30: Phase 4 started. Stack decided (website-stack): Astro 5 + Tailwind v4 from the portfolio's own components, Cloudflare Pages. WordPress copy scraped (home/services/about — thin), logo recovered, portfolio cloned to
~/portfolio-sitefor media. Worker (Sonnet) building in~/embeddedera-site. The Real Cow flasher + configurator (EmbeddedEra org) → own subdomains later. - 2026-09-10 12:50: Angel switched nameservers at account.squarespace.com (domain is Squarespace-registered, resold via Google Workspace — that panel, not admin.google.com, is where nameservers live). A first attempt in May 2026 had stalled at this exact step and Cloudflare deleted the zone after 30 days. Cloudflare account nameservers: alexis + love.
- 2026-09-10: inventory taken from public DNS; no changes made. Repo
embeddedera-sitecreated with the five phase guides; this note renamed from embeddedera-domain to match.