Changelog
What's new on AaronShipsIt.com — the latest updates we've shipped.
Shipped — newest first
Social cards — generated OG images
Generated OpenGraph/Twitter cards: a site-wide brand lockup card plus a per-post title card, rendered at build time from the design tokens. No photos, no faces, readable at thumbnail size.
Analytics was originally bundled into this item and is deliberately out of it now: the site promises no tracking of any kind, and that promise stays true until a consent-gated approach earns its way in as its own separate decision.
Acceptance: og:image and twitter:card render for every page, a distinct card per post title, and the pages make zero third-party requests — none at all, not even ours.
Shipped
Domain, TLS, and the deploy rail
Point aaronshipsit.com at docker04 through the off-host nginx (Nginx Proxy Manager). Follow ops/nginx-handoff.conf; ports bind the host LAN address, not localhost (see the amended boundary in ps-integration AGENTS.md).
Acceptance: https://aaronshipsit.com serves the app with valid TLS; deploy.sh production runs clean end to end; health checks green.
Shipped
Persona brand system: Aaron Ships It
A visual identity DISTINCT from FeatureJet's — this is the maker persona, not the product. Define palette, type pairing, and a mark. Warm, personal, built-for-joy per docs/brand-ethos.md and docs/aaronshipsit-brand.md.
HARD RULE: the @aaronshipsit persona only. Never the real full identity, never LinkedIn.
Acceptance: tokens in code, a rendered style page, both light and dark.
Shipped
Home page: who I am and what I'm shipping
Above the fold: the persona bio (approved copy is in docs/aaronshipsit-brand.md), what I'm building right now, and links to the products. Warm teacher voice, no hype, lead with why.
Acceptance: responsive to 390px, keyboard-navigable, no invented claims or metrics.
Shipped
Blog engine: MDX, RSS, llms.txt
File-based MDX posts with frontmatter (title, date, slug, summary, tags). Generate an index, an RSS feed, and an llms.txt describing the site for AI engines.
Lesson from FeatureJet: llms.txt must never outlive its accuracy — add a test asserting it matches the real feature set.
Acceptance: a sample post renders, RSS validates, llms.txt served.
Shipped
Product pages — one per product, updated over time
A dedicated page per product (FeatureJet, VowAdvisor, and whatever follows), not just a card. Each carries: ship date, current status, description, and LEARNINGS — what worked, what did not, what I would do differently. These are living pages, updated as each product evolves; the learnings are the part readers actually come for.
Content model must make updating trivial (file-based per product, no CMS). Status should be able to come from real data later rather than being hand-typed — see item #92 (live numbers). Design so a product with no revenue and a product with revenue both look honest; never imply traction that does not exist.
Acceptance: adding a product or updating a status is a one-file edit; every page renders with an honest empty state for fields not yet filled; no fabricated metrics anywhere.
Shipped
SEO + AI visibility pass
Route-specific metadata, OG/Twitter cards, JSON-LD (Article for posts, Person/Organization for the persona), sitemap, robots. Reuse the patterns just shipped on FeatureJet.
Acceptance: every route has unique title/description/OG image; JSON-LD parses; no aggregateRating or invented review data.
Shipped
Publish the first three posts
Write and publish the first three posts from the content engine's idea bank (docs/featurejet-content-engine.md). Real story beats only — the honest engineering journey, the agent-workforce operating model, why flat pricing.
HARD RULE: zero fabricated metrics; every number is real or omitted. @aaronshipsit voice per the brand book.
Acceptance: three posts live with RSS entries, each passing the dignity test.
Shipped
Scaffold aaronshipsit.com via the app factory
Run create-product to generate the site repo so it inherits boatlift (auth, email, measurement, billing) and the platform deploy rail from day one. BLOCKED until the trusted-tool HOME fix lands (uv cannot init its cache under HOME=/dev/null).
Acceptance: repo generated, registers as a platform product, CI/gates green, nothing deployed yet.
Shipped