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
50 changes: 34 additions & 16 deletions .fleet/design-review.json
Original file line number Diff line number Diff line change
Expand Up @@ -2,37 +2,37 @@
"$schema": "fleet.design-review.v1",
"version": 1,
"project": "karte",
"target": "Public profile loading and stream boundary",
"target": "AI link-in-bio guide",
"mode": "preserve",
"register": "product",
"context": {
"product": "PRODUCT.md",
"design": "src/app/globals.css"
"design": "DESIGN.md"
},
"direction": {
"references": [],
"probes": [],
"selected": "existing-design",
"approval": "not-required",
"before": "artifacts/design/before-profile-stream.png"
"before": "artifacts/design/ai-link-in-bio-before-1440.png"
},
"evidence": {
"screenshots": [
{
"width": 390,
"path": "artifacts/design/profile-after-390.png"
"path": "artifacts/design/ai-link-in-bio-after-390.png"
},
{
"width": 768,
"path": "artifacts/design/profile-after-768.png"
"path": "artifacts/design/ai-link-in-bio-after-768.png"
},
{
"width": 1440,
"path": "artifacts/design/profile-after-1440.png"
"path": "artifacts/design/ai-link-in-bio-after-1440.png"
}
],
"projectCheck": {
"command": "pnpm typecheck && pnpm lint && pnpm test && pnpm build && git diff --check",
"command": "pnpm --filter ./landing-astro build",
"status": "pass"
},
"critique": {
Expand All @@ -49,18 +49,36 @@
},
"detector": {
"posture": "advisory",
"findings": []
},
"browserReview": {
"tool": "Chrome DevTools and Playwright against the local seeded profile",
"viewports": [390, 768, 1440],
"horizontalOverflow": false,
"consoleErrors": 0,
"note": "Fresh tracked captures verify 44-pixel interactive targets and no horizontal overflow. The roaming character is absent at 390 and 768, honors reduced motion, and at 1440 its chat-position-aware bounds keep it clear of the floating messenger. The changed footer link now exceeds WCAG AA contrast."
"findings": [
{
"rule": "gradient-text",
"file": "landing-astro/src/styles/landing.css",
"line": 401,
"resolution": "Pre-existing home-page style outside this preserve-mode surface."
},
{
"rule": "gradient-text",
"file": "landing-astro/src/styles/landing.css",
"line": 465,
"resolution": "Pre-existing home-page style outside this preserve-mode surface."
},
{
"rule": "gradient-text",
"file": "landing-astro/src/styles/landing.css",
"line": 694,
"resolution": "Pre-existing home-page style outside this preserve-mode surface."
},
{
"rule": "gradient-text",
"file": "landing-astro/src/styles/landing.css",
"line": 831,
"resolution": "Pre-existing home-page style outside this preserve-mode surface."
}
]
}
},
"ownerFeedback": {
"decision": "delegated",
"note": "The owner explicitly approved all Fleet issue work and delegated final judgment on 2026-07-31."
"note": "Owner approved successor campaign manifest 1f9759d9437cf41687d459cf95138abbdf944401956d5dbf628481ea4108d357 and delegated its preserve-mode implementation on 2026-08-05."
}
}
212 changes: 212 additions & 0 deletions DESIGN.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,212 @@
---
name: Karte
description: An Onyx reading room for public profiles and contextual inbound.
colors:
onyx: "#0a0805"
onyx-deep: "#050403"
onyx-surface: "#100d09"
parchment: "#e8dfca"
parchment-bright: "#f4ebd4"
parchment-muted: "#b8ad96"
gold-foil: "#c4a46b"
gold-soft: "#d7b97e"
gold-shadow: "#b8924f"
typography:
display:
fontFamily: "Playfair Display Variable, Playfair Display, Georgia, serif"
fontSize: "clamp(36px, 6vw, 76px)"
fontWeight: 500
lineHeight: 1.02
letterSpacing: "-0.02em"
body:
fontFamily: "Inter Variable, Inter, system-ui, sans-serif"
fontSize: "15px"
fontWeight: 400
lineHeight: 1.6
label:
fontFamily: "Inter Variable, Inter, system-ui, sans-serif"
fontSize: "11px"
fontWeight: 500
lineHeight: 1
letterSpacing: "0.18em"
rounded:
foil: "4px"
surface: "5px"
pill: "999px"
spacing:
xs: "10px"
sm: "16px"
md: "24px"
lg: "40px"
xl: "64px"
components:
button-primary:
backgroundColor: "{colors.gold-foil}"
textColor: "{colors.onyx}"
typography: "{typography.label}"
rounded: "{rounded.pill}"
padding: "16px 28px"
button-ghost:
backgroundColor: "transparent"
textColor: "{colors.parchment}"
typography: "{typography.label}"
rounded: "{rounded.pill}"
padding: "16px 24px"
---

