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 CLAUDE.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# CLAUDE.md — Pluck

Pluck is a fast, open-source URL saver with an MCP connector. There is no AI inside the app. Read `docs/architecture.md` before any non-trivial change; `docs/handover/pluck-technical-spec-v2.md` has the background. Use the words in `GLOSSARY.md`. `docs/history/` is the record of the first build, not current.
Pluck is a fast, open-source URL saver with an MCP connector. There is no AI inside the app. Read `docs/architecture.md` before any non-trivial change; `docs/handover/pluck-technical-spec-v2.md` has the background. Use the words in `GLOSSARY.md`.

## Non-negotiables

Expand Down
7 changes: 4 additions & 3 deletions apps/ios/lib/data.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ import { Directory, File, Paths } from "expo-file-system";
import * as Network from "expo-network";
import { useEffect, useState, useSyncExternalStore } from "react";
import { AppState } from "react-native";
import { createQueue, Unreachable } from "@pluck/client";
import { createQueue, Refused, Unreachable } from "@pluck/client";
import { KEEP, MAX_BYTES, onWifi, overCap, plan, toKeep, type Kept } from "./keep";
import { kv } from "./kv";
import { api, authHeader, getSession } from "./session";
Expand Down Expand Up @@ -184,11 +184,12 @@ async function sync(): Promise<number> {
let record: SharedRecord | null = null;
try {
record = JSON.parse(await f.text()) as SharedRecord;
if (record.body) await api("/api/v1/items", { json: record.body });
// The file's name is the key: if the upload below fails, sending the body again makes no second Note.
if (record.body) await api("/api/v1/items", { json: { ...record.body, clientKey: f.name } });
if (record.file) await uploadShared(record.file);
f.delete();
} catch (e) {
if (e instanceof Unreachable) break; // still offline: try next time
if (record && !(e instanceof Refused)) break; // offline, signed out, busy or down: keep it for next time
f.delete(); // refused or unreadable: retrying will not help
if (record?.file) removeShared(record.file.path);
}
Expand Down
35 changes: 11 additions & 24 deletions docs/handover/README.md
Original file line number Diff line number Diff line change
@@ -1,21 +1,16 @@
# Pluck — handover to Claude Code
# Design boards, brand and the original brief

24 October 2026. Everything needed to build v1 of Pluck (getpluck.io), an open-source URL saver with an MCP connector and no AI inside the app.
How Pluck works now is in [`docs/architecture.md`](../architecture.md). This folder holds what it was designed and built from.

## Read in this order

1. `pluck-technical-spec-v2.md` — the build spec. Architecture, data model, API, auth, MCP server, extension, iOS, infra, conventions, and a numbered build order at the end.
2. `pluck-product-spec-v2.md` — what it is, the flows, every screen, the voice, the visual rules, the metrics.
3. `CLAUDE.original.md` — the standing rules as handed over. The live, edited version is the repo-root `CLAUDE.md`.
4. `CHANGES-since-v1.md` — if you read the v1 docs before, this is what moved.
- `design/`: the visual source of truth. Copy values from these boards, never round them.
- `brand/`: tokens, icons and the wordmark.
- `pluck-technical-spec-v2.md`, `pluck-product-spec-v2.md`: the brief from 24 October 2026, kept as background. Where they and the code disagree, the code is right; `CLAUDE.md` lists the decisions that changed.

## Design

`design/` holds the canvas as 43 `.dc.html` artboards plus `canvas.json` (the index with each board's title, size and position). Each file is a self-contained HTML page with inline styles, so the exact paddings, sizes, radii and colours are readable in the markup. Treat them as the visual source of truth and copy values from them rather than rounding.

Two of the boards are shared components the others import: `Logo.dc.html` and `Icon.dc.html`. Port those first into `packages/ui`.
`design/` holds the canvas as 43 `.dc.html` artboards plus `canvas.json` (the index with each board's title, size and position). Each file is a self-contained HTML page with inline styles, so the exact paddings, sizes, radii and colours are readable in the markup.

Board map:
Two of the boards are shared components the others import: `Logo.dc.html` and `Icon.dc.html`, ported to `packages/ui`.

| File | What it is |
|---|---|
Expand All @@ -34,19 +29,11 @@ Board map:
| `Claude.dc.html` | The connector in use (two example conversations) |
| `Email.dc.html` | The Monday digest |
| `Landing.dc.html`, `SiteClaude.dc.html`, `SiteOpen.dc.html`, `SiteSupport.dc.html`, `SitePrivacy.dc.html`, `SiteTerms.dc.html` | Marketing site: home, connect your AI, open source, support, privacy, terms |
| `SiteChrome.dc.html`, `SiteIPhone.dc.html` | "Soon." pages while the Chrome Web Store and App Store listings are in review |
| `Cookies.dc.html` | The cookie banner, for the day an analytics cookie arrives (none is needed today) |
| `ConnectLoop.dc.html` | The 10-second "connect your AI" loop: live, with timing, frames, spec and where it goes. The same CSS ships as `apps/web/components/ConnectLoop.tsx`; `motion/connect-loop.html` is the standalone page that `scripts/record-loop.mjs` records |
| `SiteChrome.dc.html`, `SiteIPhone.dc.html` | The "Soon." pages from while the Chrome Web Store and App Store listings were in review |
| `Cookies.dc.html` | The cookie banner |
| `ConnectLoop.dc.html` | The 10-second "connect your AI" loop: live, with timing, frames and spec. The same CSS ships as `apps/web/components/ConnectLoop.tsx`; `motion/connect-loop.html` is the standalone page that `scripts/record-loop.mjs` records |
| `AppStore1.dc.html` to `AppStore5.dc.html` | App Store screenshots at 1320 × 2868 (6.9 inch), built from the iOS boards |

## Brand

`brand/tokens.json` is the palette, type, layout and the seven kind glyph paths. `brand/*.svg` are the app icon (regenerated with every other icon size by `node scripts/icons.mjs`, from `packages/ui/src/icon.json`) (forest, mint, dark), favicons at 32 and 16, the bare glyph, and the wordmark. The wordmark SVG uses the live Fredoka font; convert to outlines before shipping it anywhere the font is not loaded.

## Placeholders to fill before launch

Legal entity, address, privacy and abuse emails, hosting provider and region, licence, repo URL, takedown response time. They are marked `[LIKE THIS]` in the specs and the site boards.

## The one rule

No model calls on the server. Ever. AI features are MCP prompts in `packages/mcp`. A PR that adds one is declined.
`brand/tokens.json` is the palette, type, layout and the seven kind glyph paths. `brand/*.svg` are the app icon (forest, mint, dark; regenerated with every other icon size by `node scripts/icons.mjs`, from `packages/ui/src/icon.json`), favicons at 32 and 16, the bare glyph, and the wordmark. The wordmark SVG uses the live Fredoka font; convert to outlines before using it anywhere the font is not loaded.
4 changes: 3 additions & 1 deletion docs/handover/pluck-product-spec-v2.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
# Pluck — Product and Design Spec v2

24 October 2026. Supersedes v1. The design canvas (33 boards) is the visual source of truth; this doc is the written one.
> **The brief Pluck was built from, kept as background.** Where it and the code disagree, the code is right: see `docs/architecture.md` for how Pluck works now and "Decisions that differ from the spec" in `CLAUDE.md`.

24 October 2026. Supersedes v1. The design canvas (now 43 boards) is the visual source of truth; this doc is the written one.

## What Pluck is

Expand Down
2 changes: 2 additions & 0 deletions docs/handover/pluck-technical-spec-v2.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
# Pluck — Technical Spec v2

> **The brief Pluck was built from, kept as background.** Where it and the code disagree, the code is right: see `docs/architecture.md` for how Pluck works now and "Decisions that differ from the spec" in `CLAUDE.md`.

24 October 2026. Supersedes v1. Read with the Product and Design Spec v2 and the design canvas.

## Purpose and scope
Expand Down
46 changes: 0 additions & 46 deletions docs/history/CHANGES-since-v1.md

This file was deleted.

32 changes: 0 additions & 32 deletions docs/history/CLAUDE.original.md

This file was deleted.

8 changes: 0 additions & 8 deletions docs/history/README.md

This file was deleted.

21 changes: 0 additions & 21 deletions docs/history/SYNC-2026-10-24.md

This file was deleted.

15 changes: 0 additions & 15 deletions docs/history/loop/BLOCKED.md

This file was deleted.

Loading
Loading