Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
6 changes: 3 additions & 3 deletions DESIGN_SYSTEM.md
Original file line number Diff line number Diff line change
Expand Up @@ -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:
Expand Down Expand Up @@ -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.

Expand Down
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
<samp>website: [usememos.com](https://www.usememos.com)</samp>

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).
2 changes: 1 addition & 1 deletion content/docs/faq.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -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?

Expand Down
2 changes: 1 addition & 1 deletion content/docs/getting-started.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
4 changes: 3 additions & 1 deletion content/docs/index.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand Down
133 changes: 0 additions & 133 deletions docs/brand-guidelines.md

This file was deleted.

2 changes: 1 addition & 1 deletion scripts/smoke-test.mjs
Original file line number Diff line number Diff line change
@@ -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",
Expand Down
2 changes: 1 addition & 1 deletion src/app/(public)/(site)/brand/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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",
});

Expand Down
4 changes: 2 additions & 2 deletions src/app/(public)/(site)/page.test.tsx
Original file line number Diff line number Diff line change
@@ -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 }) => (
Expand Down Expand Up @@ -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", () => {
Expand Down
7 changes: 3 additions & 4 deletions src/app/(public)/(site)/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down Expand Up @@ -61,7 +60,7 @@ export default function HomePage() {
</span>
</>
}
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 }}
/>
Expand Down
3 changes: 1 addition & 2 deletions src/app/(public)/(site)/sponsors/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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",
});

Expand Down
3 changes: 1 addition & 2 deletions src/app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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: {
Expand Down
4 changes: 2 additions & 2 deletions src/app/og/home/image.png/route.tsx
Original file line number Diff line number Diff line change
@@ -1,13 +1,13 @@
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";
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");
Expand Down
Loading
Loading