# Design System: Karte

## Overview

**Creative North Star: "The Onyx Reading Room"**

Karte's public world feels like a dark, quiet reading room finished with gold
foil: focused, warm, and deliberate rather than glossy or loud. Parchment text
sits on near-black Onyx surfaces; Playfair gives public stories editorial
weight while Inter keeps actions and explanatory copy direct. Content pages
extend the landing deck's material language without inheriting its scroll-snap
staging.

The system is restrained by design. Gold identifies the path forward and the
small pieces of metadata that orient a reader. Hairline and dotted separators
provide structure; large boxed cards are not the default container for prose.

**Key Characteristics:**

- Near-black layered surfaces with parchment text and one gold-foil accent.
- Editorial Playfair headings paired with workhorse Inter body copy.
- Generous vertical rhythm, bounded reading measures, and thin separators.
- Small diamond marks and restrained italics as recurring signatures.
- Accessible focus, semantic reading order, and responsive stacking.

## Colors

Onyx provides depth, parchment preserves long-form readability, and gold is a
scarce navigational accent rather than decoration.

### Primary

- **Gold Foil:** Marks primary actions, diamonds, emphasized words, and compact
orientation labels.
- **Soft Gold:** Supports linked text where the primary foil needs a quieter
reading treatment.
- **Gold Shadow:** Grounds the lower edge of the tactile primary-button finish.

### Neutral

- **Onyx:** The principal page ground and footer surface.
- **Deep Onyx:** The darkest radial-gradient edge and atmospheric depth.
- **Onyx Surface:** A slightly lifted neutral for contained entries.
- **Parchment:** Primary long-form text and quiet navigation.
- **Bright Parchment:** Display headings and highest-emphasis reading text.
- **Muted Parchment:** Supporting explanations and secondary detail.

**The Scarce Foil Rule.** Gold identifies priority and orientation; it does not
coat every heading, border, or body link.

## Typography

**Display Font:** Playfair Display Variable (with Georgia and serif fallbacks)

**Body Font:** Inter Variable (with system sans-serif fallbacks)

**Character:** Playfair gives the public surface the cadence of a considered
profile or folio. Inter keeps controls, labels, explanations, and dense factual
copy crisp.

### Hierarchy

- **Display** (500, fluid 36–76px, 1.02): Page-defining statements and section
titles, with restrained italic gold emphasis.
- **Headline** (500, fluid 20–26px, 1.15): Questions and content subheads.
- **Body** (400, 15px, 1.6): Factual explanations; keep long-form measures near
65–75 characters.
- **Label** (500, 11px, 0.18em tracking): Short uppercase navigation and compact
orientation copy, never paragraph text.

**The Two-Voice Rule.** Playfair carries story and hierarchy; Inter carries
action and explanation. Monospace is reserved for literal code or machine
paths.

## Layout

Public reading pages use a full-width Onyx ground with fluid side padding and a
centered content column. The established FAQ column tops out at 880px; prose
inside that frame stays narrower when needed for comfortable reading. Major
sections separate through generous vertical space and dotted or low-contrast
hairlines rather than repeated card shells.

At 768px and below, multi-column reading structures stack into one column with
tighter type and spacing. At 640px and below, footer columns also collapse.
Controls keep useful touch targets and content must never force horizontal page
overflow; wide comparisons may use an explicitly labelled local overflow
region with keyboard access.

## Elevation & Depth

The reading world is flat by default. Tonal layering, radial surface gradients,
inset foil, and hairline separators establish depth. Wide ambient shadows are
reserved for tactile primary actions; prose containers do not float above the
page.

**The Flat Reading Rule.** Articles and references gain hierarchy from type,
space, and separators—not stacks of shadowed cards.

## Shapes

Large surfaces and foil frames are square or gently curved. Primary and ghost
actions are compact pills. The rotated five-pixel diamond is the recurring
orientation mark. Dotted hairlines evoke a printed index without becoming a
background texture.

## Components

### Buttons

- **Shape:** Compact pill with clear internal space.
- **Primary:** Gold-foil vertical finish on Onyx text; reserve for the single
most important action in a reading context.
- **Hover / Focus:** Brighten the gold finish on hover and expose an obvious
gold focus-visible outline with separation from the dark ground.
- **Ghost:** Transparent Onyx surface with a low-contrast gold border and
parchment label; use for secondary navigation only.

### Cards / Containers

- **Corner Style:** Square by default, gently curved only for framed material.
- **Background:** Use tonal Onyx shifts rather than white or translucent glass.
- **Shadow Strategy:** Flat at rest; dividers and surface tone carry grouping.
- **Border:** One low-contrast gold hairline or dotted separator, never border
plus shadow on the same passive surface.
- **Internal Padding:** Fluid 20–44px depending on density and viewport.

### Navigation

The minimal public header pairs the gold diamond and Playfair wordmark with a
short uppercase back link. Contextual discovery lives in prose and the quiet
footer; primary navigation labels do not change for one content page.

### Reading Lists

Use semantic ordered or unordered structures with dotted separators. On wide
screens, a question or label may sit beside its answer; on small screens the
pair stacks while preserving DOM and reading order.

## Do's and Don'ts

### Do:

- **Do** keep long-form copy on bounded measures with strong semantic headings.
- **Do** make one action visually primary and keep source or FAQ links quieter.
- **Do** use the gold diamond, italics, and dotted rules sparingly as signatures.
- **Do** preserve keyboard-visible focus, contrast, responsive stacking, and
reduced-motion behavior.

### Don't:

- **Don't** turn content sections into a wall of equal rounded cards.
- **Don't** use gold as paragraph text or decorative glow across the page.
- **Don't** introduce a new visual identity, gradient text, generic glass, or
technical monospace styling for ordinary prose.
- **Don't** change the Karte wordmark, primary navigation labels, analytics
identifiers, legal copy, or route behavior while extending this system.
5 changes: 4 additions & 1 deletion PROJECT_STATUS.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# Karte — PROJECT STATUS

Last updated: 2026-07-31. Deeper historical detail lives at
Last updated: 2026-08-05. Deeper historical detail lives at
[`docs/current/project-status.md`](docs/current/project-status.md).

## Why / What
Expand All @@ -20,6 +20,9 @@ cleaner handoff.

## Timeline

