Tasks¶
Generated by tasks-export from the assistant's task register — do not hand-edit; it is
overwritten on every run. Add or close tasks from the admin Tasks card, or ask the assistant.
See meetings-and-tasks for the design.
Generated: 2026-09-14 14:40 — 135 open, 0 overdue, 39 closed.
Open¶
- #21 Administration: Trademark: USPTO search on "EmbeddedEra", register if clear; buy embeddedera.net/.io/.co; pick one social handle spelling. — Trademark: USPTO search on "EmbeddedEra", register if clear; buy embeddedera.net/.io/.co; pick one social handle spelling. [note:embeddedera-business]
- #22 Administration: NC resale certificate (E-595E) + supplier business accounts with it on file (Digi-Key, Mouser, LCSC, JLCPCB/PCBWay). — NC resale certificate (E-595E) + supplier business accounts with it on file (Digi-Key, Mouser, LCSC, JLCPCB/PCBWay). [note:embeddedera-business]
- #23 Administration: Payment rails: Stripe invoices (card + ACH) + wire details; deposit policy; net terms rule. Then wire remit-to into the invoice template. — Payment rails: Stripe invoices (card + ACH) + wire details; deposit policy; net terms rule. Then wire remit-to into the invoice template. [note:embeddedera-business]
- #24 Administration: Internal rate card (never published) + time tracking (Kimai self-hosted or a daily vault log). — Internal rate card (never published) + time tracking (Kimai self-hosted or a daily vault log). [note:embeddedera-business]
- #25 yrosado@embeddedera.com / Administration: Shipping: business accounts (USPS Business / Pirate Ship, UPS), packaging spec (ESD/MSL bags), hazmat for batteries, HS codes + commercial invoice template for international. [note:embeddedera-business]
- #27 Administration: Product docs: datasheet / quick-start / manual per product, firmware changelog, support page; warranty end = ship date + term from ERP. — Product docs: datasheet / quick-start / manual per product, firmware changelog, support page; warranty end = ship date + term from ERP. [note:embeddedera-business]
- #28 Administration: Firmware release process: semver tags, checksummed images, flasher pinned to a release, version per serial. — Firmware release process: semver tags, checksummed images, flasher pinned to a release, version per serial. [note:embeddedera-business]
- #29 Administration: Email/IT hardening: DMARC none→quarantine→reject, DNSSEC on, registrar lock, MFA audit (Google, Cloudflare, GitHub, Resend, Vaultwarden); helper offboarding checklist. — Email/IT hardening: DMARC none→quarantine→reject, DNSSEC on, registrar lock, MFA audit (Google, Cloudflare, GitHub, Resend, Vaultwarden); helper offboarding checklist. [note:embeddedera-business]
- #30 Administration: Weekly numbers page (automated once the ERP has data): leads, quotes, win rate, revenue, inventory value, test yield, on-time ship, cash. — Weekly numbers page (automated once the ERP has data): leads, quotes, win rate, revenue, inventory value, test yield, on-time ship, cash. [note:embeddedera-business]
- #31 Administration: Affiliate income — scout done 2026-09-11 (Haiku). Apply in this order, all free: (1) PCBWay affiliate — 10% on referred orders + a referral coupon program, direct sign-up, no audience minimum: https:/ — Affiliate income — scout done 2026-09-11 (Haiku). Apply in this order, all free: (1) PCBWay affiliate — 10% on referred orders + a referral coupon program, direct sign-up, no audience minimum: https://www.pcbway.com/helpcenter/promotions/Do_you_have_an_Affiliate_Program_.html ; (2) JLCPCB affiliate for engineers — terms not public, apply and ask: https://jlcpcb.com/help/article/Affiliate-Program-for-Electronic-Engineers (their public referral program pays coupons only, new customers only); (3) Seeed Studio affiliate — 3% base up to 20% on campaigns, 45-day cookie, quarterly payout, $50 minimum: https://www.seeedstudio.com/blog/affiliate-program/ . Later, after the domain is live: Digi-Key via Impact/CJ (low single-digit %, needs an active site), Amazon Associates (3% industrial, W-9, $100 min). No program: OSH Park, Aisler (sponsorship only); Mouser/LCSC unclear. Site work once links exist: a "Where we get boards made / Resources" section, FTC disclosure line at the point of each link, UTM tags in
site.ts. [note:embeddedera-business] - #32 adiaz@embeddedera.com / Administration: Flyer / brochure: one two-sided sheet — services by family, capabilities specs strip, lead time, QR to the site; a PDF version for email. Same brand guide. — Flyer / brochure: one two-sided sheet — services by family, capabilities specs strip, lead time, QR to the site; a PDF version for email. Same brand guide. [note:embeddedera-business]
- #33 Administration: Trade show: pick one regional show to test (scout: NC manufacturing / electronics / maker events in the Triangle, e.g. NC Manufacturing Conference, RTP tech meetups, Maker Faire NC); budget a 10×10 bo — Trade show: pick one regional show to test (scout: NC manufacturing / electronics / maker events in the Triangle, e.g. NC Manufacturing Conference, RTP tech meetups, Maker Faire NC); budget a 10×10 booth kit (table cover, retractable banner, monitor loop of the shoot videos, sample boards under acrylic); swag (branded pens, stickers, PCB-coaster keychains made in house — cheap and on-brand); lead capture = the /quote form on a tablet. [note:embeddedera-business]
- #51 Administration: Walk each SOP on a real job and flip
status: draft→active; add Spanish versions if Yrosado prefers. — Walk each SOP on a real job and flipstatus: draft→active; add Spanish versions if Yrosado prefers. [note:mrp] - #52 Administration: LHG Contracting (InvenTree company 5) is billed with no sales tax. Get the NC resale/exemption certificate (Form E-595E) from Paul Hale and attach it to the company record; without it NC treats a B2B — LHG Contracting (InvenTree company 5) is billed with no sales tax. Get the NC resale/exemption certificate (Form E-595E) from Paul Hale and attach it to the company record; without it NC treats a B2B sale as taxable unless it is for resale. Ask the CPA in the sales-tax hour (see embeddedera-business). [note:mrp]
- #53 Administration: Finish provisioning
DESKTOP-1LK2GJK(Windows) — sync itself works:bin/notes-sync.cmdverified on the laptop 2026-09-09 (this note was pushed with it), andbin/notes-syncalso runs under Git Bas — Finish provisioningDESKTOP-1LK2GJK(Windows) — sync itself works:bin/notes-sync.cmdverified on the laptop 2026-09-09 (this note was pushed with it), andbin/notes-syncalso runs under Git Bash when called by full path. Still missing there:%USERPROFILE%\Notes\binis not on PATH, so both are invoked by full path;rules/CLAUDE.mdis not copied to%USERPROFILE%\.claude\CLAUDE.mdandrules/agentsis not linked, so the global rules and the worker/grader/scout agents apply only when a session reads them by hand; andpart-lookupstays broken until~/Documents/GitHub/KiCadis cloned.restore.shis Mac/Linux-only — do not run it on Windows. [note:plex-server] - #54 Administration: 05 — off-box copy. Half done 2026-09-08: versioned history now lives in a restic repo on the pool, inside parity — survives any one disk (map/objects/storage/history-repo). Remaining: create a B2 — 05 — off-box copy. Half done 2026-09-08: versioned history now lives in a restic repo on the pool, inside parity — survives any one disk (map/objects/storage/history-repo). Remaining: create a B2 bucket + app key, put
B2_ACCOUNT_ID/B2_ACCOUNT_KEY/HISTORY_OFFBOX_REPO=b2:<bucket>:restic-historyin~/.config/restic/env, runhistory-backup copy, prove a restore from B2. [note:plex-server] - #55 Administration: Save the restic password to the password manager —
~/.config/restic/password. Without it the history repo is unrecoverable after an OS-disk loss. Not on the rescue USB by design. — Save the restic password to the password manager —~/.config/restic/password. Without it the history repo is unrecoverable after an OS-disk loss. Not on the rescue USB by design. [note:plex-server] - #56 Administration: 16B — dedupe, scheduled
maint-dedupe2026-09-11 08:00, auto-links on a clean scan. 20 pairs / 140 GiB. — 16B — dedupe, scheduledmaint-dedupe2026-09-11 08:00, auto-links on a clean scan. 20 pairs / 140 GiB. [note:plex-server] - #57 Administration: Delete the
recovered-*trees (292 GiB, already out of parity) — gated onrk testproving the USB archive extracts, since compose +.envlive nowhere else. — Delete therecovered-*trees (292 GiB, already out of parity) — gated onrk testproving the USB archive extracts, since compose +.envlive nowhere else. [note:plex-server] - #58 Administration: 19 — replace the 78k-hour parity HGST, then add a second parity disk. 20 — a UPS (54 of 73 power cycles were unclean). 14 — a 92 mm intake fan whenever the case is open. — 19 — replace the 78k-hour parity HGST, then add a second parity disk. 20 — a UPS (54 of 73 power cycles were unclean). 14 — a 92 mm intake fan whenever the case is open. [note:plex-server]
- #59 Administration: 18 — qBittorrent share limits stay reverted until measured against the real torrent list;
removeCompletedDownloads=falseis the interlock. — 18 — qBittorrent share limits stay reverted until measured against the real torrent list;removeCompletedDownloads=falseis the interlock. [note:plex-server] - #79 Administration: Revisit calendar invitations when service-account keys become possible — The server cannot write to Google Calendar: the Google Workspace org policy blocks service-account key creation (iam.disableServiceAccountKeyCreation), so there is no credential the server can hold. Working approach today: meeting invitations go out as .ics calendar attachments emailed from adiaz@embeddedera.com, and the normal calendar client handles reminders. Costs nothing and needs no key. Revisit if the org policy is relaxed, or if a per-user OAuth consent flow is worth building. See ~/Notes/projects/meetings-and-tasks.md (Phase 3). [note:projects/meetings-and-tasks.md]
- #80 adiaz@embeddedera.com / Administration: Book the CPA hour, and add the direct-sales question (due 2026-10-01) — Decided path in projects/embeddedera-business.md: one hour with a CPA before the first invoice goes through the new system. Add a second question now: what changes when we sell direct from embeddedera.com rather than through eBay? On eBay the marketplace collects and remits sales tax; on our own storefront that obligation becomes ours. Blocks: ledger choice, NC sales-and-use registration, E-595E resale certificate, the storefront, and all of Finance.
Absorbed task 34 on 2026-09-14: the accounting scout's unverified numbers are exactly what the CPA hour (task 80) settles; carrying them separately just invites acting on them. [plan:projects/platform-preflight.md] - [ ] #83 yrosado@embeddedera.com / Administration: Decide the public mailing address [plan:projects/platform-preflight.md] - [ ] #84 adiaz@embeddedera.com / Administration: Decide: does the sandbox get its own Kanboard? — House rule is try it on the sandbox first, which would mean a second Kanboard container reset from a snapshot like the ERP has. The alternative is testing notification and permission changes against the live board. Decides whether task-board phase 1 costs one container or two. [plan:projects/platform-preflight.md] - [ ] #85 adiaz@embeddedera.com / Administration: Add Yara through the admin People card as sales,finance — So the second person exists before anything is designed around assignment, notification and segregation of duties. admin.embeddedera.com, People card.
Not done as written. Yara exists in people.yml as sales, purchasing — not sales, finance. She has a Kanboard account and now receives assignment emails. If she should hold finance (which would give her the books at /books), that is a permission change worth making deliberately. [plan:projects/platform-preflight.md]
- [ ] #86 adiaz@embeddedera.com / Administration: Rehearse a restore from backup, once — erp-backup already covers InvenTree, Vaultwarden and the assistant sqlite, age-encrypted to R2, and rescue-kit exists — but a restore that has never been run is a rumour. Do it once before Kanboard is added to the list of things that would need restoring. Process: Notes/map/processes/rescue-build.md.
Progress: Rehearsed 2026-09-13 and it passes — but the drill was only checking InvenTree, so it was proving a third of the restore. erp-backup verify now also opens the Kanboard, assistant and Vaultwarden sqlite copies from the decrypted archive and counts rows: 141 tasks, 141 assistant rows, 14 vault ciphers, alongside the existing 10 part categories and 20 stock locations. It runs weekly at 06:15 Sunday from cron. Left open for you to do one yourself at least once — knowing the restore works is not the same as having done one. [plan:projects/platform-preflight.md]
- [ ] #87 adiaz@embeddedera.com / Administration: Decide the platform-work budget before 11 November (due 2026-09-20) — projects/platform-preflight.md: these plans are three to four weeks of building and the tester product and PCB Carolina are not in that number. Decide how many days between now and the show belong to internal platform work. Recommended cut: do the function split, the CPA hour and Kanboard phases 1-3; defer the AI proposal pipeline, the notebook site, the storefront and the department job classes until after November. [plan:projects/platform-preflight.md]
- [ ] #88 yrosado@embeddedera.com / Administration: Get general liability and product liability insurance —
Absorbed task 137 on 2026-09-14: duplicates task 88 (insurance). The Hiscox/Next/Thimble shortlist from here is now on 88.
Shortlist from the merged task: Hiscox / Next / Thimble for GL + product liability + E&O quotes. [plan:projects/platform-preflight.md] - [ ] #89 adiaz@embeddedera.com / Administration: Write terms of sale and a warranty statement — SOP-014 covers RMA mechanics, not the commitment. What is the tester's warranty, and what happens on a return outside it?
Draft written 2026-09-14 — ~/Notes/projects/terms-and-warranty.md, readable at notebook.embeddedera.com.
The recommendation is NOT a single one-year warranty, because three different things are sold and the risk is not the same:
| What | Designed by | Warranty |
|---|---|---|
| Our own products | us | 1 year, materials and workmanship |
| Assembly of a customer's design | the customer | 90 days, workmanship only |
| Design/firmware/software services | us | 90 days to re-perform |
A blanket year on everything would quietly promise that a CUSTOMER's design will work for a year — a promise this shop cannot keep and no contract manufacturer makes.
The clause that matters most for a two-person shop is the liability cap: total liability limited to the amount paid. A $4,000 assembly job that ends up in a product failing in the field can generate a claim far larger than the job.
Before it goes live: an attorney reads it (the implied-warranty disclaimer, the cap, the
critical-use clause — a disclaimer must be conspicuous to be effective and that is
state-specific); product liability insurance is in place (task 88 — the cap handles contract
claims, not someone injured by a product); and it is published and cited on every quote and
invoice, because a warranty nobody was shown is hard to enforce. [plan:projects/platform-preflight.md]
- [ ] #90 adiaz@embeddedera.com / Administration: Decide customer data handling: what we hold, where, how long — Customer designs and files. Matters the first time a customer asks, and they will. Feeds a section in SOP-012. [plan:projects/platform-preflight.md]
- [ ] #91 adiaz@embeddedera.com / Administration: Decide retention periods for logs and transcripts — Chat history, prompt logs, task events and AI proposal transcripts all accumulate, and once there is a second employee some of it is activity monitoring. Decide the lifetime of each and record it in SOP-010 and SOP-017 before there is a year of it. [plan:projects/platform-preflight.md]
- [ ] #98 Administration: Build the AI proposal pipeline — projects/ai-across-departments.md and task-board.md. Sandbox run, proposal report as a downloadable file plus an email, per-item review with no approve-all, apply with optimistic concurrency, outcome report. Everything else in the AI plan depends on this existing. [plan:projects/platform-preflight.md]
- [ ] #109 Administration: ✱ Compliance audit of the 3 products (FCC for any radio — record modular FCC IDs on the parts in InvenTree; listed supplies for mains; UN38.3/hazmat for batteries; CE/RoHS/WEEE only if selling to the — ✱ Compliance audit of the 3 products (FCC for any radio — record modular FCC IDs on the parts in InvenTree; listed supplies for mains; UN38.3/hazmat for batteries; CE/RoHS/WEEE only if selling to the EU). Angel: list what each product contains; Claude: checklist + label requirements per product. [kanboard]
- [ ] #111 adiaz@embeddedera.com / Administration: Social media auto-posting (Angel, 2026-09-11): pick a free scheduler with an API — candidates: Postiz (open source, self-hostable on the Plex box, API key), n8n on the box driving the platform APIs di — Social media auto-posting (Angel, 2026-09-11): pick a free scheduler with an API — candidates: Postiz (open source, self-hostable on the Plex box, API key), n8n on the box driving the platform APIs directly, Buffer free tier (limited). Accounts: Instagram embedded_era, Facebook page, X EmbeddedEra, LinkedIn (company page still to create), YouTube. Content sources: the engineering notes, photo-shoot output (2026-09-19), each new case study. Rule: Claude drafts, Angel approves a weekly batch, scheduler posts. Scout pass first. [note:embeddedera-business]
- [ ] #128 adiaz@embeddedera.com / Administration: names of the 3 products and roughly how many part numbers each BOM has (sizing). — names of the 3 products and roughly how many part numbers each BOM has (sizing). [note:mrp]
- [ ] #129 adiaz@embeddedera.com / Administration: does the Universal Tester already write results anywhere (CSV? log?) — that is the integration point for phase 3. — does the Universal Tester already write results anywhere (CSV? log?) — that is the integration point for phase 3. [note:mrp]
- [ ] #130 adiaz@embeddedera.com / Administration: who else needs a login, and what should they see (inventory only? orders?). — who else needs a login, and what should they see (inventory only? orders?). [note:mrp]
- [ ] #131 adiaz@embeddedera.com / Administration: fill the 7 empty Login entries in Vaultwarden (Tesla dev, Cloudflare, GitHub, both Googles, DuckDNS, NordVPN) and set up the iOS app + autofill. — fill the 7 empty Login entries in Vaultwarden (Tesla dev, Cloudflare, GitHub, both Googles, DuckDNS, NordVPN) and set up the iOS app + autofill. [note:plex-server]
- [ ] #132 adiaz@embeddedera.com / Administration: Vaultwarden 2FA (Angel): web vault → Settings → Security → Two-step login: authenticator app + passkey; save the recovery code on paper with the master password. Email 2FA needs SMTP (Gmail app passwo — Vaultwarden 2FA (Angel): web vault → Settings → Security → Two-step login: authenticator app + passkey; save the recovery code on paper with the master password. Email 2FA needs SMTP (Gmail app password) — not configured yet. [note:plex-server]
- [ ] #134 adiaz@embeddedera.com / Administration: Watch the first real firing (next Wed swim block 11:30–12:30, or the next Square barbershop reminder on a Thursday) in ~/.local/state/tesla-automation/cron.log and ntfy; then tune LEAD_MINUTES / — Watch the first real firing (next Wed swim block 11:30–12:30, or the next Square barbershop reminder on a Thursday) in~/.local/state/tesla-automation/cron.logand ntfy; then tuneLEAD_MINUTES/END_LEAD_MINUTESin~/.config/tesla/envor the 11:30–12:30 window in~/.claude/routines/_shared-facts.mdfrom Angel's feedback. [note:tesla-automation]
- [ ] #135 **adiaz@embeddedera.com / Administration**: putTESLA_CLIENT_SECRET,TESLA_REFRESH_TOKENand the calendar's secret iCal URL (all in~/.config/tesla/env) into the password manager; the iCal URL can be reset from Google Calendar settings if — putTESLA_CLIENT_SECRET,TESLA_REFRESH_TOKENand the calendar's secret iCal URL (all in~/.config/tesla/env) into the password manager; the iCal URL can be reset from Google Calendar settings if it ever leaks. [note:tesla-automation]
- [ ] #136 **adiaz@embeddedera.com / Administration**: Parked (Angel: "don't do anything yet"): weather gate via open-meteo (skip cooling on mild days), forgot-to-plug / low-battery ntfy at night, nightly charge management, Garmin-linked pre-cool, daily p — Parked (Angel: "don't do anything yet"): weather gate via open-meteo (skip cooling on mild days), forgot-to-plug / low-battery ntfy at night, nightly charge management, Garmin-linked pre-cool, daily planner pass via the claude.ai connector, work calendar (adiaz@embeddedera.com) as a secondCALENDAR_ICS_URL`. [note:tesla-automation]
- [ ] #138 adiaz@embeddedera.com / Administration: ✱ Contracts pack: design-services terms (IP on payment, liability cap, acceptance, payment), mutual NDA, contractor agreement with IP assignment, product terms of sale + warranty + returns. Claude dra — ✱ Contracts pack: design-services terms (IP on payment, liability cap, acceptance, payment), mutual NDA, contractor agreement with IP assignment, product terms of sale + warranty + returns. Claude drafts from standard templates; Angel has a lawyer review once.
Terms of sale + warranty are being done under task 89 (draft on the notebook, Yara reviewing on 174). This task keeps the rest of the pack: design-services MSA, mutual NDA, contractor agreement with IP assignment. [note:embeddedera-business]
- [ ] #139 adiaz@embeddedera.com / Administration: Bus factor: name one person with emergency access (ship/refund/answer) and write the 1-page "if Angel is out" note. — Bus factor: name one person with emergency access (ship/refund/answer) and write the 1-page "if Angel is out" note. [note:embeddedera-business]
- [ ] #140 adiaz@embeddedera.com / Administration: Business phone number (Angel, 2026-09-11): Google Voice personal is free (US number, rings the phone, voicemail transcription, spam screening) — legitimate enough for the site and Business Profile; Go — Business phone number (Angel, 2026-09-11): Google Voice personal is free (US number, rings the phone, voicemail transcription, spam screening) — legitimate enough for the site and Business Profile; Google Voice for Workspace is $10/user/month if it must live under the company account; Twilio (~$1.15/month per number + per-minute, API key) if we ever want call routing/SMS automation from the server. Recommendation: free Google Voice on angelgdo7 now, forward to the phone, list it on the site and the Business Profile; upgrade only if a second line or automation is needed. [note:embeddedera-business]
- [ ] #141 adiaz@embeddedera.com / Administration: Brand guide written at ~/Notes/brand/README.md — Angel to decide the three open items: an SVG of the wordmark (current white one is raster), a print typeface (Inter + JetBrains Mono suggested), and — Brand guide written at ~/Notes/brand/README.md — Angel to decide the three open items: an SVG of the wordmark (current white one is raster), a print typeface (Inter + JetBrains Mono suggested), and a Pantone match for the copper if a printer asks. [note:embeddedera-business]
- [ ] #142 yrosado@embeddedera.com / Administration: Business cards: design from the brand guide (front: mark + name + title; back: hello@embeddedera.com, embeddedera.com, cal.com/embeddedera, QR to /quote). Print via a free-design + cheap-print route ( [note:embeddedera-business]
- [ ] #143 adiaz@embeddedera.com / Administration: Decide a default owner per department for unassigned work — 112 of the 141 migrated tasks sit in Unassigned because they came from the project notes and never had a department. Unassigned is where work rots: nobody is nagged and the digest has nobody to tell. The plan calls for each department to name a default owner in departments.yml so unassigned overdue work goes to them. Until then somebody triages that pile by hand. [kanboard]
- [ ] #144 adiaz@embeddedera.com / Administration: Finish the gated file browser (files.embeddedera.com) — Attempted 2026-09-13, backed out cleanly — nothing left running, files.lan untouched.
What is settled: a second Filebrowser instance is the right shape, NOT gating the existing one. The existing filebrowser mounts /home/angel as uid 1000, so it can read every API key and SSH key on the box; it must stay LAN-only. The new one sees /mnt/storage/EmbeddedEra and Storage-snapshots (read-only) and nothing else. Config and Caddyfile are kept at ~/torrentvpn/files-shop/.
Where it stuck: Filebrowser v2.32 proxy auth returns 401 even with users pre-created (adiaz, yrosado exist in its db), auth.method=proxy and auth.header=X-Remote-User set in the database, and the header arriving. Tried: auth in the config JSON (ignored), config set in the db, running without --config (the image's own /.filebrowser.json then wins). Next thing to try: a newer image, or the --auth.method flag on the command line, or check whether v2 proxy auth needs the header name lowercase.
Unrelated but worth doing at the same time: the built-in admin account in its database should be removed, the way Kanboard's was.
--- second attempt, 2026-09-13 ---
Ruled out: users missing (both exist), the database not being found (the image's baked
/.filebrowser.json points at /database.db, NOT the mounted one — fixed by overriding that
file), and the auth setting not being stored (config cat --database ... confirms
"Auth method: proxy" with header X-Remote-User).
Still 401 with the header present. Best remaining theory: whenever a JSON config file is
present, Filebrowser v2 re-applies every setting including the ones the file omits, so
auth.method silently reverts to "json" at each start. Next things to try, cheapest first:
run with NO config file at all and only command-line flags; a newer image tag; or drop
Filebrowser for something whose proxy-auth story is first-class. [kanboard]
- [ ] #155 adiaz@embeddedera.com / Administration: Take the bookkeeping capture list to the CPA hour — ~/Notes/projects/bookkeeping.md lists what a US LLC has to hand over and ends with eight specific questions for them: cash or accrual, whether inventory must be tracked and on what method, the capitalisation threshold, Section 179 on equipment already bought, whether NC sales-and-use registration is needed before the first direct sale, home office and vehicle, which ledger THEY want the data in, and the quarterly estimate schedule. Arriving with that list is what makes the hour cheap. [kanboard]
- [ ] #156 adiaz@embeddedera.com / Administration: Collect W-9s before paying anyone, not in January — Anyone paid $600 or more in a year needs a 1099-NEC, which needs a W-9. Collected up front it is a form; collected in January it is a chase. Nothing to build — a habit, and later an audit check that flags a contractor approaching the threshold with no W-9 on file. [kanboard]
- [ ] #158 Administration: Build the CPA handoff pack — One button, one folder: summary, income.csv, expenses.csv, capital-items.csv, sales-tax.csv, inventory-valuation.csv, receipts/, statements/, and questions.md listing what could not be classified. Works whichever ledger is eventually chosen. [kanboard]
- [ ] #159 Administration: Import Chase statements into the books — Free, leaks nothing, and the CPA needs the statements anyway. Drop the CSV/QFX Chase exports into /books, parse the transactions, match them against confirmed expenses by date and amount, and show the unmatched ones to categorise — that reconciliation is what catches the expense nobody photographed. Blocked on one answer: business or personal account, and how many. An aggregator (Teller free tier, SimpleFIN ~$1.50/mo) would automate it but gives a third party continuous read access to an account with payment capability — a real decision, not a checkbox. [kanboard]
- [ ] #160 adiaz@embeddedera.com / Administration: Decide: aggregator access to the bank, or statement import only — Import is free and shares nothing. Plaid/Teller/SimpleFIN automate it but hold read access to a business account. Chase supports OAuth with the big ones, so no password is handed over — but the access is continuous. Your call; import works either way and is the fallback when an aggregator connection breaks. [kanboard]
- [ ] #163 Administration: Make the expense record append-only — A confirmed amount can be changed with nothing recording that it was, by whom, or from what. The records behind a tax return should be traceable. A correction should write a superseding row, never overwrite. Cheap now, impossible to reconstruct later. Review item 2. [kanboard]
- [ ] #169 Administration: Add the two SOP-018 audit checks — SOP-018 Content Publishing declares SOP-018.draft-stale (a draft older than 14 days that nobody approved or rejected) and SOP-018.rejected-without-reason. Both are declared in the front matter but not yet implemented in sop-audit, so they are silent. Draft state comes from comparing the notes directories on main and apple-style; rejection reasons are in ~/.local/state/rejected-notes/. [kanboard]
- [ ] #171 adiaz@embeddedera.com / Administration: Identify or revoke the orphaned openai-tunnel key — ~/.config/openai-tunnel/runtime.env holds a CONTROL_PLANE_API_KEY dated 2026-08-18. Nothing on this machine references it — no script, no systemd unit, no container, no map card. Found by the new SOP-020.key-registered check on the day it was written.\n\nIt is recorded in credentials.yml as UNIDENTIFIED rather than deleted, because an orphaned key that turns out to be load-bearing is a worse morning than one that sits unused for another week.\n\nDo you recognise it? If not, revoke it at whatever service issued it and delete the file. A key nobody can account for is one nobody can revoke in a hurry, which is the whole point of the register. [kanboard]
- [ ] #172 Administration: Build the channel adapter: InvenTree pushes stock, channels push orders back — Follows the 2026-09-14 decision that InvenTree is master for stock. One adapter interface — read orders, write available quantity, reconcile and report drift — with eBay as the first implementation and Amazon and any future storefront as further ones. Deliberately NOT an eBay script: two copies of that logic is how the second channel takes as long as the first.\n\nreconcile.py becomes a drift check that raises a task rather than a source of truth. Items a channel sells that the shop never stocks stay that channel's business — the rule is per item, not per system. Still no second stock database.\n\nDepends on the eBay production cutover (projects/ebay-store.md) landing first. [kanboard]
- [ ] #175 Administration: Build a real vault check for SOP-020 — SOP-020.key-in-vault was renamed key-fields because it only checked that register entries were complete — it never looked in Vaultwarden. A real check needs the vault's CLI (bw) with a scoped account, listing item names and comparing them to credentials.yml. Until then, rule 2 of SOP-020 is a habit, not a check. [kanboard]
- [ ] #176 Administration: Schedule a cold-read audit every quarter — The 2026-09-14 independent audit found a critical network-isolation hole that the same-day self-review had described as safe. A review written by the mind that built the thing describes the design as intended. Put a fresh-agent audit on the quarterly review (SOP-015) rather than relying on it happening once. [kanboard]
- [ ] #1 Engineering: Fill Description/Datasheet/Manufacturer from the Mouser cache for symbols that have an MPN (scripting/lifecycle_scan.py cache → new fill_from_cache.py). — Fill Description/Datasheet/Manufacturer from the Mouser cache for symbols that have an MPN (scripting/lifecycle_scan.py cache → new fill_from_cache.py). [note:KiCad]
- [ ] #2 Engineering: Hand-fill MPN + LCSC on the 65 EmbeddedEra symbols lacking one; mark generics (jumpers, test points, headers) as n/a. List: scripting/embeddedera_audit.csv. — Hand-fill MPN + LCSC on the 65 EmbeddedEra symbols lacking one; mark generics (jumpers, test points, headers) as n/a. List: scripting/embeddedera_audit.csv. [note:KiCad]
- [ ] #3 Engineering: Symbol generation from LCSC/SnapEDA for new parts (easyeda2kicad / kandle). — Symbol generation from LCSC/SnapEDA for new parts (easyeda2kicad / kandle). [note:KiCad]
- [ ] #4 Engineering: Library data error: 1206_1%_e24_e96_Panasonic:R_1206_6.04k_1% carries MPN RC1206JR-07330RL (a 330R 5% part). Check the whole Panasonic 1206 lib for copy-paste MPNs. — Library data error: 1206_1%_e24_e96_Panasonic:R_1206_6.04k_1% carries MPN RC1206JR-07330RL (a 330R 5% part). Check the whole Panasonic 1206 lib for copy-paste MPNs. [note:KiCad]
- [ ] #5 Engineering: Symbol creation on request (plan 2026-09-09): passives = clone neighbour symbol in the matching Yageo lib and change Value/MPN/LCSC/Description/Datasheet only; non-standard values → nearest E96 (decid — Symbol creation on request (plan 2026-09-09): passives = clone neighbour symbol in the matching Yageo lib and change Value/MPN/LCSC/Description/Datasheet only; non-standard values → nearest E96 (decide: default or ask). ICs/connectors = easyeda2kicad by LCSC → SnapEDA/UltraLibrarian zip via kandle → KiPart from datasheet pin CSV; land in a staging lib for review (decide). Then run field fill + kicad-cli parse check. [note:KiCad]
- [ ] #100 Engineering: Add kicad-cli checks to CI on the KiCad repo — Headless ERC, DRC, gerber export and BOM on every push, failures raising tasks. No AI involved, deterministic, and it makes SOP-008 machine-checkable.
Half done 2026-09-14. The workflow and its check script are written and tested locally — .github/workflows/kicad-checks.yml and .github/scripts/kicad_checks.py in the kicad-lib repo, run exactly as CI would and producing the same 57 errors as the server. NOT pushed to GitHub: that is outward-facing and wants your eye first. Review those two files and push when happy. [plan:projects/platform-preflight.md]
- [ ] #102 Engineering: Add InteractiveHtmlBom and KiCanvas — InteractiveHtmlBom is a production tool: a self-contained HTML BOM with click-to-highlight placement, for a tablet at the bench. KiCanvas is the embeddable web KiCad viewer asked for months ago.
Half done 2026-09-14: kicad-ibom works — InteractiveHtmlBom 2.12 in the pinned KiCad container, headless, output verified self-contained (325 kB, no external assets). KiCanvas is still to do and belongs with the engineering portal. [plan:projects/platform-preflight.md]
- [ ] #146 Engineering: Description quality — 5 failing [SOP-002.description-quality] (due 2026-09-19) — Description must be non-empty, different from Name, and <=100 chars (SOP-002 Part Creation).
Count: 5
Sample: - EE-C-0038 - EE-C-0040 - EE-C-0041 - EE-C-0060 - EE-C-0073
sop-audit check SOP-002.description-quality — updated 2026-09-14 10:14 [sop-audit:SOP-002.description-quality]
- [ ] #147 adiaz@embeddedera.com / Engineering: ESP32-C6-LCD-1.47 points at a footprint library nobody else has — Found 2026-09-13 while adding SOP-008 library checks. The symbol ESP32-C6-LCD-1.47 has Footprint = Angel_Library:ESP32-C6-LCD-1.47. Angel_Library is neither a KiCad standard library nor one of the .pretty libraries in the EmbeddedEra/KiCad repo, so it only resolves on the machine that has it locally — anyone else opening that symbol gets nothing, and so does a future CI run.\n\nFix: move the footprint into EmbeddedEra_Library.pretty in the repo and repoint the symbol. The audit check deliberately does NOT flag this, because it only checks libraries we own — flagging every external reference produced 48 false positives out of 49. [kanboard]
- [ ] #148 Engineering: Build the engineering portal over the KiCad projects — Plan: ~/Notes/projects/engineering-portal.md. engineering.embeddedera.com — browser-viewable schematics and boards (KiCanvas), an InteractiveHtmlBom per project for the bench, and the last ERC/DRC result per commit. Content comes from CI on each repo, never hand-maintained. Depends on kicad-cli checks existing first: a portal that shows a board is nice, one that also says the last DRC was clean on this commit is the thing worth having. [kanboard]
- [ ] #149 adiaz@embeddedera.com / Engineering: Review the 57 ERC/DRC findings kicad-check turns up (KiCad 10) — kicad-check (KiCad 9.0.9 in a container) now runs ERC and DRC across all 44 schematics and boards in kicad-lib. After excluding what is meaningless for a fragment — unconnected pins and undriven power rails, which are the whole point of a reusable block — 21 errors remain across 16 projects, plus 45 warnings.\n\nBiggest: template/JLCPCB_1-2Layer (4 DRC), blocks/NRF24_smd (3), and a single error repeated across most of the LED blocks, which smells like one mistake copied.\n\nAn engineer needs to look at these once and decide which are real. Whatever is deliberate should be silenced properly in the design or the check, not left to be scrolled past every run.\n\nRun: kicad-check (human) or kicad-check --json (machine).
Corrected 2026-09-13, KiCad 10.0.5. The first run used KiCad 9 and undercounted: 21 errors. Re-run on 10.0.5 — the version actually used for design — gives 57 errors across 22 projects, 126 warnings. The repo is mixed: block schematics are still the v9 format (20250114) while the symbol library is already v10 (20251024), so a v9 CLI was reading a newer library.\n\nBiggest, and they look real: blocks/usb_c and blocks/EmbeddedEra.kicad_blocks/USB_C have 16 DRC errors each (11 clearance — one is 0.1984 mm against a 0.2 mm rule — 4 hole clearance, 1 invalid outline). Those are manufacturing problems, not ERC pedantry. Then JLCPCB template (4) and NRF24_smd (3). [kanboard]
- [ ] #150 adiaz@embeddedera.com / Engineering: Write down the PCB design rules (net classes, widths, clearances) — Blocks the template. Needs the fab's actual capability numbers for the process we buy — JLCPCB 2-layer and 4-layer — not folklore: track/space minimums, annular ring, hole sizes, edge clearance, and the impedance targets for USB (90 ohm diff) and any RF (50 ohm). An engineer's call, not a machine's. Plan: ~/Notes/projects/project-template.md. [kanboard]
- [ ] #151 Engineering: Build the Project_Template repo — One repo per product with a fixed shape (hardware/, firmware/, app/, mechanical/, artwork/, test/, docs/) plus product.yml as the manifest, and the KiCad checks workflow already wired. Depends on the design rules being written down first. Plan: ~/Notes/projects/project-template.md. [kanboard]
- [ ] #152 Engineering: Write SOP-018 New PCB Design and SOP-019 Product Records — SOP-018: start from the template, number it per SOP-001, net classes and when to deviate, what done means (ERC/DRC clean, BOM resolves to real IPNs, fab files from CI not by hand). SOP-019: what a product repo must contain, how a revision is cut, what evidence a shipping product carries.
Renumbered 2026-09-14. 018 went to Content Publishing, 019 to Cloudflare Changes and 020 to Credentials and API Keys, all written. These two are now SOP-021 New PCB Design and SOP-022 Product Records, still unwritten, and still blocked on the design rules being decided first (task 150). [kanboard] - [ ] #153 Engineering: Backfill product.yml for the Real Cow — The Real Cow lives across five repos — Cow_Robot_Board, Cow_Remote, Cow_LCD, The_Real_Cow_Flasher, The_Real_Cow_Configurator — with no front door: nothing says which board revision ships with which firmware. It is the messy real case, so it is the test of whether the manifest idea works. [kanboard] - [ ] #101 Purchasing: Build the lifecycle and price watch — Nightly pass over the BOMs we actually build using the DigiKey and Mouser keys within their daily budget; raise a task when a part goes NRND or a price moves sharply. Cache aggressively, never poll.
Absorbed task 26 on 2026-09-14: duplicates task 101 (the lifecycle and price watch) — same idea, built on part-refresh's cache.
Absorbed task 68 on 2026-09-14: decided: Nexar/Octopart is paid now and the shop already holds DigiKey and Mouser keys — rejected in ai-across-departments.md. Folded into 101.
Absorbed task 69 on 2026-09-14: decided: the gap is answered by our own tooling (part-refresh + the watch in task 101); no third-party checker needed. [plan:projects/platform-preflight.md]
- [ ] #6 Sales: [1. Auth] Re-authorize before the sandbox refresh token lapses, around March 2028. ./auth.sh login, one browser step. Nothing warns you when it expires. — Re-authorize before the sandbox refresh token lapses, around March 2028. ./auth.sh login, one browser step. Nothing warns you when it expires. [note:ebay-store]
- [ ] #7 Sales: [2. Inventory] Enter real stock. Every cost and bin is currently blank, so the capital rollup reports nothing. — Enter real stock. Every cost and bin is currently blank, so the capital rollup reports nothing. [note:ebay-store]
- [ ] #8 Sales: [2. Inventory] Aspect cache per category, so a listing stops failing on a missing required field. aspects.sh already fetches them; store per category id. — Aspect cache per category, so a listing stops failing on a missing required field. aspects.sh already fetches them; store per category id. [note:ebay-store]
- [ ] #10 Sales: [3. Production cutover] Configure marketplace account deletion notifications on the production keyset. Blocked by the privacy policy URL. — Configure marketplace account deletion notifications on the production keyset. Blocked by the privacy policy URL. [note:ebay-store]
- [ ] #11 Sales: [3. Production cutover] Real street address in create-location.sh; it still says 123 Main Street. — Real street address in create-location.sh; it still says 123 Main Street. [note:ebay-store]
- [ ] #12 Sales: [3. Production cutover] At production cutover, verify USPSGroundAdvantage is live in that environment's service catalogue before trusting the env switch in create-policies.sh. Only the sandbox cat — At production cutover, verify USPSGroundAdvantage is live in that environment's service catalogue before trusting the env switch in create-policies.sh. Only the sandbox catalogue has been checked. [note:ebay-store]
- [ ] #13 Sales: [3. Production cutover] Sandbox policy 6250043000 is a dead clone that sandbox refuses to delete. It is renamed "DO NOT USE" and set to ground so it is harmless, but do not carry it into production; — Sandbox policy 6250043000 is a dead clone that sandbox refuses to delete. It is renamed "DO NOT USE" and set to ground so it is harmless, but do not carry it into production; recreate policies there from create-policies.sh alone. [note:ebay-store]
- [ ] #14 Sales: [3. Production cutover] Recreate policies and location against the production account, and record the new ids. — Recreate policies and location against the production account, and record the new ids. [note:ebay-store]
- [ ] #15 Sales: [3. Production cutover] Move tokens from .env to macOS Keychain (security add-generic-password) for production. — Move tokens from .env to macOS Keychain (security add-generic-password) for production. [note:ebay-store]
- [ ] #16 Sales: [4. Features, after the store is live] Listing workflow: a photos folder plus a few fields becomes a listing, instead of hand-written JSON per item. — Listing workflow: a photos folder plus a few fields becomes a listing, instead of hand-written JSON per item. [note:ebay-store]
- [ ] #17 Sales: [4. Features, after the store is live] Image hosting. eBay requires public https image URLs. Cheapest path is probably the existing embeddedera.com WordPress media library. — Image hosting. eBay requires public https image URLs. Cheapest path is probably the existing embeddedera.com WordPress media library. [note:ebay-store]
- [ ] #18 Sales: [4. Features, after the store is live] Order pulling via the Fulfillment API, and mark-as-shipped. — Order pulling via the Fulfillment API, and mark-as-shipped. [note:ebay-store]
- [ ] #19 Sales: [4. Features, after the store is live] Price and quantity sync for live listings (bulkUpdatePriceQuantity). — Price and quantity sync for live listings (bulkUpdatePriceQuantity). [note:ebay-store]
- [ ] #20 Sales: [4. Features, after the store is live] Reporting: sales, fees, stale listings. — Reporting: sales, fees, stale listings. [note:ebay-store]
- [ ] #36 Sales: 2026-09-18 or later: cancel the WordPress.com plan (site no longer served since 2026-09-11); export nothing more — all content is in the repo. — 2026-09-18 or later: cancel the WordPress.com plan (site no longer served since 2026-09-11); export nothing more — all content is in the repo. [note:embeddedera-site]
- [ ] #37 Sales: Search Console tidy (optional): remove the accidental URL-prefix properties /es/ and /services/; keep the Domain property. Re-check the Google snippet/favicon in ~1–2 weeks. — Search Console tidy (optional): remove the accidental URL-prefix properties /es/ and /services/; keep the Domain property. Re-check the Google snippet/favicon in ~1–2 weeks. [note:embeddedera-site]
- [ ] #39 Sales: Photo + video shoot scheduled Sat 2026-09-19 13:00–15:00 (calendar event on angelgdo7 carries the shot list: line, stencil printer, reflow, test station, bench, finished board, laser-cut/3D-printed pa — Photo + video shoot scheduled Sat 2026-09-19 13:00–15:00 (calendar event on angelgdo7 carries the shot list: line, stencil printer, reflow, test station, bench, finished board, laser-cut/3D-printed parts, membrane overlay, wide shot; 3 muted video loops). Afterwards Claude places them on the Capabilities screen and the hero, replacing the Pexels stock. [note:embeddedera-site]
- [ ] #42 Sales: Phase 2 of the site: restore src/_parked/ pages (case studies, Tools, Docs), add videos back, GLB viewer. — Phase 2 of the site: restore src/_parked/ pages (case studies, Tools, Docs), add videos back, GLB viewer. [note:embeddedera-site]
- [ ] #43 Sales: Tools — Pages projects for EmbeddedEra/The_Real_Cow_Flasher → flasher.embeddedera.com and The_Real_Cow_Configurator → configurator.embeddedera.com; then Cloudflare Access (email OTP allow-list — Tools — Pages projects for EmbeddedEra/The_Real_Cow_Flasher → flasher.embeddedera.com and The_Real_Cow_Configurator → configurator.embeddedera.com; then Cloudflare Access (email OTP allow-list) for distributors; then turn off their GitHub Pages. [note:embeddedera-site]
- [ ] #44 Sales: Docs — add Starlight at /docs (ScrewFast pattern) once there is content: product docs, firmware loading guide (FIRMWARE_LOADING.md in the flasher repo is a start). — Docs — add Starlight at /docs (ScrewFast pattern) once there is content: product docs, firmware loading guide (FIRMWARE_LOADING.md in the flasher repo is a start). [note:embeddedera-site]
- [ ] #45 Sales: 3D — export a GLB of the Universal Tester main board with kicad-cli pcb export glb, Draco-compress, drop in public/models/. — 3D — export a GLB of the Universal Tester main board with kicad-cli pcb export glb, Draco-compress, drop in public/models/. [note:embeddedera-site]
- [ ] #46 Sales: Phase 2 — tesla.embeddedera.com custom domain on the tesla-key Pages project; set TESLA_DOMAIN accordingly before registering the Tesla app (or register with the pages.dev name now and re-regist — Phase 2 — tesla.embeddedera.com custom domain on the tesla-key Pages project; set TESLA_DOMAIN accordingly before registering the Tesla app (or register with the pages.dev name now and re-register later — Tesla allows re-registration). [note:embeddedera-site]
- [ ] #47 Sales: Phase 2 — store.embeddedera.com redirect rule → eBay store URL. — Phase 2 — store.embeddedera.com redirect rule → eBay store URL. [note:embeddedera-site]
- [ ] #48 Sales: Phase 3 — export WordPress.com (WXR + media); note the paid plan's renewal date. — Phase 3 — export WordPress.com (WXR + media); note the paid plan's renewal date. [note:embeddedera-site]
- [ ] #50 Sales: Phase 5 — own shop only if the eBay fee math says so; never a second inventory. — Phase 5 — own shop only if the eBay fee math says so; never a second inventory. [note:embeddedera-site]
- [ ] #60 Sales: [Blockers — the site is wrong without these] Delete the three placeholder-*.md. Currently draft: true so they don't build, but they still ship in the repo as obvious filler. — Delete the three placeholder-*.md. Currently draft: true so they don't build, but they still ship in the repo as obvious filler. [note:portfolio-site]
- [ ] #61 Sales: [Blockers — the site is wrong without these] Fix the TAGLINE / job-title mismatch. site.ts says "Embedded systems engineer"; actual title is electrical engineer at AFEX. Either is fine, but site, — Fix the TAGLINE / job-title mismatch. site.ts says "Embedded systems engineer"; actual title is electrical engineer at AFEX. Either is fine, but site, LinkedIn and résumé should agree. [note:portfolio-site]
- [ ] #62 Sales: [Blockers — the site is wrong without these] Name the degree. About says "studied engineering at UPR–Mayagüez" because the level and field were never established. LinkedIn blocks scraping — needs the — Name the degree. About says "studied engineering at UPR–Mayagüez" because the level and field were never established. LinkedIn blocks scraping — needs the answer. [note:portfolio-site]
- [ ] #63 Sales: [Numbers the case studies are missing] livestock-robot-controls — units shipped, field failures/RMAs since production. The "what I rejected and why" slot is deliberately empty; don't invent one. — livestock-robot-controls — units shipped, field failures/RMAs since production. The "what I rejected and why" slot is deliberately empty; don't invent one. [note:portfolio-site]
- [ ] #64 Sales: [Numbers the case studies are missing] universal-tester — defects caught that a bench check would have missed. Most persuasive number available and the logs don't identify it. — universal-tester — defects caught that a bench check would have missed. Most persuasive number available and the logs don't identify it. [note:portfolio-site]
- [ ] #65 Sales: [Numbers the case studies are missing] boost-gauge — measured ethanol accuracy vs a known mixture. — boost-gauge — measured ethanol accuracy vs a known mixture. [note:portfolio-site]
- [ ] #66 Sales: [Numbers the case studies are missing] cricket — confirm the ~4× piezo swing claim (doubler × antiphase PWM). — cricket — confirm the ~4× piezo swing claim (doubler × antiphase PWM). [note:portfolio-site]
- [ ] #67 Sales: [Part lifecycle checker — evaluate before building] KiCost — https://github.com/hildogjr/KiCost (fork: INTI-CMNB/KiCost, pip install kicost, MIT). Already reads a KiCad BOM and queries Digi-Key, Mou — KiCost — https://github.com/hildogjr/KiCost (fork: INTI-CMNB/KiCost, pip install kicost, MIT). Already reads a KiCad BOM and queries Digi-Key, Mouser, Arrow, Newark/Farnell, RS and TME. Built for pricing and stock, so the question is whether it already surfaces lifecycle/NRND or whether that's the gap worth filling. If it does, the project shrinks to a thin check over KiCost.
Now a sub-item of task 101: evaluate KiCost before writing more of our own — the watch should reuse it if it already does the job. [note:portfolio-site]
- [ ] #70 Sales: [Going live] Flip repo to public. — Flip repo to public. [note:portfolio-site]
- [ ] #71 Sales: [Going live] Settings → Pages → build from GitHub Actions. — Settings → Pages → build from GitHub Actions. [note:portfolio-site]
- [ ] #72 Sales: [Going live] Uncomment the two push: lines in .github/workflows/deploy.yml. — Uncomment the two push: lines in .github/workflows/deploy.yml. [note:portfolio-site]
- [ ] #73 Sales: [Going live] Delete publish.sh — obsolete and now dangerous. It does rm -rf .git (would destroy history) and creates a public repo. Replace with a README line. — Delete publish.sh — obsolete and now dangerous. It does rm -rf .git (would destroy history) and creates a public repo. Replace with a README line. [note:portfolio-site]
- [ ] #74 Sales: [Going live] Final sweep of dist/ for client name, product name, founder names, repo names, TODO. Strings to grep are in CLAUDE.local.md. — Final sweep of dist/ for client name, product name, founder names, repo names, TODO. Strings to grep are in CLAUDE.local.md. [note:portfolio-site]
- [ ] #75 Sales: [Going live] Re-run the byte-level EXIF/GPS check on public/media (script in CLAUDE.md). mdls does not count — it lies on overwritten paths. — Re-run the byte-level EXIF/GPS check on public/media (script in CLAUDE.md). mdls does not count — it lies on overwritten paths. [note:portfolio-site]
- [ ] #76 Sales: [Nice to have, not blocking] og:image — Base omits it when none is passed, so links shared to Slack, LinkedIn or iMessage render as a bare text card. — og:image — Base omits it when none is passed, so links shared to Slack, LinkedIn or iMessage render as a bare text card. [note:portfolio-site]
- [ ] #77 Sales: [Nice to have, not blocking] HTML résumé at /resume so it's readable without a download. — HTML résumé at /resume so it's readable without a download. [note:portfolio-site]
- [ ] #78 Sales: [Nice to have, not blocking] Cricket schematic: exported and reviewed, held back because the title block carries a CONFIDENTIALITY NOTICE (EmbeddedEra LLC). Re-export without the stamp, or skip — the — Cricket schematic: exported and reviewed, held back because the title block carries a CONFIDENTIALITY NOTICE (EmbeddedEra LLC). Re-export without the stamp, or skip — the 3D render carries more weight per pixel anyway. [note:portfolio-site]
- [ ] #107 Sales: Create the social accounts and app credentials —
Absorbed task 108 on 2026-09-14: duplicates task 107 (social accounts and app credentials).
Absorbed task 126 on 2026-09-14: duplicates task 107 — the LinkedIn page is the first item there.
Absorbed task 35 on 2026-09-14: duplicates task 107 — the LinkedIn page is the first item there.
Order, from the merged tasks: LinkedIn company page first (same one-paragraph description as the site and Business Profile), then the LinkedIn app credentials, then X and Instagram. [kanboard]
- [ ] #112 adiaz@embeddedera.com / Sales: Google Cloud, finish on the Mac (Angel, ~10 min): three projects got created by accident (embeddedera, "My First Project" = potent-thought-508315-a2, and the one behind the Maps key, project 3216237 — Google Cloud, finish on the Mac (Angel, ~10 min): three projects got created by accident (embeddedera, "My First Project" = potent-thought-508315-a2, and the one behind the Maps key, project 321623712484). Pick ONE (the one with the APIs enabled), and in it: (a) Credentials → API key claude-plex, "Don't restrict key" → send via set-creds --file ~/.config/google/env as GOOGLE_API_KEY=; (b) IAM → Service account claude-plex (no roles) → Keys → JSON → scp ~/Downloads/*.json angel@192.168.5.15:.config/google/claude-plex-sa.json; (c) make sure PageSpeed Insights, YouTube Data v3, Custom Search, Sheets, Drive, Search Console, Calendar, Gmail, Business Profile APIs are enabled there; (d) tell Claude the project name. Keys on file now: GOOGLE_API_KEY (project 255579551887, restricted — blocked), GOOGLE_MAPS_API_KEY (project 321623712484, Places = metered, card on file). Set a Google Cloud billing budget alert too.
Absorbed task 127 on 2026-09-14: duplicates task 112 (Google Cloud one-project cleanup). [note:embeddedera-site]
- [ ] #113 adiaz@embeddedera.com / Sales: Confirmation email to the person who submitted a form (Angel asked 2026-09-11): Web3Forms only does this on its paid plan. Free route that also fixes the numbering: a Cloudflare Pages Function (funct — Confirmation email to the person who submitted a form (Angel asked 2026-09-11): Web3Forms only does this on its paid plan. Free route that also fixes the numbering: a Cloudflare Pages Function (functions/api/submit.ts) that validates the captcha, assigns the next sequential ID from a D1 table, stores the record, emails Angel and sends the submitter a confirmation via Resend (free 3k/month, API key; needssend.embeddedera.comDNS records — token already has DNS edit). NeedsD1 Edit(and Workers KV/Functions) permission on theclaude-plextoken — Angel adds it when ready. Until then: on-screen confirmation only. [note:embeddedera-site]
- [ ] #115 **adiaz@embeddedera.com / Sales**: send the Spanish-review draft (Gmail Drafts, "¿Me ayudas a revisar el español…") to a native-speaker friend; apply the replies insrc/i18n/es.ts(checklist also indocs/spanish-review.md). — send the Spanish-review draft (Gmail Drafts, "¿Me ayudas a revisar el español…") to a native-speaker friend; apply the replies insrc/i18n/es.ts(checklist also indocs/spanish-review.md). [note:embeddedera-site]
- [ ] #116 **adiaz@embeddedera.com / Sales**: send the testimonial draft (Gmail Drafts, "Quick favor: one sentence…") to the robot client; fill in the name. — send the testimonial draft (Gmail Drafts, "Quick favor: one sentence…") to the robot client; fill in the name. [note:embeddedera-site]
- [ ] #117 **adiaz@embeddedera.com / Sales**: Engineering notes (one a month, Claude drafts from Angel's notes): topics on deck — replacing an EOL microcontroller; designing a pogo-pin test fixture; lead-free reflow profiles on a small line; brow — Engineering notes (one a month, Claude drafts from Angel's notes): topics on deck — replacing an EOL microcontroller; designing a pogo-pin test fixture; lead-free reflow profiles on a small line; browser-based device tools (Web Serial/WebUSB); membrane overlay design checklist. [note:embeddedera-site]
- [ ] #118 **adiaz@embeddedera.com / Sales**: Intake forms + instant quote (planned 2026-09-10): structured request forms on the site (one per request type: PCB design · SMT assembly · obsolete-part redesign · test fixture · general), each submis — Intake forms + instant quote (planned 2026-09-10): structured request forms on the site (one per request type: PCB design · SMT assembly · obsolete-part redesign · test fixture · general), each submission numbered and timestamped into a record (Cloudflare Pages Function → D1 table + email via Resend or Web3Forms, all API-key services), so every inquiry is a traceable record (ISO 9001 orientation: controlled intake, unique ID, response-time metric). Phase 2: a JLCPCB-style instant estimate for SMT assembly (inputs: board size, qty, unique parts, placements, BGA/QFN, lead time) — needs Angel's pricing model (setup fee, per-placement, per-unique-part, minimums, lead-time multipliers) before it can be built. [note:embeddedera-site]
- [ ] #119 **adiaz@embeddedera.com / Sales**: After cutover (Angel + Claude): Google Search Console — verify embeddedera.com (DNS TXT via the API), submit the sitemap; Google Business Profile for EmbeddedEra (Raleigh NC, "Electronics engineer / P — After cutover (Angel + Claude): Google Search Console — verify embeddedera.com (DNS TXT via the API), submit the sitemap; Google Business Profile for EmbeddedEra (Raleigh NC, "Electronics engineer / PCB design service"), Bing Webmaster (imports from Search Console). This is what makes local searches like "PCB design Raleigh" show the business. [note:embeddedera-site]
- [ ] #120 **adiaz@embeddedera.com / Sales**: a short list of the exact phrases you'd want to be found for (e.g. "obsolete part replacement", "STM32 firmware consultant", "PCB redesign NC") — Claude folds them into titles/descriptions and, later, — a short list of the exact phrases you'd want to be found for (e.g. "obsolete part replacement", "STM32 firmware consultant", "PCB redesign NC") — Claude folds them into titles/descriptions and, later, one focused page per phrase. [note:embeddedera-site]
- [ ] #121 **adiaz@embeddedera.com / Sales**: industries served so far (one line for About); a real client quote for a testimonial. — industries served so far (one line for About); a real client quote for a testimonial. [note:embeddedera-site]
- [ ] #122 **adiaz@embeddedera.com / Sales**: Standards (Angel, decided 2026-09-11 to research first): check what the shop actually meets before claiming anything — IPC-A-610 Class 2 acceptance criteria (assembly inspection), J-STD-001 (soldering — Standards (Angel, decided 2026-09-11 to research first): check what the shop actually meets before claiming anything — IPC-A-610 Class 2 acceptance criteria (assembly inspection), J-STD-001 (soldering process), ANSI/ESD S20.20 (ESD-controlled bench: grounded mat, wrist strap, bagged parts), RoHS already true. Draft line ready in Claude's 2026-09-10 message: "Assembled and inspected to IPC-A-610 Class 2 acceptance criteria, lead-free (RoHS), on an ESD-controlled bench. Quality system in development toward ISO 9001." Add only what is true. Pricing deliberately left off the site for now (revisit after the first inquiries). [note:embeddedera-site]
- [ ] #123 **adiaz@embeddedera.com / Sales**: Parked (Angel's call, 2026-09-10): everything "Real Cow" — the Products screen (src/_parked/home-products-section.astro.txtonapple-style), the Tools page (src/_parked/pages/tools.astroonmai — Parked (Angel's call, 2026-09-10): everything "Real Cow" — the Products screen (src/_parked/home-products-section.astro.txt on apple-style), the Tools page (src/_parked/pages/tools.astro on main), and the flasher/configurator subdomains + Access gate. Revisit when the product can be shown publicly. [note:embeddedera-site]
- [ ] #125 adiaz@embeddedera.com / Sales: Resend API key (free tier, 3,000/mo, 100/day) for Listmonk SMTP, plus the DNS records on embeddedera.com it needs (Claude can add those with the existing Cloudflare token once the key exists). Fallbac — Resend API key (free tier, 3,000/mo, 100/day) for Listmonk SMTP, plus the DNS records on embeddedera.com it needs (Claude can add those with the existing Cloudflare token once the key exists). Fallback: Workspace SMTP, fine under ~500 subscribers. Until this is done, Listmonk is built and receiving subscribers (via R2 + list-sync, every 15 min) but cannot send the double opt-in confirmation email — see Notes/projects/plex-server.md 2026-09-11. avoids that. [note:growth-plan]
- [ ] #133 adiaz@embeddedera.com / Sales: [Blockers — the site is wrong without these] Résumé PDF is missing. The Download button points at public/Angel-G-Diaz-Oquendo-Resume.pdf; that file does not exist, so /resume 404s on click. Use th — Résumé PDF is missing. The Download button points at public/Angel-G-Diaz-Oquendo-Resume.pdf; that file does not exist, so /resume 404s on click. Use that exact filename or change RESUME_PDF in src/site.ts. [note:portfolio-site]
- [ ] #173 adiaz@embeddedera.com / Sales: Make engagement type a required field on the quote — Every quote must state one of: custom development (customer owns the design on full payment) | our product under their brand (we own it, they buy units) | licensed design (we own it, they licence it). The IP clause in the terms keys off this field.\n\nWithout it, a product we funded and own could be signed away by a quote that simply did not mention ownership — the default has to be custom development, because that is least surprising to a customer, which is exactly why a silent quote is dangerous for the other two.\n\nTouches the InvenTree quote/proposal template and the website quote form. See ~/Notes/projects/terms-and-warranty.md, 'When the product is ours'. [kanboard]
- [ ] #174 yrosado@embeddedera.com / Sales: Review the terms of sale and warranty page — Read it as a customer would: https://embeddedera-site.pages.dev/terms/ (Spanish summary: https://embeddedera-site.pages.dev/es/terms/). Sign in with your Google account — it is the gated preview, not the public site yet.
The reasoning behind it, if you want it: https://notebook.embeddedera.com/projects/terms-and-warranty/
What to look for, from the side of the desk that talks to customers: - Is anything unclear or off-putting to a customer reading it cold? - The warranty is split by what was sold — a year on our own products, 90 days workmanship on a customer's design, 90 days to fix design work. Does that match what you would be comfortable promising on the phone? - Payment: net 30 for approved accounts, deposit for new customers and larger orders. Is that how we actually want to work? - Anything you know customers have argued about before that is missing.
Not to worry about: the legal wording in the boxed section — a lawyer reads that, not us.
Leave comments on this task, or edit the note directly. Nothing goes on the public site until Angel approves. [kanboard]
Recently closed¶
- #34 Accounting — scout done 2026-09-11 but it made only ONE web fetch, so treat its numbers as unverified (mileage rate, Section 179 cap, NC rate and the Jan due date all look like stale figures). Verifie — closed 2026-09-14 (no reason given)
- #127 finish the Google Cloud one-project cleanup (unblocks 2.1). — closed 2026-09-14 (no reason given)
- #35 LinkedIn company page for EmbeddedEra LLC (same one-paragraph description as the site/Business Profile). — closed 2026-09-14 (no reason given)
- #126 LinkedIn company page (unblocks 2.2 and is worth doing regardless). — closed 2026-09-14 (no reason given)
- #68 [Part lifecycle checker — evaluate before building] Nexar / Octopart — https://nexar.com and https://octopart.com. One GraphQL API returning lifecycle status across distributors instead of maintaining — closed 2026-09-14 (no reason given)
- #69 [Part lifecycle checker — evaluate before building] Decide the gap: if either already answers "is this part NRND", the case study becomes how I wired an existing tool into my library workflow, which — closed 2026-09-14 (no reason given)
- #108 platform app credentials when stage 4 is built (LinkedIn company page first). — closed 2026-09-14 (no reason given)
- #26 BOM lifecycle monitor: weekly EOL/NRND check of every MPN in InvenTree via
part-lookup, ntfy on hits, alternates recorded (Claude builds once the ERP has parts). — closed 2026-09-14 (no reason given) - #137 ✱ Insurance quotes: general liability + product liability + E&O (Hiscox / Next / Thimble-class carriers). Angel requests; Claude drafts the answers to the underwriting questions from the vault. — closed 2026-09-14 (no reason given)
- #38 AI discoverability, after cutover: (a) Cloudflare dashboard → Security → Bots → "AI Scrapers and Crawlers" / "Block AI bots" must be OFF or set to allow for embeddedera.com (the API token cannot read — closed 2026-09-14 (no reason given)
- #49 Phase 4 — static rebuild (Astro, same toolchain as the portfolio) on Cloudflare Pages; cutover = swap the two A records; cancel WordPress.com a week after. — closed 2026-09-14 (no reason given)
- #124 Phase 4 cutover — after Angel approves https://embeddedera-site.pages.dev: add custom domains
embeddedera.com+wwwto the Pages project (API), which replaces the two WordPress A records; verify; — closed 2026-09-14 (no reason given) - #9 [3. Production cutover] Publish a real privacy policy at https://embeddedera.com/privacy-policy/ (currently 404; a draft exists in WordPress Settings → Privacy). — closed 2026-09-14 (no reason given)
- #40 Contact form endpoint: create a free Web3Forms access key (web3forms.com, just an email) or a Formspree form, put it in
src/site.tsFORM_ENDPOINT. Until then the form submits via mailto. — closed 2026-09-14 (no reason given) - #41 Contact form: WordPress had a working form; v1 is mailto only. Set
FORM_ENDPOINTinsrc/site.ts(free tier of Formspree/Web3Forms, or a Cloudflare Worker) before or right after cutover. — closed 2026-09-14 (no reason given) - #114 Notes section built and on the dev preview (https://embeddedera-site.pages.dev/notes/) with the first article. Angel to read it, then say "push it live" to promote dev → main. Next article topics on d — closed 2026-09-14 (no reason given)
- #81 Decide stock ownership: InvenTree master, pushes to eBay — closed 2026-09-14 (no reason given)
- #99 Build an intake path for unstructured input — closed 2026-09-14 (no reason given)
- #157 Build expense capture on top of intake — closed 2026-09-14 (no reason given)
- #170 Resolve the robots.txt contradiction blocking AI crawlers — closed 2026-09-14 (no reason given)
- #154 Canaries fresh and passing — 1 failing [SOP-010.canary-stale-or-failing] — closed 2026-09-14 (no reason given)
- #161 Store money as integer cents, before there is data — closed 2026-09-14 (no reason given)
- #162 Gate /books and /intake on department, not just sign-in — closed 2026-09-14 (no reason given)
- #164 Put an Uptime Kuma monitor on the assistant /health — closed 2026-09-14 (no reason given)
- #165 Give Kanboard its own Resend key — closed 2026-09-14 (no reason given)
- #166 Rate-limit transcription and OCR — closed 2026-09-14 (no reason given)
- #167 Back up receipts and expenses hourly, not nightly — closed 2026-09-14 (no reason given)
- #168 Warn before the AI reading budget runs out — closed 2026-09-14 (no reason given)
- #93 Kanboard phase 2: home onto the assistant service — closed 2026-09-13 (no reason given)
- #94 Kanboard phase 3: SOP findings become tasks — closed 2026-09-13 (no reason given)
- #95 Notifications: Resend SMTP, defaults, overdue cron, morning digest — closed 2026-09-13 (no reason given)
- #97 Build the notebook site — closed 2026-09-13 (no reason given)
- #104 Write tests for the new surfaces — closed 2026-09-13 (no reason given)
- #106 Write the five missing part descriptions — closed 2026-09-13 (no reason given)
- #92 Kanboard phase 1: stand it up behind the gate — closed 2026-09-13 (no reason given)
- #105 Grant permission for the Kanboard stand-up, or run it yourself — closed 2026-09-13 (no reason given)
- #82 Approve the departments-to-functions split — closed 2026-09-13 (no reason given)
- #96 Write SOP-017 Task Register and amend SOP-009, 010, 015, 016 — closed 2026-09-13 (no reason given)
- #103 Give every new component a kill criterion — closed 2026-09-13 (no reason given)