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
17 changes: 15 additions & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,8 +9,13 @@ follow this playbook. **Always reply in the user's language.**

Browstack turns the user's own Chrome browsing history into a beautifully designed, privacy-first
personal weekly digest (a "personal New Yorker"), delivered to their inbox. Pipeline:
`ingest → enrich (LLM) → cover (art) → render → send (Gmail SMTP)`, schedulable weekly via launchd.
Everything runs locally; browsing data never leaves the machine.
`ingest → enrich (LLM) → cover (art) → digest (LLM) → render → send (Gmail SMTP)`, schedulable weekly
via launchd. Everything runs locally; browsing data never leaves the machine.

Each issue carries a one-line **reading digest** of the week's themes (issue epigraph, archive-card
subtitle, and email subject). The weekly email links to a browsable **archive** served by the resident
receiver on `127.0.0.1:8787` (`npm run archive:open`). Generated content follows the language the user
reads (auto-detected; `contentLanguage` in `userConfig.ts` overrides); the fixed UI is localized en/zh-TW.

## Hard rules for agents

Expand Down Expand Up @@ -116,6 +121,14 @@ Logs at `data/logs/weekly.log`. Uninstall:
passwords require 2-Step Verification enabled.
- Empty issue → user needs ≥ a few days of Chrome browsing; check `npm run stats`.
- Mobile browsing missing → Chrome Sync must be on (same Google account on phone).
- **`better_sqlite3.node ... NODE_MODULE_VERSION` / `ERR_DLOPEN_FAILED`** → the native module is built
for the Node that installed it; the current Node differs. The resident server & weekly are pinned to
a specific Node — run DB-touching commands with that same Node (or `npm rebuild better-sqlite3` for the
current one). Do NOT re-run `schedule:weekly` from a different Node than the one already pinned, or the
resident server will fail to load better-sqlite3. To pick up new server code, restart the agent instead:
`launchctl kickstart -k gui/$UID/com.browstack.serve`.
- Archive link dead / `archive:open` says the service isn't running → the receiver (`com.browstack.serve`)
is down; the daily heartbeat also probes `/health`. Start it (`npm run serve`) or kickstart the agent.

## Docs maintenance rule (for agents editing this repo)

