From e3101f7132fa571763708f91ded71e8fe4409a55 Mon Sep 17 00:00:00 2001 From: boojack <24653555+boojack@users.noreply.github.com> Date: Fri, 2 Oct 2026 03:18:24 +0000 Subject: [PATCH 1/3] chore: apply BRAND.md copy and remove duplicated brand guidelines BRAND.md in usememos/.github is now the single source of truth for brand copy. Delete docs/brand-guidelines.md, point references to BRAND.md, and update the tagline, descriptions, docs introduction, llms.txt summary and the homepage social image to the approved copy. --- AGENTS.md | 12 +- DESIGN_SYSTEM.md | 6 +- README.md | 2 +- content/docs/faq.mdx | 2 +- content/docs/getting-started.mdx | 2 +- content/docs/index.mdx | 4 +- docs/brand-guidelines.md | 133 ------------------ next-env.d.ts | 4 +- scripts/smoke-test.mjs | 2 +- src/app/(public)/(site)/brand/page.tsx | 2 +- src/app/(public)/(site)/page.test.tsx | 4 +- src/app/(public)/(site)/page.tsx | 7 +- src/app/(public)/(site)/sponsors/page.tsx | 3 +- src/app/layout.tsx | 3 +- src/app/og/home/image.png/route.tsx | 4 +- .../ai-discovery/lib/llms-content.test.ts | 2 +- src/features/ai-discovery/lib/llms-content.ts | 4 +- src/features/editorial/lib/social-preview.ts | 2 +- .../marketing/components/hero-accent.test.tsx | 8 +- .../marketing/components/home-own-section.tsx | 2 +- src/features/marketing/data/features/data.ts | 2 +- src/shared/lib/branding.test.ts | 24 +--- src/shared/lib/branding.ts | 18 ++- 23 files changed, 62 insertions(+), 190 deletions(-) delete mode 100644 docs/brand-guidelines.md diff --git a/AGENTS.md b/AGENTS.md index cc1fe0c8..31595c48 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -8,7 +8,7 @@ Treat it as a **Next.js 16 marketing/docs site plus an account app**. Current ac ## Branding Authority -Read `docs/brand-guidelines.md` before changing product messaging, taglines, default metadata, or social-preview copy. It is the authoritative messaging contract. Reuse `src/shared/lib/branding.ts` for approved brand strings. +Brand positioning and approved copy live in [`BRAND.md`](https://github.com/usememos/.github/blob/main/BRAND.md) in the `usememos/.github` repository; it is the single source of truth. Do not keep brand guidelines in this repository. Read it before changing product messaging, taglines, default metadata, or social-preview copy, and reuse `src/shared/lib/branding.ts`, which copies its strings verbatim. ## Public Website Design Authority @@ -170,3 +170,13 @@ Use `pnpm run preview` or `pnpm run deploy:dry-run` to validate Cloudflare produ - Set `NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY` before building the static account routes; deploy and upload check that it is present. There are no current `CLERK_SECRET_KEY` consumers or server-side Clerk handlers. Introduce server credentials and narrowly matched auth middleware together when a feature needs them. - Ordinary builds use committed API schemas. `pnpm docs:refresh` can fall back to a local snapshot after a failed download; inspect its log before claiming a snapshot is current. - Before adding persistence or a binding, document the feature's requirements and follow `docs/architecture.md` ("Future data layer"). D1, Drizzle, KV, and Clerk user-sync webhooks are not existing infrastructure or mandatory next steps. + + + +# This is NOT the Next.js you know + +This version has breaking changes — APIs, conventions, and file structure may all differ from your training data. Read the relevant guide in `node_modules/next/dist/docs/` (resolved from this file's directory; in monorepos the `next` package may not be visible from the repo root) before writing any code. Heed deprecation notices. + +This block is written and re-added by `next dev` — verify at `node_modules/next/dist/server/lib/generate-agent-files.js`. Removing it from a diff only re-creates the uncommitted change; committing it with your work keeps the tree clean. + + diff --git a/DESIGN_SYSTEM.md b/DESIGN_SYSTEM.md index 48bdaba5..695382e0 100644 --- a/DESIGN_SYSTEM.md +++ b/DESIGN_SYSTEM.md @@ -453,8 +453,8 @@ hover or supporting signal. Brand-filled controls MAY be used when the surrounding composition requires it, but blue MUST NOT become a default fill for every action and icon. -Use `HeroAccent` for display emphasis, including the Homepage's “Keep it yours.” -line. Its `text-brand-600 dark:text-brand-300` treatment is the standard brand +Use `HeroAccent` for display emphasis, including the second line of the +Homepage tagline. Its `text-brand-600 dark:text-brand-300` treatment is the standard brand accent, not a page-specific exception. Color rules: @@ -603,7 +603,7 @@ system. ## 16. Content and voice -`docs/brand-guidelines.md` defines the approved product tagline, supporting description, and messaging constraints. Use the shared constants in `src/shared/lib/branding.ts` for brand-level copy; page-specific headings and descriptions should describe their own subject. +[`BRAND.md`](https://github.com/usememos/.github/blob/main/BRAND.md) in `usememos/.github` defines the positioning and approved copy. Use the shared constants in `src/shared/lib/branding.ts` for brand-level copy; page-specific headings and descriptions should describe their own subject. Words are part of the composition. diff --git a/README.md b/README.md index d7a8c2a7..60f3d472 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,3 @@ website: [usememos.com](https://www.usememos.com) -Brand messaging: [brand guidelines](docs/brand-guidelines.md). Visual design: [DESIGN_SYSTEM.md](DESIGN_SYSTEM.md). +Brand messaging: [BRAND.md](https://github.com/usememos/.github/blob/main/BRAND.md). Visual design: [DESIGN_SYSTEM.md](DESIGN_SYSTEM.md). diff --git a/content/docs/faq.mdx b/content/docs/faq.mdx index efa83ce7..cedb3b51 100644 --- a/content/docs/faq.mdx +++ b/content/docs/faq.mdx @@ -5,7 +5,7 @@ description: Common questions about running and using Memos. ## What is Memos? -Memos is a personal timeline for quick notes: write short memos as they come, and find them later by search, tag, or date. You run it yourself, so your memos stay on the server you choose. +Memos is an open-source timeline for your thoughts. Write a memo in seconds, tag it, attach files, and move on. Every memo is private by default; share one with the people you choose, or with anyone who has the link, when you want to. Your notes are yours: you keep them where you decide, nobody else reads them, and you can take them with you at any time. ## Is Memos open source? diff --git a/content/docs/getting-started.mdx b/content/docs/getting-started.mdx index 9019e389..c54c29b1 100644 --- a/content/docs/getting-started.mdx +++ b/content/docs/getting-started.mdx @@ -3,7 +3,7 @@ title: Getting Started description: Run Memos locally with Docker, create the first admin user, and write your first memo. --- -Memos is a personal timeline for quick notes: write short memos as they come, and find them later by search, tag, or date. The shortest path to a running instance is one Docker command with SQLite and a local data volume. Harden deployment and storage once the instance is up. +The shortest path to a running instance is one Docker command with SQLite and a local data volume. Harden deployment and storage once the instance is up. ## Prerequisite diff --git a/content/docs/index.mdx b/content/docs/index.mdx index 684ae5c5..7a6efcf3 100644 --- a/content/docs/index.mdx +++ b/content/docs/index.mdx @@ -3,7 +3,9 @@ title: Documentation description: Official Memos documentation — self-host with Docker, configure storage and authentication, write and find memos in Markdown, and use the API. --- -Memos is a personal timeline for quick notes: write short memos as they come, and find them later by search, tag, or date. It is open source and self-hosted, so your memos stay on the server you choose. Start with Getting Started, then move into deployment, configuration, and daily use. +Memos is an open-source timeline for your thoughts. Write a memo in seconds, tag it, attach files, and move on. Every memo is private by default; share one with the people you choose, or with anyone who has the link, when you want to. Your notes are yours: you keep them where you decide, nobody else reads them, and you can take them with you at any time. + +Start with Getting Started, then move into deployment, configuration, and daily use. The usage and configuration guides cover **0.31.0**, the latest stable release. Read the [release changelog](/changelog/0-31-0) and [0.31 upgrade notes](/docs/operations/upgrade#upgrading-to-031) before upgrading. The API reference provides separate version selections. diff --git a/docs/brand-guidelines.md b/docs/brand-guidelines.md deleted file mode 100644 index 35e4d349..00000000 --- a/docs/brand-guidelines.md +++ /dev/null @@ -1,133 +0,0 @@ -# Memos Brand Guidelines - -**Status:** Authoritative and stable. This is the single source of truth for what Memos is and how we describe it. The core, tagline, and supporting description are fixed until the **2027-09 review**; see [Changing This Guide](#changing-this-guide). [DESIGN_SYSTEM.md](../DESIGN_SYSTEM.md) governs how the brand is applied visually on the public website. - -## Brand Core - -**Memos is a personal timeline for your thoughts.** You write short memos as they come. They build up in the order they happened, and you find them again when you need them. - -| | | -|---|---| -| **The memo** | One thought, written down. Short, untitled, and never filed before it is written. The product is named after it. | -| **The timeline** | Where memos live. Time is the natural order of what someone thinks, notices, and does. | -| **Belief** | Writing comes before organizing. Titles and folders ask for decisions too early. Write first; add structure later with tags, links, and views. | -| **Promise** | Save it now. Find it later. | -| **For** | Individuals who think in small pieces: ideas, links, logs, and updates. Personal use comes first; sharing with others is a second chapter, never the lead. | -| **Not** | An all-in-one workspace, a document editor, or a knowledge-management system. | -| **Character** | Quiet, direct, and honest. | - -Every message, feature description, and campaign must be explainable from this core. If a piece of copy cannot be traced back to it, rewrite the copy rather than stretching the core. - -## Message Hierarchy - -Tell the story in this order. Lead with the first; never lead with the third. - -| Order | Message | What to Show | -|---|---|---| -| 1 | **Write** — get a thought down before it is gone. | The composer and a real memo being saved | -| 2 | **Find** — get back to it by searching, filtering, or browsing through time. | Search, tags, views, and the timeline | -| 3 | **Own** — your memos stay where you choose. | Self-hosting, open code, and export | - -**Own is the trust foundation, not the identity.** Self-hosted and open source are facts that prove "Keep it yours"; they are not what Memos is. Use them in trust sections, comparisons, documentation, and search metadata. Do not open a hero, headline, or introduction with them. - -**Proof points.** The landing page promotes Own with these three points, shown as the homepage hero checklist from `BRAND_PROOF_POINTS`. Use them as supporting badges, checklists, or a trust section, never as the tagline or hero headline. Each is approved only with its condition. - -| Proof Point | Condition | Verified | -|---|---|---| -| **Private and free** | "Private": new memos default to private visibility. "Free": the software is open source with no license fee; hosting may still cost money. | Memos v0.31 | -| **Zero telemetry** | Scoped to the Memos software: it sends no usage data or analytics. It does not describe this website or third-party hosts. | Memos v0.31 | -| **Deploys in seconds** | Use it only on a page that links the install guide and shows the one-command Docker install; the homepage hero's install action and Deploy section satisfy this. It assumes Docker is already available. | Memos v0.31 | - -Re-verify each condition against the current Memos release before the annual review, or immediately if a release changes privacy defaults, adds outbound network calls, or changes installation. - -**Promise finding, not resurfacing.** Memos helps people find what they look for. Do not claim that it brings memos back on its own ("rediscover", "resurface", "daily review", "on this day") unless the product ships that behavior. - -## Approved Copy - -| Use | Copy | -|---|---| -| Tagline | **Catch a thought. Keep it yours.** | -| Supporting description | Write short memos without titles or folders. Find them later by search, tag, or date. | -| One-sentence introduction | Memos is a personal timeline for quick notes: write short memos as they come, and find them later by search, tag, or date. | -| Search descriptor | open-source, self-hosted note-taking app | - -- **Tagline:** use it exactly, in sentence case with both periods. A line break between the sentences is allowed. It appears on the homepage hero and the default social preview. The default branded title is `Memos - Catch a thought. Keep it yours.` -- **Supporting description:** pair it with the tagline, or use it wherever a short product introduction is needed. It names how Memos is different (no titles or folders) and what it promises (finding). The default social image uses only its first sentence, because the full line does not fit at sharing size; metadata keeps the full line. -- **One-sentence introduction:** use it for READMEs, directories, app listings, and community posts. Longer introductions may add verified details in message-hierarchy order. -- **Search descriptor:** use it only where a category term helps people find Memos: title tags, meta descriptions, comparison pages, and directory categories. It describes the category; it is not the brand line. -- Campaign headlines and page headings may differ but must not act as replacement taglines. Do not repeat the tagline in every heading. -- The tagline has no approved translation. Translating it requires a decision recorded in this guide. - -## Words - -**Naming** - -- **Memos** is the product. It takes a singular verb: "Memos is". Never "MEMOS" or "the Memos app". -- **memo** is the thing a person writes, in lowercase. Prefer "memo" when describing the product; "note" is fine in explanatory and search copy. -- **View** (视图) is a saved way of finding memos. If the product offers an action that saves a filter, call it "Save as view" (保存为视图); the result is still a View. Keep "Memos" untranslated in every language. - -**Prefer and avoid** - -| Prefer | Avoid | -|---|---| -| write, save, find, look back | rediscover, resurface, review (until shipped) | -| personal timeline, your memos | second brain, knowledge base, all-in-one workspace | -| quick, short, simple (shown, not asserted) | fastest, effortless, lightning-fast, seamless | -| "written in Markdown" | "Markdown-native", "stored as Markdown files" | -| "private" for memo visibility, or the proof point "Private and free" | privacy-first, end-to-end encrypted, unhackable | -| "free", "open source", "no license fee" | "free forever", "free hosting" | -| "zero telemetry" for the Memos software | "we never track you" (implies this website and every host) | - -## Voice - -| Trait | Write | Avoid | -|---|---|---| -| **Quiet** | Short, concrete sentences. One idea per section. | Hype, urgency, exclamation marks, feature lists in headlines | -| **Direct** | Start with what someone can do: write a memo, find a link, look back at a day. | Abstract introductions and jargon | -| **Honest** | State behavior precisely and the conditions behind it. | Superlatives, fear-based privacy copy, and guarantees | - -Say what Memos is. Keep what it is not as editorial guidance; do not turn it into repeated "not a…" headlines. - -| Instead of | Write | -|---|---| -| "The fastest self-hosted second brain." | "Write a memo in seconds. Find it next month." | -| "Privacy-first note-taking." | "Your memos stay on the server you choose." | -| "Rediscover forgotten ideas every day." | "Search, filter by tag, or look back through any day." | - -## Claims - -"Keep it yours" means control and ownership. Keep it separate from visibility, security, and availability. - -- **Hosting:** describe the control available to whoever runs an instance. Do not imply every user runs a server or that hosting guarantees access. -- **Privacy:** describe the actual visibility setting and who can see a memo. Self-hosting does not mean encryption or local-only use. -- **Markdown:** Markdown is the memo content format. Describe export and backup separately; do not imply memos are individual `.md` files. -- **Speed and setup:** show the workflow. Link setup claims to current instructions; "Deploys in seconds" follows its proof-point condition. No comparative speed claims without measurements. -- **Tracking and cost:** name the scope — the software, this website, or a hosted service — and verify it before publishing. "Zero telemetry" and "free" follow their proof-point conditions. -- **Evidence:** base product claims on current documentation or behavior. Research, testimonials, and adoption figures need a linked source and date. State positioning as a choice ("We lead with writing"), not as research ("Users value writing most"). GitHub stars show interest, not quality. - -## Identity Assets - -- **Logos:** `public/logo.png`, `logo-rounded.png`, `full-logo.png`, and `full-logo-landscape.png`, published at `/brand`. Keep their proportions and give them clear space. -- **Wordmark:** text-only "Memos" set in Fraunces Black. -- **Color:** the `brand-*` blue scale in `src/app/global.css`. -- **Social previews:** a cobalt sky with ivory clouds and bird silhouettes. - -DESIGN_SYSTEM.md defines how these are applied on the website. - -## Changing This Guide - -**Stability.** The Brand Core, message hierarchy, tagline, and supporting description stay fixed until the 2027-09 review. Before then, change them only to correct a factual error or because the product's memo-and-timeline model itself changed. Wording guidance, examples, and the word list may be refined at any time if they stay consistent with the core. - -**Process.** Change this file, `src/shared/lib/branding.ts`, and the tests that reference them in the same commit, then record the change below. When shipping rendered brand copy, check the homepage at desktop and mobile widths, the default social preview at sharing size, and metadata. - -**Scope.** This guide covers the website, documentation, the GitHub README and repository description, directory listings, and social profiles. Surfaces outside this repository are updated by hand. - -**Decision log** - -| Date | Decision | -|---|---| -| 2026-09-28 | Rebuilt the core around the memo and the personal timeline. Personal first; promise finding, not resurfacing. Self-hosting and open source become the trust foundation. New supporting description. The tagline is kept. | -| 2026-09-28 | Approved "Private and free", "Zero telemetry", and "Deploys in seconds" as landing-page proof points for Own, each with a verified condition. | -| 2026-09-28 | Owner-approved exception to the stability rule during the landing-page redesign: the supporting description now states the belief and the promise instead of listing note types. | - -Retired taglines: `Capture first. Keep it yours.`, `Fast enough for every thought. Private enough for all of them.`, and `An open-source, self-hosted notebook.` Preserve them in historical quotations and published release notes only. diff --git a/next-env.d.ts b/next-env.d.ts index ce4e94a6..a419cbe4 100644 --- a/next-env.d.ts +++ b/next-env.d.ts @@ -1,7 +1,7 @@ /// /// -import "./.next/types/routes.d.ts"; -import "./.next/types/root-params.d.ts"; +import "./.next/dev/types/routes.d.ts"; +import "./.next/dev/types/root-params.d.ts"; // NOTE: This file should not be edited // see https://nextjs.org/docs/app/api-reference/config/typescript for more information. diff --git a/scripts/smoke-test.mjs b/scripts/smoke-test.mjs index 5ecb6b0d..43b793fd 100644 --- a/scripts/smoke-test.mjs +++ b/scripts/smoke-test.mjs @@ -1,7 +1,7 @@ const baseUrl = process.env.SMOKE_BASE_URL ?? "http://localhost:8788"; const checks = [ - { path: "/", type: "html", contains: "Catch a thought.", cacheControlIncludes: "s-maxage=31536000" }, + { path: "/", type: "html", contains: "Your thoughts, your data,", cacheControlIncludes: "s-maxage=31536000" }, { path: "/docs/faq", type: "html", diff --git a/src/app/(public)/(site)/brand/page.tsx b/src/app/(public)/(site)/brand/page.tsx index 08ff9484..b2bd8422 100644 --- a/src/app/(public)/(site)/brand/page.tsx +++ b/src/app/(public)/(site)/brand/page.tsx @@ -7,7 +7,7 @@ import { buildBreadcrumbJsonLd, buildMarketingMetadata } from "@/shared/lib/seo" export const metadata: Metadata = buildMarketingMetadata({ title: "Brand", - description: "Official brand assets, logos, and usage guidelines for Memos, a personal timeline for quick notes.", + description: "Official brand assets, logos, and usage guidelines for Memos.", path: "/brand", }); diff --git a/src/app/(public)/(site)/page.test.tsx b/src/app/(public)/(site)/page.test.tsx index a626ce68..280b2489 100644 --- a/src/app/(public)/(site)/page.test.tsx +++ b/src/app/(public)/(site)/page.test.tsx @@ -1,7 +1,7 @@ import { render, screen } from "@testing-library/react"; import type { ReactNode } from "react"; import { describe, expect, it, vi } from "vitest"; -import { BRAND_DESCRIPTION, BRAND_TAGLINE } from "@/shared/lib/branding"; +import { BRAND_SHORT, BRAND_TAGLINE } from "@/shared/lib/branding"; vi.mock("@/features/marketing/components/hero-section", () => ({ HeroSection: ({ title, subtitle }: { title: ReactNode; subtitle: string }) => ( @@ -36,7 +36,7 @@ describe("HomePage", () => { expect(screen.getAllByRole("heading", { level: 1 })).toHaveLength(1); expect(screen.getByRole("heading", { level: 1, name: BRAND_TAGLINE })).toBeVisible(); - expect(screen.getByText(BRAND_DESCRIPTION)).toBeVisible(); + expect(screen.getByText(BRAND_SHORT)).toBeVisible(); }); it("tells the story in brand order: write, find, own, then answers", () => { diff --git a/src/app/(public)/(site)/page.tsx b/src/app/(public)/(site)/page.tsx index b5b2fc2d..31f1f4dc 100644 --- a/src/app/(public)/(site)/page.tsx +++ b/src/app/(public)/(site)/page.tsx @@ -6,15 +6,14 @@ import { HomeFindSection } from "@/features/marketing/components/home-find-secti import { HomeOwnSection } from "@/features/marketing/components/home-own-section"; import { HomeWriteSection } from "@/features/marketing/components/home-write-section"; import { StartSection } from "@/features/marketing/components/start-section"; -import { BRAND_DESCRIPTION, BRAND_TAGLINE_LINES, BRAND_TITLE } from "@/shared/lib/branding"; +import { BRAND_DESCRIPTION, BRAND_SHORT, BRAND_TAGLINE_LINES, BRAND_TITLE } from "@/shared/lib/branding"; import { buildDefaultOpenGraphImages, DEFAULT_OG_IMAGE } from "@/shared/lib/seo"; export const metadata: Metadata = { title: { absolute: "Memos - Open-Source, Self-Hosted Note-Taking App", }, - description: - "Write short memos without titles or folders in Memos, an open-source, self-hosted note-taking app. Find them later by search, tag, or date.", + description: BRAND_DESCRIPTION, keywords: [ "note-taking app", "open source note taking app", @@ -61,7 +60,7 @@ export default function HomePage() { } - subtitle={BRAND_DESCRIPTION} + subtitle={BRAND_SHORT} primaryCta={{ text: "Install Memos", href: "/docs/getting-started" }} secondaryCta={{ text: "Try Live Demo", href: "https://demo.usememos.com/", external: true }} /> diff --git a/src/app/(public)/(site)/sponsors/page.tsx b/src/app/(public)/(site)/sponsors/page.tsx index c745cc09..65a7e2a9 100644 --- a/src/app/(public)/(site)/sponsors/page.tsx +++ b/src/app/(public)/(site)/sponsors/page.tsx @@ -8,8 +8,7 @@ import { cn } from "@/shared/lib/utils"; export const metadata: Metadata = buildMarketingMetadata({ title: "Sponsors", - description: - "Thank you to the sponsors and backers who support the development of Memos, the open-source personal timeline for quick notes.", + description: "Thank you to the sponsors and backers who support the development of Memos.", path: "/sponsors", }); diff --git a/src/app/layout.tsx b/src/app/layout.tsx index 83fd8406..a94577f8 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -90,8 +90,7 @@ export default function Layout({ children }: { children: ReactNode }) { "@context": "https://schema.org", "@type": "SoftwareApplication", name: "Memos", - description: - "A personal timeline for quick notes: write short memos as they come, and find them later by search, tag, or date. Open source and self-hosted.", + description: BRAND_DESCRIPTION, applicationCategory: "ProductivityApplication", operatingSystem: "Cross-platform", offers: { diff --git a/src/app/og/home/image.png/route.tsx b/src/app/og/home/image.png/route.tsx index c4c9275a..f6c283ff 100644 --- a/src/app/og/home/image.png/route.tsx +++ b/src/app/og/home/image.png/route.tsx @@ -1,5 +1,5 @@ import { createSocialPreviewImage } from "@/shared/content/social-preview-image"; -import { BRAND_SOCIAL_DESCRIPTION, BRAND_TAGLINE_LINES } from "@/shared/lib/branding"; +import { BRAND_SOCIAL_DESCRIPTION, BRAND_TAGLINE } from "@/shared/lib/branding"; export const runtime = "nodejs"; export const dynamic = "force-static"; @@ -7,7 +7,7 @@ export const revalidate = false; export async function GET() { const response = await createSocialPreviewImage({ - title: BRAND_TAGLINE_LINES.join("\n"), + title: BRAND_TAGLINE, description: BRAND_SOCIAL_DESCRIPTION, }); response.headers.set("Cache-Control", "public,max-age=86400,stale-while-revalidate=604800"); diff --git a/src/features/ai-discovery/lib/llms-content.test.ts b/src/features/ai-discovery/lib/llms-content.test.ts index fb72bda8..bb11707a 100644 --- a/src/features/ai-discovery/lib/llms-content.test.ts +++ b/src/features/ai-discovery/lib/llms-content.test.ts @@ -15,7 +15,7 @@ describe("buildLlmsIndex", () => { it("starts with the site heading and summary", () => { expect(output.startsWith("# Memos\n")).toBe(true); - expect(output).toContain("> Memos is a personal timeline for quick notes"); + expect(output).toContain("> Memos is an open-source timeline for your thoughts"); }); it("includes every section heading", () => { diff --git a/src/features/ai-discovery/lib/llms-content.ts b/src/features/ai-discovery/lib/llms-content.ts index a793703d..5e54f6be 100644 --- a/src/features/ai-discovery/lib/llms-content.ts +++ b/src/features/ai-discovery/lib/llms-content.ts @@ -1,6 +1,7 @@ import { COMPARISONS, getAllComparisonSlugs } from "@/features/marketing/data/comparisons"; import { FEATURES, getAllFeatureSlugs } from "@/features/marketing/data/features"; import { getAllUseCaseSlugs, USE_CASES } from "@/features/marketing/data/use-cases"; +import { BRAND_STANDARD } from "@/shared/lib/branding"; import { absoluteUrl, SITE_NAME } from "@/shared/lib/seo"; /** @@ -9,8 +10,7 @@ import { absoluteUrl, SITE_NAME } from "@/shared/lib/seo"; * module takes plain data so it stays trivially testable. */ -export const LLMS_SUMMARY = - "Memos is a personal timeline for quick notes: write short memos as they come, and find them later by search, tag, or date. It is an open-source (MIT), self-hosted note-taking app that runs with Docker. Private and free: new memos are private by default, and the software has no license fee. The Memos software sends no telemetry."; +export const LLMS_SUMMARY = `${BRAND_STANDARD} It is MIT-licensed, runs with Docker, and the Memos software sends no telemetry.`; export interface PageMeta { url: string; diff --git a/src/features/editorial/lib/social-preview.ts b/src/features/editorial/lib/social-preview.ts index 2fdc878f..a69a92c2 100644 --- a/src/features/editorial/lib/social-preview.ts +++ b/src/features/editorial/lib/social-preview.ts @@ -22,7 +22,7 @@ export function getBlogIndexSocialPreview(): ContentSocialPreview { return { title, - description: "Product notes, guides, and project updates from the team building Memos, a personal timeline for quick notes.", + description: "Product notes, guides, and project updates from the team building Memos.", imageDescription: "Ideas, updates, and stories\nfrom the Memos team.", url: absoluteUrl("/blog"), imageUrl: buildGeneratedImageUrl(blogImagePath()), diff --git a/src/features/marketing/components/hero-accent.test.tsx b/src/features/marketing/components/hero-accent.test.tsx index 956c94dc..fcec85ea 100644 --- a/src/features/marketing/components/hero-accent.test.tsx +++ b/src/features/marketing/components/hero-accent.test.tsx @@ -4,12 +4,12 @@ import { HeroAccent } from "./hero-accent"; describe("HeroAccent", () => { it("renders its children", () => { - render(Keep it yours.); - expect(screen.getByText("Keep it yours.")).toBeInTheDocument(); + render(shared on your terms.); + expect(screen.getByText("shared on your terms.")).toBeInTheDocument(); }); it("applies the brand accent classes for light and dark mode", () => { - render(Keep it yours.); - expect(screen.getByText("Keep it yours.")).toHaveClass("text-brand-600", "dark:text-brand-300"); + render(shared on your terms.); + expect(screen.getByText("shared on your terms.")).toHaveClass("text-brand-600", "dark:text-brand-300"); }); }); diff --git a/src/features/marketing/components/home-own-section.tsx b/src/features/marketing/components/home-own-section.tsx index 9049a277..a750e32b 100644 --- a/src/features/marketing/components/home-own-section.tsx +++ b/src/features/marketing/components/home-own-section.tsx @@ -8,7 +8,7 @@ import { BRAND_PROOF_POINTS } from "@/shared/lib/branding"; type ProofPoint = (typeof BRAND_PROOF_POINTS)[number]; -/** The condition behind each approved proof point, from docs/brand-guidelines.md. */ +/** The condition behind each proof point. */ const PROOF_DETAILS: Record = { "Private and free": { icon: