From 60af40c509d96e1ee82b2d7f7554262453697d4c Mon Sep 17 00:00:00 2001 From: Howie Young Date: Sat, 8 Aug 2026 22:03:25 +0800 Subject: [PATCH] docs: content language, reading digest, and the tightened knowledge gate MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Document the features shipped in the recent PRs, across all six READMEs (EN + zh-TW + ja/ko/es/fr, mirrored) and AGENTS.md: - Content language: generated content follows the language you read (auto-detected; contentLanguage in userConfig overrides); a new "Languages" section explains it. - Reading digest: each issue's one-line theme summary — epigraph, archive subtitle, and email subject. - Knowledge gate: exclusions now name movie showtimes / ticketing / booking / event signups — "about doing or buying rather than understanding". AGENTS.md also gains the pipeline's digest step, the archive/language facts, and a troubleshooting note on the Node/better-sqlite3 pinning (run DB commands with the pinned Node; kickstart the serve agent to deploy — don't reinstall from a different Node). Co-Authored-By: Claude Opus 4.8 --- AGENTS.md | 17 +++++++++++++++-- README.es.md | 12 ++++++++---- README.fr.md | 12 ++++++++---- README.ja.md | 12 ++++++++---- README.ko.md | 12 ++++++++---- README.md | 12 ++++++++---- README.zh-TW.md | 12 ++++++++---- 7 files changed, 63 insertions(+), 26 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 2f82fd3..7dad744 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -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 @@ -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) diff --git a/README.es.md b/README.es.md index 8c10ace..034bacb 100644 --- a/README.es.md +++ b/README.es.md @@ -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 @@ -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 diff --git a/README.fr.md b/README.fr.md index d941d67..c8d9faf 100644 --- a/README.fr.md +++ b/README.fr.md @@ -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é @@ -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 diff --git a/README.ja.md b/README.ja.md index ed8ec16..a36f818 100644 --- a/README.ja.md +++ b/README.ja.md @@ -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`)され、ダイジェストから読み返しても二度と再掲載されません。 ## プライバシー原則 @@ -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:アクティブ読書シグナルをランキングへ;トピック正規化 diff --git a/README.ko.md b/README.ko.md index b3b7b9b..ac6409e 100644 --- a/README.ko.md +++ b/README.ko.md @@ -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** — 잡지 제호(호수 №, 기간, 워드마크, 태그라인), 토픽별 요약, 주간 통계, 그리고 그 주의 테마를 한 줄로 정리한 **리딩 다이제스트**(이메일 제목으로도 쓰입니다). 각 항목에는 **그 주에 몇 분을 읽었는지**——선정된 이유——가 표시됩니다. 당신의 Gmail SMTP로 발송되며 표지는 CID 첨부로 메일 상단에 인라인됩니다. - **자기 루프 없음** — 발송된 호의 항목은 봉인(`published_in`)되어, 다이제스트에서 다시 읽어도 절대 재등장하지 않습니다. ## 프라이버시 원칙 @@ -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: 능동 읽기 신호를 랭킹에 반영; 토픽 정규화 diff --git a/README.md b/README.md index 82cbd71..6241574 100644 --- a/README.md +++ b/README.md @@ -49,10 +49,10 @@ Extension ──────┘ (knowledge (LLM (art (nameplate, ( - **Ingest** — reads Chrome's local History database (a copy — Chrome locks the original). If Chrome Sync is on, your phone's browsing is included automatically. - **Extension (MV3)** — counts *active* reading seconds (tab visible + recent interaction) and captures article text at the moment you read it, including behind login walls. Talks **only to `127.0.0.1`** — nothing ever leaves your machine. -- **Classify** — hard rule: non-knowledge content (gossip, lotteries, promos, quick lookups) never makes the issue, no matter how long you lingered. Sensitive pages (banking, mail, auth, government services) are never even stored. -- **Enrich** — an LLM writes three bullets + one takeaway per article, and a one-line editorial context per social post. +- **Classify** — hard rule: non-knowledge content never makes the issue, no matter how long you lingered — gossip, lotteries, shopping/promos, movie showtimes & ticketing/booking, event signups, and quick lookups. Anything about *doing or buying* rather than *understanding* is out. Sensitive pages (banking, mail, auth, government services) are never even stored. +- **Enrich** — an LLM writes three bullets + one takeaway per article, and a one-line editorial context per social post — **in the language you actually read** (auto-detected; override with `contentLanguage` in `userConfig.ts`). - **Cover** — an LLM art director distills the week into a single visual metaphor, then an image engine renders it under a fixed art direction (flat gouache, limited palette, generous negative space — no text in the art). -- **Render & send** — magazine nameplate (issue №, date range, wordmark, tagline), topic-grouped summaries, weekly stats. Every item shows **how long you read it that week** — the reason it was picked. Sent via your own Gmail SMTP with the cover inlined as a CID attachment. +- **Render & send** — magazine nameplate (issue №, date range, wordmark, tagline), topic-grouped summaries, weekly stats, and a one-line **reading digest** of the week's themes (it also becomes the email subject). Every item shows **how long you read it that week** — the reason it was picked. Sent via your own Gmail SMTP with the cover inlined as a CID attachment. - **No self-feeding loop** — once an issue is sent, its items are sealed (`published_in`) and can never reappear, even if you revisit them from the digest itself. ## Privacy principles @@ -172,10 +172,14 @@ Artifacts also accumulate on disk under `out/` (web + email versions per issue) ## Editorial principles -- **Knowledge is a hard gate.** Entertainment gossip, lotteries, shopping promos, event signups and dictionary-style quick lookups are excluded regardless of dwell time. +- **Knowledge is a hard gate.** Entertainment gossip, lotteries, shopping promos, movie showtimes and ticketing/booking, event signups, and dictionary-style quick lookups are excluded regardless of dwell time — anything about *doing or buying* rather than *understanding*. - **Summaries must replace the original.** Three bullets ≤ 42 chars + one takeaway ≤ 32 chars per article. - **The issue is an artifact.** Fixed palette, serif nameplate, issue numbering — beauty gets it opened, content quality gets it finished. +## Languages + +Browstack is language-aware. **Generated content** — topic labels, summaries, the weekly reading digest, and the cover concept — is written in the language you actually read, auto-detected from your browsing (Chrome's page-language tags, falling back to a script heuristic). Set `contentLanguage` in `src/shared/userConfig.ts` (a BCP-47 code like `"en"` / `"ja"` / `"zh-TW"`, a language name, or `"auto"`) to force it. Image-generation prompts stay English regardless (image models expect it). The **fixed UI** — issue chrome, email, and the archive showcase — is localized in English and Traditional Chinese, with English as the fallback for other locales. + ## Roadmap - Scoring v2: active-reading signals into ranking; topic normalization diff --git a/README.zh-TW.md b/README.zh-TW.md index 995aa31..d1f667f 100644 --- a/README.zh-TW.md +++ b/README.zh-TW.md @@ -48,10 +48,10 @@ Extension ──────┘ (知識過濾 (LLM (藝術總監 (報頭 - **Ingest** — 讀取 Chrome 本機的 History 資料庫(讀複本,因為 Chrome 執行中會鎖原檔)。開啟 Chrome 同步的話,手機的瀏覽紀錄會自動包含在內。 - **Extension(MV3)** — 只在「分頁可見+近期有互動」時累積主動閱讀秒數,並在你閱讀的當下擷取正文(含登入牆內的內容)。**只與 `127.0.0.1` 通訊**——任何資料都不出你的機器。 -- **分類** — 硬規則:非知識型內容(八卦、彩券、促銷、快查行為)無論停留多久都不入刊。敏感頁面(網銀、信箱、登入、政府個人業務)連 Browstack 自己的資料庫都不寫入。 -- **增潤** — LLM 為每篇文章寫三個重點+一句 takeaway,為每則社群貼文寫一句編輯脈絡。 +- **分類** — 硬規則:非知識型內容無論停留多久都不入刊——八卦、彩券、購物/促銷、電影場次與訂票/訂位、活動報名、快查行為。任何關於*做某件事或買某件事*、而非*理解*的內容一律排除。敏感頁面(網銀、信箱、登入、政府個人業務)連儲存都不會。 +- **增潤** — LLM 為每篇文章寫三個重點+一句 takeaway,為每則社群貼文寫一句編輯脈絡——**用你實際閱讀的語言**(自動偵測;可在 `userConfig.ts` 用 `contentLanguage` 覆寫)。 - **封面** — LLM 藝術總監把本週內容濃縮成單一視覺隱喻,再由圖像引擎在固定的藝術規格下渲染(扁平絹印質感、有限色盤、慷慨留白、畫面內無文字)。 -- **排版與寄送** — 雜誌報頭(期數№、日期區間、品牌字、小標)、主題分組摘要、一週圖譜。每一條都標註**你那週實際讀了多久**——這正是它被選進本期的原因。透過你自己的 Gmail SMTP 寄出,封面以 CID 附件內嵌信件頂部。 +- **排版與寄送** — 雜誌報頭(期數№、日期區間、品牌字、小標)、主題分組摘要、一週圖譜,以及一句彙整本週主題的**閱讀摘要**(同時也會成為 email 的主旨)。每一條都標註**你那週實際讀了多久**——這正是它被選進本期的原因。透過你自己的 Gmail SMTP 寄出,封面以 CID 附件內嵌信件頂部。 - **無自我迴圈** — 出刊即封存(`published_in`):已刊登的內容永不重複入選,即使你之後從週刊點回去重讀也一樣。 ## 隱私原則 @@ -171,10 +171,14 @@ npm run schedule:weekly -- --day 1 --hour 9 # 例:每週一 09:00(--day 0 ## 編輯原則 -- **知識性是硬門檻。** 娛樂八卦、彩券、購物促銷、活動報名、字典式快查,無論停留多久一律排除。 +- **知識性是硬門檻。** 娛樂八卦、彩券、購物促銷、電影場次與訂票/訂位、活動報名、字典式快查,無論停留多久一律排除——任何關於*做某件事或買某件事*、而非*理解*的內容。 - **摘要要能取代原文。** 每篇三個重點(各 ≤ 42 字)+一句 takeaway(≤ 32 字)。 - **刊物即藝術品。** 固定色盤、serif 報頭、期數編號——美感讓人打開它,內容品質讓人讀完它。 +## 語言 + +Browstack 具備語言感知能力。**生成內容**——主題標籤、摘要、每週閱讀摘要與封面概念——會以你實際閱讀的語言撰寫,並從你的瀏覽自動偵測(Chrome 的頁面語言標記,若無則以文字書寫系統啟發式判斷)。想強制指定,可在 `src/shared/userConfig.ts` 設定 `contentLanguage`(BCP-47 代碼如 `"en"` / `"ja"` / `"zh-TW"`、語言名稱,或 `"auto"`)。圖像生成 prompt 一律維持英文(圖像模型需要英文)。**固定 UI**——期刊外框、email 與典藏櫥窗——已在地化為英文與繁體中文,其他語系則以英文為後備。 + ## Roadmap - 計分 v2:實讀訊號進入主排序;主題正規化