Expand Down
12 changes: 8 additions & 4 deletions README.es.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,10 @@ Extension ──────┘ (knowledge (LLM (art (nameplate, (

- **Ingest** — lee la base de datos History local de Chrome (una copia — Chrome bloquea la original). Con Chrome Sync activado, la navegación de tu móvil se incluye automáticamente.
- **Extensión (MV3)** — cuenta los segundos de lectura *activa* (pestaña visible + interacción reciente) y captura el texto del artículo en el momento en que lo lees, incluso tras muros de login. Habla **solo con `127.0.0.1`** — nada sale jamás de tu máquina.
- **Classify** — regla dura: el contenido que no es de conocimiento (cotilleos, loterías, promociones, búsquedas rápidas) nunca entra en el número, por mucho que te quedaras. Las páginas sensibles (banca, correo, autenticación, servicios públicos) ni siquiera se almacenan.
- **Enrich** — un LLM escribe tres puntos + una conclusión por artículo, y una línea de contexto editorial por publicación social.
- **Classify** — regla dura: el contenido que no es de conocimiento nunca entra en el número, por mucho que te quedaras — cotilleos, loterías, compras/promociones, horarios de cine y venta/reserva de entradas, inscripciones a eventos y búsquedas rápidas. Todo lo que tiene que ver con *hacer o comprar* en lugar de *entender* queda fuera. Las páginas sensibles (banca, correo, autenticación, servicios públicos) ni siquiera se almacenan.
- **Enrich** — un LLM escribe tres puntos + una conclusión por artículo, y una línea de contexto editorial por publicación social — **en el idioma en que realmente lees** (detectado automáticamente; anúlalo con `contentLanguage` en `userConfig.ts`).
- **Cover** — un director de arte LLM destila la semana en una única metáfora visual, y un motor de imagen la pinta bajo una dirección artística fija (gouache plano, paleta limitada, generoso espacio negativo — sin texto en la obra).
- **Render & send** — cabecera de revista (número №, rango de fechas, logotipo, lema), resúmenes agrupados por tema, estadísticas semanales. Cada pieza muestra **cuánto tiempo la leíste esa semana** — la razón por la que fue elegida. Enviado por tu propio Gmail SMTP con la portada incrustada como adjunto CID.
- **Render & send** — cabecera de revista (número №, rango de fechas, logotipo, lema), resúmenes agrupados por tema, estadísticas semanales y un **digest de lectura** de una línea con los temas de la semana (que además se convierte en el asunto del correo). Cada pieza muestra **cuánto tiempo la leíste esa semana** — la razón por la que fue elegida. Enviado por tu propio Gmail SMTP con la portada incrustada como adjunto CID.
- **Sin bucle de autoalimentación** — al enviarse un número, sus piezas quedan selladas (`published_in`) y no pueden reaparecer, aunque las revisites desde el propio digest.

## Principios de privacidad
Expand Down Expand Up @@ -172,10 +172,14 @@ Los artefactos también se acumulan en disco en `out/` (versiones web + email po

## Principios editoriales

- **El conocimiento es una puerta dura.** Cotilleos de entretenimiento, loterías, promociones de compras, inscripciones a eventos y búsquedas rápidas tipo diccionario quedan excluidos sin importar el tiempo de permanencia.
- **El conocimiento es una puerta dura.** Cotilleos de entretenimiento, loterías, promociones de compras, horarios de cine y venta/reserva de entradas, inscripciones a eventos y búsquedas rápidas tipo diccionario quedan excluidos sin importar el tiempo de permanencia — todo lo que tiene que ver con *hacer o comprar* en lugar de *entender*.
- **Los resúmenes deben sustituir al original.** Tres puntos ≤ 42 caracteres + una conclusión ≤ 32 caracteres por artículo.
- **El número es un artefacto.** Paleta fija, cabecera serif, numeración de números — la belleza hace que lo abras, la calidad del contenido hace que lo termines.

## Idiomas

Browstack es consciente del idioma. El **contenido generado** — etiquetas de temas, resúmenes, el digest de lectura semanal y el concepto de portada — se escribe en el idioma en que realmente lees, detectado automáticamente a partir de tu navegación (las etiquetas de idioma de página de Chrome, con una heurística de escritura como respaldo). Define `contentLanguage` en `src/shared/userConfig.ts` (un código BCP-47 como `"en"` / `"ja"` / `"zh-TW"`, un nombre de idioma o `"auto"`) para forzarlo. Los prompts de generación de imágenes se mantienen en inglés en cualquier caso (los modelos de imagen lo esperan). La **UI fija** — el marco del número, el correo y la vitrina del archivo — está localizada en inglés y chino tradicional, con el inglés como respaldo para otros locales.

## Hoja de ruta

- Scoring v2: señales de lectura activa en el ranking; normalización de temas
Expand Down
12 changes: 8 additions & 4 deletions README.fr.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,10 @@ Extension ──────┘ (knowledge (LLM (art (nameplate, (

- **Ingest** — lit la base History locale de Chrome (une copie — Chrome verrouille l'original). Si Chrome Sync est activé, la navigation de votre téléphone est incluse automatiquement.
- **Extension (MV3)** — compte les secondes de lecture *active* (onglet visible + interaction récente) et capture le texte de l'article au moment où vous le lisez, y compris derrière les murs de connexion. Ne parle **qu'à `127.0.0.1`** — rien ne quitte jamais votre machine.
- **Classify** — règle stricte : le contenu qui n'est pas de la connaissance (potins, loteries, promos, recherches éclair) n'entre jamais dans le numéro, quel que soit le temps passé. Les pages sensibles (banque, e-mail, authentification, services publics) ne sont même pas stockées.
- **Enrich** — un LLM rédige trois points + une conclusion par article, et une ligne de contexte éditorial par publication sociale.
- **Classify** — règle stricte : le contenu qui n'est pas de la connaissance n'entre jamais dans le numéro, quel que soit le temps passé — potins, loteries, shopping/promos, horaires de cinéma et billetterie/réservation, inscriptions à des événements, et recherches éclair. Tout ce qui relève de *faire ou acheter* plutôt que de *comprendre* est écarté. Les pages sensibles (banque, e-mail, authentification, services publics) ne sont même jamais stockées.
- **Enrich** — un LLM rédige trois points + une conclusion par article, et une ligne de contexte éditorial par publication sociale — **dans la langue que vous lisez réellement** (détectée automatiquement ; à remplacer via `contentLanguage` dans `userConfig.ts`).
- **Cover** — un directeur artistique LLM distille la semaine en une seule métaphore visuelle, puis un moteur d'image la peint sous une direction artistique fixe (gouache plate, palette limitée, généreux espace négatif — aucun texte dans l'œuvre).
- **Render & send** — bandeau de magazine (numéro №, période, logotype, devise), résumés groupés par thème, statistiques hebdomadaires. Chaque pièce affiche **combien de temps vous l'avez lue cette semaine-là** — la raison de sa sélection. Envoyé via votre propre Gmail SMTP avec la couverture intégrée en pièce jointe CID.
- **Render & send** — bandeau de magazine (numéro №, période, logotype, devise), résumés groupés par thème, statistiques hebdomadaires, et un **digest de lecture** d'une ligne sur les thèmes de la semaine (qui devient aussi l'objet de l'e-mail). Chaque pièce affiche **combien de temps vous l'avez lue cette semaine-là** — la raison de sa sélection. Envoyé via votre propre Gmail SMTP avec la couverture intégrée en pièce jointe CID.
- **Pas de boucle d'auto-alimentation** — une fois un numéro envoyé, ses pièces sont scellées (`published_in`) et ne peuvent jamais réapparaître, même si vous les relisez depuis le digest lui-même.

## Principes de confidentialité
Expand Down Expand Up @@ -172,10 +172,14 @@ Les artefacts s'accumulent aussi sur le disque dans `out/` (versions web + e-mai

## Principes éditoriaux

- **La connaissance est un filtre strict.** Potins people, loteries, promos shopping, inscriptions à des événements et recherches éclair type dictionnaire sont exclus quel que soit le temps de lecture.
- **La connaissance est un filtre strict.** Potins people, loteries, promos shopping, horaires de cinéma et billetterie/réservation, inscriptions à des événements et recherches éclair type dictionnaire sont exclus quel que soit le temps de lecture — tout ce qui relève de *faire ou acheter* plutôt que de *comprendre*.
- **Les résumés doivent remplacer l'original.** Trois points ≤ 42 caractères + une conclusion ≤ 32 caractères par article.
- **Le numéro est un artefact.** Palette fixe, bandeau serif, numérotation — la beauté le fait ouvrir, la qualité du contenu le fait finir.

## Langues

Browstack tient compte de la langue. Le **contenu généré** — libellés de thèmes, résumés, le digest de lecture hebdomadaire et le concept de couverture — est rédigé dans la langue que vous lisez réellement, détectée automatiquement à partir de votre navigation (les balises de langue de page de Chrome, avec repli sur une heuristique d'écriture). Renseignez `contentLanguage` dans `src/shared/userConfig.ts` (un code BCP-47 comme `"en"` / `"ja"` / `"zh-TW"`, un nom de langue, ou `"auto"`) pour la forcer. Les prompts de génération d'images restent en anglais quoi qu'il arrive (les modèles d'image l'attendent). L'**interface fixe** — habillage du numéro, e-mail et vitrine des archives — est localisée en anglais et en chinois traditionnel, avec l'anglais comme repli pour les autres locales.

## Feuille de route

- Scoring v2 : signaux de lecture active dans le classement ; normalisation des thèmes
Expand Down
12 changes: 8 additions & 4 deletions README.ja.md
Original file line number Diff line number Diff line change
Expand Up @@ -49,10 +49,10 @@ Extension ──────┘ (knowledge (LLM (art (nameplate, (

- **Ingest** — Chrome のローカル History データベースを読み取ります(コピーを読む——Chrome は原本をロックするため)。Chrome 同期が有効なら、スマホでのブラウジングも自動的に含まれます。
- **Extension(MV3)** — *アクティブな*読書秒数(タブが可視+直近の操作あり)をカウントし、読んでいるその瞬間に本文をキャプチャ(ログインウォールの内側も含む)。通信先は **`127.0.0.1` のみ**——データがマシンの外へ出ることはありません。
- **Classify** — 鉄則:非知識型コンテンツ(ゴシップ、宝くじ、セール、辞書的なクイック検索)は、どれだけ長く滞在しても誌面に載りません。センシティブなページ(銀行、メール、認証、行政サービス)はそもそも保存すらされません。
- **Enrich** — LLM が記事ごとに 3 つの要点+1 つのテイクアウェイを、SNS 投稿ごとに 1 行の編集コンテキストを書きます
- **Classify** — 鉄則:非知識型コンテンツは、どれだけ長く滞在しても誌面に載りません——ゴシップ、宝くじ、ショッピング/セール、映画の上映時間やチケット予約・予約、イベント申込、辞書的なクイック検索。*理解*ではなく*行動や購入*に関わるものはすべて対象外です。センシティブなページ(銀行、メール、認証、行政サービス)はそもそも保存すらされません。
- **Enrich** — LLM が記事ごとに 3 つの要点+1 つのテイクアウェイを、SNS 投稿ごとに 1 行の編集コンテキストを、**あなたが実際に読んでいる言語で**書きます(自動検出。`userConfig.ts` の `contentLanguage` で上書き可能)
- **Cover** — LLM のアートディレクターがその週を単一の視覚的メタファーに蒸留し、画像エンジンが固定のアートディレクション(フラットなガッシュ、限定パレット、たっぷりの余白——画中に文字なし)で描き上げます。
- **Render & send** — 雑誌の題字(号数№、期間、ワードマーク、タグライン)、トピック別の要約、週間統計。各項目には**その週あなたが何分読んだか**——選ばれた理由——を表示。あなた自身の Gmail SMTP で送信し、表紙は CID 添付でメール上部にインライン表示されます。
- **Render & send** — 雑誌の題字(号数№、期間、ワードマーク、タグライン)、トピック別の要約、週間統計、そしてその週のテーマを 1 行にまとめた**リーディングダイジェスト**(メールの件名にもなります)。各項目には**その週あなたが何分読んだか**——選ばれた理由——を表示。あなた自身の Gmail SMTP で送信し、表紙は CID 添付でメール上部にインライン表示されます。
- **自己ループなし** — 送信された号のアイテムは封印(`published_in`)され、ダイジェストから読み返しても二度と再掲載されません。

## プライバシー原則
Expand Down Expand Up @@ -172,10 +172,14 @@ npm run schedule:weekly -- --day 1 --hour 9 # e.g. Mondays at 09:00 (--day 0

## 編集原則

- **知識性はハードゲート。** 芸能ゴシップ、宝くじ、ショッピングセール、イベント申込、辞書的なクイック検索は、滞在時間に関わらず除外。
- **知識性はハードゲート。** 芸能ゴシップ、宝くじ、ショッピングセール、映画の上映時間やチケット予約・予約、イベント申込、辞書的なクイック検索は、滞在時間に関わらず除外——*理解*ではなく*行動や購入*に関わるものはすべて
- **要約は原文の代わりになること。** 記事ごとに 3 つの要点(各 42 字以内)+1 つのテイクアウェイ(32 字以内)。
- **一冊はアーティファクト。** 固定パレット、セリフ体の題字、号数番号——美しさが開かせ、内容の質が読み終えさせる。

## 言語

Browstack は言語を認識します。**生成されるコンテンツ**——トピックラベル、要約、週次リーディングダイジェスト、表紙のコンセプト——は、あなたが実際に読んでいる言語で書かれます。ブラウジング(Chrome のページ言語タグ。取得できない場合は文字体系のヒューリスティック)から自動検出します。強制するには `src/shared/userConfig.ts` の `contentLanguage` を設定してください(`"en"` / `"ja"` / `"zh-TW"` のような BCP-47 コード、言語名、または `"auto"`)。画像生成のプロンプトは常に英語のままです(画像モデルが英語を前提とするため)。**固定 UI**——号のクローム、メール、アーカイブショーケース——は英語と繁体中国語にローカライズされ、その他のロケールでは英語がフォールバックになります。

## ロードマップ

- スコアリング v2:アクティブ読書シグナルをランキングへ;トピック正規化
Expand Down
Loading
Loading