growth-plan¶
Superseded (2026-09-13): invoice and proposal templates now live inside InvenTree — see mrp.
render-docis the fallback for documents with no ERP record behind them, not the primary path.
Execution plan for the eight gaps found 2026-09-11. Ordered by value per hour, with what blocks each. Site: embeddedera-site · pipeline: content-pipeline · business: embeddedera-business
Rule for all of it: free and self-hosted first, API-key services second, subscriptions last. Nothing sends or posts without Angel's one tap until a piece has proven itself.
Phase 1 — this week, no one else needed (Claude)¶
Status 2026-09-11: 1.1 done (content-sync 02:40 → /mnt/storage/EmbeddedEra/content, in parity + restic).
1.2 built and proven end to end: subscribe on the live dev preview → Cloudflare R2 → list-sync
(*/15) → Listmonk list "Engineering notes" (id 3, double opt-in), subscriber lands unconfirmed.
Listmonk + listmonk-db in the torrentvpn stack, loopback + list.lan only, creds in
~/.config/credentials/listmonk.txt. Listmonk's demo lists/subscribers deleted. Sending is live: Resend (free tier, 3,000/month), domain embeddedera.com verified, DKIM + SPF +
the send subdomain added to Cloudflare by API. Listmonk sends through smtp.resend.com:465 as
hello@embeddedera.com; the SMTP block lives in Listmonk's settings table (the list-sync API
user lacks settings:manage, so it was written with psql and Listmonk restarted). Proven: subscribe
on the live site → R2 → import → Listmonk sent "Confirm subscription" → Resend logged it delivered.
The ONLY remaining blocker for a real send is the postal address for the footer (CAN-SPAM).
1.1 Backup the content folder — DONE 2026-09-11¶
~/embeddedera-content (posts, cards, PDFs) is outside every backup. Add it to the nightly
rsync into /mnt/storage/ so SnapRAID + restic cover it.
1.2 Email list — WORKING END TO END 2026-09-11¶
- Listmonk (self-hosted, free, open source, REST API, Postgres) in the torrentvpn stack,
behind NPM as
list.embeddedera.com, admin on the LAN only. - Sending: Resend free tier (3,000/month, 100/day, API key) over SMTP from Listmonk. Needs DNS records on embeddedera.com — Claude can add them with the existing Cloudflare token. Fallback if Resend is refused: Workspace SMTP, fine under ~500 subscribers.
- Capture: a quiet subscribe block at the end of every note and on
/notes, plus a line on the contact and quote confirmations. Form posts to a Pages Function → Listmonk API. Double opt-in, one-click unsubscribe, no pre-ticked boxes (CAN-SPAM + a real postal address in the footer — use the business address once Angel confirms which to publish). - Send: each approved note becomes a short plain-text-feeling issue: the hook, three sentences, a link. Not the whole article.
- Angel taps once to send, same as publishing.
1.3 Diagrams in notes¶
Extend tools/cards/ with diagram templates (HTML/CSS/SVG, same headless Chromium): decision
tree, process strip, before/after, comparison table. Notes reference them as images; they also
become carousel cards. Every note from now on gets at least one.
1.4 More card templates¶
Quote card · spec card (the 0402 / ±0.02 mm figures) · myth-vs-fact · "we made this" photo card
(ready for the 2026-09-19 shoot). All in carousel.html's sibling files, selected by type.
1.5 Quote follow-up¶
Extend quote-drafts: if a [EE- thread has no reply from the client after 3 days, draft a
short nudge; after 10 days, a final one. Drafts only, labelled, never sent automatically.
1.6 Proposal + invoice templates — DONE 2026-09-11¶
BUILT: tools/docs/document.html (one template, proposal or invoice, US Letter, light print theme,
copper accent, dark-on-light logo), render-doc <data.json> <out.pdf> [--png] → a real PDF with
selectable text via Playwright's print engine. Numbering from a 0600 ledger
(~/.config/embeddedera/doc-numbers.json, helper doc-number proposal|invoice → EE-P-2026-001).
new-proposal <request-id> writes a TODO-filled skeleton into ~/embeddedera-content/docs/.
Examples: ~/embeddedera-content/docs/EXAMPLE-{proposal,invoice}.pdf.
Defaults that matter: client owns the design files; out-of-scope work is quoted before it starts;
50/50 payment on proposals, net 15 on invoices; the only lead-time wording is the published one.
Blocked detail: {{ADDRESS}} is a visible placeholder until the mailing address is decided.
Gotcha found: Chromium's print engine ignores CSS counter(page), so page numbers come from
Playwright's header/footer templates instead. Proposal: scope, assumptions, deliverables, milestones,
terms, validity. Invoice: numbered, line items, terms, remit-to. Fed from the quote request's
fields so a proposal starts 80% written. Numbering from a small JSON ledger.
Phase 2 — needs one thing from Angel each¶
2.1 Feedback loop (blocked: GCP service account)¶
Search Console API → weekly pull of queries, impressions, position → written into the vault and
used by weekly-research to pick topics that people search but we have not answered.
Angel: finish the one-project cleanup and drop the service-account JSON on the box.
2.2 Posting automation (blocked: accounts)¶
Order: LinkedIn company page first (highest value, and everything else can wait). Then a LinkedIn app for company-page posting; X and Instagram after. Self-hosted Postiz only if direct API calls prove annoying. Angel: create the LinkedIn company page, then the developer app.
2.3 Evergreen rotation¶
Once posting works: a rotation that re-posts an older note when no new one is due, picking the one with the best search performance and the longest gap since last posted.
Sequencing¶
Week of 2026-09-15: 1.1, 1.2 (list live, capture on the site, first issue drafted), 1.3. Week of 2026-09-22: 1.4 + photos from the shoot, 1.5, 1.6. Then 2.1 and 2.2 as Angel unblocks them; 2.3 last.
Parked¶
- Business mailing address (2026-09-11, Angel's call): parked. Needed for the CAN-SPAM footer before the FIRST newsletter send — not before capture, which is already live and has no subscribers yet. Research 2026-09-11: Anytime Mailbox ~$5–10/mo real street address (their own site says do not use it as the official business address on filings); iPostal1 similar; Harbor Compliance $99 first year for a registered-agent address usable on filings; USPS PO box ~$40 per six months, legal for the footer, but the key needs an in-person pickup with two IDs. The deciding question none of the vendors would answer to an automated fetch: do they notarize USPS Form 1583 online? Ask that first. Separately: NC publishes the LLC's registered address, so Angel's home address may already be public — a registered agent fixes both at once.
Open¶
See ~/Notes/tasks.md — this section is now generated from the task register.