Skip to content

growth-plan

Superseded (2026-09-13): invoice and proposal templates now live inside InvenTree — see mrp. render-doc is 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|invoiceEE-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.