diff --git a/AGENTS.md b/AGENTS.md index b9751010..7853bb1e 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -107,7 +107,7 @@ export default UseCasesPage - Primary “Download Tiles” actions on the homepage and download flows should use the shared `DownloadTilesCta` component and `themeAwareHeaderPrimaryCtaClasses` from `lib/header-primary-cta-classes.ts` so they match the theme-aware top navigation pills and do not drift; dark-mode hover/active shadows on those CTAs should read as a thin lifted bucket, not a thick horizontal base or tray under the icon. The compact platform subtext under those CTAs on the homepage hero and footer should use `DownloadPlatformSubtext` with `DOWNLOAD_PLATFORM_SUBTEXT` from `lib/product-description.ts` (`Alpha • macOS 14+ • Apple Silicon (M1+) • Linux support`), with `DOWNLOAD_PLATFORM_LINUX_LABEL` set to “Linux (NVIDIA)”; keep its typography and platform icons slightly larger at every hero/footer/download placement; on `/download`, keep the “Send installer links to email” section above macOS on mobile clients, use intro copy “Public alpha for macOS and Linux. 16 GB of unified memory or VRAM recommended.”, and render macOS/Linux platform requirement labels without a trailing period after the label text (the Linux section label is “NVIDIA” only, while hero/footer subtext keeps “Linux (NVIDIA)”; keep `components/download-content.tsx`, `lib/download-link-email.ts`, and `emails/download-link-template.html` aligned). - Product harness and homepage marketing copy should describe Tiles as for “knowledge work” without appending “and coding” on the homepage, overview page, and book marketing sections (keep surrounding sentences smooth). Lead with concrete user outcomes rather than product-category positioning. On the minimal homepage in `components/home-content.tsx`, keep section order Why Tiles → What’s inside → Use cases and keep those three section headings and bodies on the same typography scale so the page reads as one coherent stack; Why Tiles should stay a short heading-plus-paragraph that covers local models, P2P encrypted sync, AT Protocol social/share features, and user-owned keys for digital life with linked DIDs and UCANs so data and identity remain yours; Use cases lists Individuals, Coworking spaces, and Researchers with one persona title plus icon each (not dual headings), action-led job-to-be-done bodies that omit Atmosphere/AT Protocol and avoid leading with “Use Tiles”, Individuals framed around sensitive personal work (plan finances, health notes, private journal), and Researchers around literature review, dataset analysis, and AI agents in preconfigured resumable sandboxes with research tools already installed; What’s inside uses that heading only (no section intro lede). In What’s inside / identity feature copy, prefer locally generated DIDs and UCANs for zero-trust auth. When the older homepage “Why Tiles” bullet grid is shown (`lib/why-tiles-content.ts` / `components/why-tiles-section.tsx`), keep it homepage-only (not duplicated on `/book/overview`), include a **Learn more on overview page →** CTA to `/book/overview`, and keep a remote-models bullet (“Use models on remote machines as if they were local.”) immediately before Offline Installer, always shown regardless of `SHOW_REMOTE_LINK`. On the book overview feature grid in `components/product-feature-widgets.tsx`, keep identity copy on “User-owned identity with Decentralized Identifiers (DIDs) and User Controlled Authorization Networks (UCANs) for authorization”, link those full spelled-out terms to https://www.w3.org/TR/did-1.1/ and https://ucan.xyz, and omit DID/UCAN mentions from the P2P sync blurb. Do not add a `/linux` waitlist page or separate Linux waitlist CTAs; mention Linux support in `DOWNLOAD_PLATFORM_SUBTEXT` and download-page intro copy instead. - On homepage feature cards, keep the CTA link (for example “Run models →”) directly under the inline CLI command box (`tiles run `), not only beneath the terminal window column, on every breakpoint. On mobile, keep the MacBook wireframe hero asset above the icon-only feature grid. Remote Link marketing is gated by `SHOW_REMOTE_LINK` in `lib/feature-flags.ts`; when false, hide Remote Link from the homepage feature grid and book overview comparison table without deleting the underlying code, and when true keep Remote Link before Shared Links with Developer SDK last in the homepage icon-only feature grid (`components/product-feature-widgets.tsx` variant `home`). In public marketing UI (homepage feature grid, book overview comparison table, and `/book/overview` feature widgets), label the SDK feature **Developer SDK**, not Tilekit SDK, while linking to `/book/tilekit`. In the hero, keep increased spacing (`gap-7 sm:gap-8`) between the feature grid and the Built with/TechAttribution line. Separate major homepage sections with spacing rather than horizontal line separators. For the lower homepage “Designed for Atmosphere” band in `components/home-content.tsx`, keep the section heading and three check bullets as the primary stack, then place longer AT Protocol or Atmosphere explainer copy below as supplemental prose with smaller or more muted typography, not as a bordered card or callout panel; external links in that supplemental prose should use the same outgoing arrow icon pattern as the footer Status link. -- On `/blog`, keep the Standard.site lexicon and Eurosky PDS footer note after the post list and above the site footer, not under the page heading. Blog posts may set `draft: true` in `lib/blog-posts.ts` so they stay in the codebase but only appear via `isBlogPostVisible` / `isBlogDraftEnvironment` in development (not production); keep the `own-your-ai` talk titled around Local-First Conf when referenced, and keep `/blog/own-your-ai` permanently dark (`#020202`, hide theme switcher) via `lib/own-your-ai-theme.ts`. Blog post pages should not render the hero cover image when `coverImage` in `lib/blog-posts.ts` is only for Open Graph and the listing carousel; omit those props from `BlogPostContent`. Inline article diagrams should show the full asset without cropping, and use theme-aware light/dark image pairs when both variants exist. Blog posts should use the same Copy page control pattern as `/book` pages. Browser print/PDF output for blog articles should live in `@media print` only (no on-screen UI changes): theme-aware logo plus wordmark masthead sized larger than the title (matching top-nav pairing, not the banner asset), author avatar with author/date/reading-time metadata, syntax-highlighted code, article body and copyright only, long code blocks allowed to break across pages with rounded corners only on the first and last segment when they split, and a print icon in the share/actions row. On `/research` and `/research/[slug]`, mirror `/blog` patterns: Active and Archived project carousels pixel-for-pixel with the blog listing carousel; exploration pages use the same article body typography and MDX treatment as blog posts; enable the footer download CTA; use the same newsletter CTA, share component, and post-newsletter border separator on the listing as on `/blog` while keeping the hero newsletter CTA; omit line separators between individual project entries but keep the separator above Archived Projects; article footers use the short product blurb from `TILES_PRODUCT_DESCRIPTION_SHORT` in `lib/product-description.ts` (same as blog posts). +- On `/blog`, keep the Standard.site lexicon and Eurosky PDS footer note after the post list and above the site footer, not under the page heading. Blog posts may set `draft: true` in `lib/blog-posts.ts` so they stay in the codebase but only appear via `isBlogPostVisible` / `isBlogDraftEnvironment` in development (not production); keep the `own-your-ai` talk titled around Local-First Conf when referenced, and keep `/blog/own-your-ai` permanently cyberpunk (black canvas, yellow `#f7ff61` accents, hide theme switcher) via `lib/own-your-ai-theme.ts`. Blog post pages should not render the hero cover image when `coverImage` in `lib/blog-posts.ts` is only for Open Graph and the listing carousel; omit those props from `BlogPostContent`. Inline article diagrams should show the full asset without cropping, and use theme-aware light/dark image pairs when both variants exist. Blog posts should use the same Copy page control pattern as `/book` pages. Browser print/PDF output for blog articles should live in `@media print` only (no on-screen UI changes): theme-aware logo plus wordmark masthead sized larger than the title (matching top-nav pairing, not the banner asset), author avatar with author/date/reading-time metadata, syntax-highlighted code, article body and copyright only, long code blocks allowed to break across pages with rounded corners only on the first and last segment when they split, and a print icon in the share/actions row. On `/research` and `/research/[slug]`, mirror `/blog` patterns: Active and Archived project carousels pixel-for-pixel with the blog listing carousel; exploration pages use the same article body typography and MDX treatment as blog posts; enable the footer download CTA; use the same newsletter CTA, share component, and post-newsletter border separator on the listing as on `/blog` while keeping the hero newsletter CTA; omit line separators between individual project entries but keep the separator above Archived Projects; article footers use the short product blurb from `TILES_PRODUCT_DESCRIPTION_SHORT` in `lib/product-description.ts` (same as blog posts). ## Learned Workspace Facts diff --git a/app/blog/own-your-ai/layout.tsx b/app/blog/own-your-ai/layout.tsx index 92321ebe..892a0a5b 100644 --- a/app/blog/own-your-ai/layout.tsx +++ b/app/blog/own-your-ai/layout.tsx @@ -3,6 +3,7 @@ import { notFound } from "next/navigation" import { StandardSiteLinkTags } from "@/components/standard-site-link-tags" import { getBlogPostBySlug, isBlogPostVisible } from "@/lib/blog-posts" import { OWN_YOUR_AI_PAGE_THEME } from "@/lib/own-your-ai-theme" +import { CYBERPUNK_THEME } from "@/lib/site-theme" import { getBlogPostSocialImageUrl } from "@/lib/standard-site" const post = getBlogPostBySlug("own-your-ai") @@ -58,7 +59,7 @@ export default function OwnYourAiLayout({ <>