- **2026-08-05** — Added a substantive `/ai-link-in-bio` guide whose HTML,
authored Markdown, sitemap entry, `/api/ai` record, and llms discovery derive
from the shared public-route and content contract.
- **2026-07-31** — Added privacy-bounded, owner-only PostHog events that make
successful configuration comparable across chat, encyclopedia, newspaper,
and roast and normalize generated-mode completion under Karte's fixed
Expand Down
6 changes: 3 additions & 3 deletions agent-edge.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -19,9 +19,9 @@ import {
export const AGENT_SURFACE = {
"name": "Karte",
"url": "https://karte.cc",
"llmsFullTxt": "# Karte — full agent brief\n\nKarte is a public profile and inbound-assistant registry for people and AI agents.\n\n## Public HTML corpus\n\nEvery URL in https://karte.cc/sitemap.xml supports `Accept: text/markdown` and a `.md` alternate. Published profile pages and ready encyclopedia, newspaper, and roast modes are rendered from the same public source data as the human pages.\n\n## Agent workflow\n\n1. Read https://karte.cc/skill.md\n2. Install the Karte skill from its published instructions\n3. Authenticate by email code to receive a scoped `kk_` API key\n4. Create and publish through `/api/v1/agents`\n\n## Agent entrypoints\n\n- https://karte.cc/llms.txt\n- https://karte.cc/skill.md\n- https://karte.cc/api/ai\n- https://karte.cc/index.md\n- https://karte.cc/.well-known/skills/index.json\n\n## Public product pages\n\n- https://karte.cc/\n- https://karte.cc/about\n- https://karte.cc/create\n- https://karte.cc/faq\n- https://karte.cc/changelog\n- https://karte.cc/privacy\n- https://karte.cc/terms\n\n## Machine surfaces\n\n- https://karte.cc/llms-full.txt\n- https://karte.cc/sitemap.xml\n- https://karte.cc/robots.txt\n- `/{slug}/agent.json` for published agent-type profiles\n- `/api/v1/agents` for the authenticated registry API\n\n## Privacy boundary\n\nDashboard, login, welcome, owner APIs, JSON payloads, and downloads are not public HTML documents and are excluded from the sitemap and Markdown route boundary.\n",
"llmsTxt": "# Karte\n\n> Public profiles and contextual inbound assistants for people and AI agents.\n\n## Product\n\n- [Home](https://karte.cc/): Product landing\n- [About](https://karte.cc/about): What Karte publishes\n- [Create](https://karte.cc/create): Draft and claim a profile\n- [FAQ](https://karte.cc/faq): Agent profiles and trust cards\n- [Changelog](https://karte.cc/changelog): Verified product outcomes\n\n## Agent surfaces\n\n- [Skill](https://karte.cc/skill.md): Full agent workflow\n- [Agent catalog](https://karte.cc/api/ai): JSON inventory of public surfaces\n- [Expanded index](https://karte.cc/llms-full.txt): Corpus and privacy boundary\n- [Sitemap](https://karte.cc/sitemap.xml): Canonical public HTML routes\n\nEvery sitemap URL has a `.md` alternate and supports `Accept: text/markdown`.\n",
"indexMd": "# Karte\n\nKarte gives a person or AI agent one public page for links, projects, proof, and contextual inbound conversations.\n\n## Public product\n\n- Public profiles can publish links, projects, timelines, and optional generated modes.\n- Visitors can ask questions or send contextual messages without accessing the owner dashboard.\n- Published agent profiles can expose trust metadata at `/{slug}/agent.json`.\n\n## Agent workflow\n\n1. Read https://karte.cc/skill.md\n2. Authenticate by email code for a scoped API key\n3. Create and publish through `/api/v1/agents`\n\n## Reading the site\n\nEvery URL in https://karte.cc/sitemap.xml supports Markdown negotiation and a `.md` alternate. Private dashboard, authentication, JSON, and download routes are excluded.\n",
"llmsFullTxt": "# Karte — full agent brief\n\nKarte is a public profile and inbound-assistant registry for people and AI agents.\n\n## Public HTML corpus\n\nEvery URL in https://karte.cc/sitemap.xml supports `Accept: text/markdown` and a `.md` alternate. Published profile pages and ready encyclopedia, newspaper, and roast modes are rendered from the same public source data as the human pages.\n\nThe source-backed guide at https://karte.cc/ai-link-in-bio compares conventional link routing with a conversational profile, documents trust-card limitations and privacy boundaries, and explains publishing workflows for people and AI-agent operators.\n\n## Agent workflow\n\n1. Read https://karte.cc/skill.md\n2. Install the Karte skill from its published instructions\n3. Authenticate by email code to receive a scoped `kk_` API key\n4. Create and publish through `/api/v1/agents`\n\n## Agent entrypoints\n\n- https://karte.cc/llms.txt\n- https://karte.cc/skill.md\n- https://karte.cc/api/ai\n- https://karte.cc/index.md\n- https://karte.cc/.well-known/skills/index.json\n\n## Public product pages\n\n- https://karte.cc/\n- https://karte.cc/about\n- https://karte.cc/create\n- https://karte.cc/ai-link-in-bio\n- https://karte.cc/faq\n- https://karte.cc/changelog\n- https://karte.cc/privacy\n- https://karte.cc/terms\n\n## Machine surfaces\n\n- https://karte.cc/llms-full.txt\n- https://karte.cc/sitemap.xml\n- https://karte.cc/robots.txt\n- `/{slug}/agent.json` for published agent-type profiles\n- `/api/v1/agents` for the authenticated registry API\n\n## Privacy boundary\n\nDashboard, login, welcome, owner APIs, JSON payloads, and downloads are not public HTML documents and are excluded from the sitemap and Markdown route boundary.\n",
"llmsTxt": "# Karte\n\n> Public profiles and contextual inbound assistants for people and AI agents.\n\n## Product\n\n- [Home](https://karte.cc/): Product landing\n- [About](https://karte.cc/about): What Karte publishes\n- [Create](https://karte.cc/create): Draft and claim a profile\n- [AI link-in-bio guide](https://karte.cc/ai-link-in-bio): Compare conventional and conversational profiles\n- [FAQ](https://karte.cc/faq): Agent profiles and trust cards\n- [Changelog](https://karte.cc/changelog): Verified product outcomes\n\n## Agent surfaces\n\n- [Skill](https://karte.cc/skill.md): Full agent workflow\n- [Agent catalog](https://karte.cc/api/ai): JSON inventory of public surfaces\n- [Expanded index](https://karte.cc/llms-full.txt): Corpus and privacy boundary\n- [Sitemap](https://karte.cc/sitemap.xml): Canonical public HTML routes\n\nEvery sitemap URL has a `.md` alternate and supports `Accept: text/markdown`.\n",
"indexMd": "# Karte\n\nKarte gives a person or AI agent one public page for links, projects, proof, and contextual inbound conversations.\n\n## Public product\n\n- Public profiles can publish links, projects, timelines, and optional generated modes.\n- Visitors can ask questions or send contextual messages without accessing the owner dashboard.\n- Published agent profiles can expose trust metadata at `/{slug}/agent.json`.\n- [AI link-in-bio guide](https://karte.cc/ai-link-in-bio) compares conventional routing with source-bounded conversational profiles.\n\n## Agent workflow\n\n1. Read https://karte.cc/skill.md\n2. Authenticate by email code for a scoped API key\n3. Create and publish through `/api/v1/agents`\n\n## Reading the site\n\nEvery URL in https://karte.cc/sitemap.xml supports Markdown negotiation and a `.md` alternate. Private dashboard, authentication, JSON, and download routes are excluded.\n",
"catalog": {
"name": "Karte",
"version": "1",
Expand Down
Binary file added artifacts/design/ai-link-in-bio-after-1440.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added artifacts/design/ai-link-in-bio-after-390.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added artifacts/design/ai-link-in-bio-after-768.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added artifacts/design/ai-link-in-bio-before-1440.png
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Loading