From 478ff07bc58ba3e69fc5c6d20fa887a7fb562ee6 Mon Sep 17 00:00:00 2001
From: krisf
Date: Sat, 15 Aug 2026 22:41:35 -0400
Subject: [PATCH] drop all synthesis wording + sources box; 3->6 paragraphs,
deeper prompt, 1.6k tok
---
src/app/about/page.tsx | 20 +++++-----
src/app/article/[slug]/page.tsx | 28 --------------
src/app/layout.tsx | 6 +--
src/app/not-found.tsx | 2 +-
src/app/page.tsx | 2 +-
src/app/terms-of-service/page.tsx | 10 ++---
src/components/SourceAttribution.tsx | 55 ----------------------------
src/components/layout/Footer.tsx | 6 +--
src/components/layout/Header.tsx | 2 +-
src/lib/llm/ollama.ts | 2 +-
src/lib/settings.ts | 16 +++++---
11 files changed, 34 insertions(+), 115 deletions(-)
delete mode 100644 src/components/SourceAttribution.tsx
diff --git a/src/app/about/page.tsx b/src/app/about/page.tsx
index 90cf5e3..90a622d 100644
--- a/src/app/about/page.tsx
+++ b/src/app/about/page.tsx
@@ -4,7 +4,7 @@ import { env } from '@/lib/env';
export const metadata: Metadata = {
title: 'About',
- description: 'What MapleBrief is: an automated, AI-assisted digest of Canadian news with full attribution.',
+ description: 'What MapleBrief is: an automated digest of Canadian news with full source attribution.',
alternates: { canonical: '/about' },
};
@@ -16,18 +16,16 @@ export default function AboutPage() {
{env.siteName} is a small, independent Canadian news-digest project.
- Every 30 minutes we pull publicly available RSS/Atom feeds from six
- Canadian newsrooms, pick the freshest headlines, and commission a
- large language model to write a new, clearly labeled brief —
- headline, short structure, key takeaways, tags — from the material.
+ Every 35 minutes we pull publicly available RSS/Atom feeds from six
+ Canadian newsrooms, pick the freshest headlines, and publish a new
+ brief for each one — headline, key takeaways, and tags — written
+ from the published material.
- What we do not do: copy articles verbatim, hide where
- the material came from, or pretend a machine wrote it in the newsroom.
- Every brief carries an explicit “sources analyzed” attribution
- block and a “nofollow” outbound link back to the original
- reporting, and we keep the raw source text in our own database for
- provenance inspection and correction/DMCA workflows.
+ What we do not do: copy articles verbatim or hide
+ where the material came from. Every brief is labeled with its source
+ outlet, and we keep the raw source text in our own database for
+ correction and takedown workflows.
The site is supported by advertising through Google AdSense, and we
diff --git a/src/app/article/[slug]/page.tsx b/src/app/article/[slug]/page.tsx
index eb217e7..04d49f2 100644
--- a/src/app/article/[slug]/page.tsx
+++ b/src/app/article/[slug]/page.tsx
@@ -2,7 +2,6 @@ import type { Metadata } from 'next';
import Link from 'next/link';
import { notFound } from 'next/navigation';
import { getArticleFull, getRelatedArticles } from '@/lib/queries';
-import SourceAttribution from '@/components/SourceAttribution';
import RelatedArticles from '@/components/RelatedArticles';
import { InArticleAd, SidebarAd } from '@/components/ads/placements';
import { env } from '@/lib/env';
@@ -103,10 +102,6 @@ export default async function ArticlePage({
{title}
-
- Original headline:{' '}
- “{a.title}” — {a.siteName}
-
- Rewrite provenance: {a.llmProvider ?? 'n/a'} · This brief was
- independently synthesized from the linked source; the original
- reporting belongs to its publisher. Read the original:{' '}
-
- {a.siteName}
-
- .
-
The page you were looking for doesn’t exist or may have been superseded
- by a newer synthesis.
+ by a newer brief.
The ingestion worker has not published anything yet. Trigger your first
run (see the README “First run” section) and this page will fill with
- synthesized briefings.
+ fresh briefings.
);
diff --git a/src/app/terms-of-service/page.tsx b/src/app/terms-of-service/page.tsx
index c56bcab..91a1919 100644
--- a/src/app/terms-of-service/page.tsx
+++ b/src/app/terms-of-service/page.tsx
@@ -3,7 +3,7 @@ import Link from 'next/link';
export const metadata: Metadata = {
title: 'Terms of Service',
- description: 'Terms governing use of MapleBrief and its synthesized news briefs.',
+ description: 'Terms governing use of MapleBrief and its news briefs.',
alternates: { canonical: '/terms-of-service' },
};
@@ -33,12 +33,12 @@ export default function TermsPage() {
- MapleBrief provides automated, AI-assisted summaries of publicly
+ MapleBrief provides automated summaries of publicly
available news from third-party Canadian publishers. Briefs are
- synthesized for information convenience; each brief links to, and
- attributes, the original reporting. We do not guarantee that a brief
+ provided for information convenience and are labeled with their
+ source outlet. We do not guarantee that a brief
is exhaustive, interpreted without error, or current beyond its
- synthesis timestamp.
+ publication time.
Nothing on the Site constitutes professional, legal, financial,
diff --git a/src/components/SourceAttribution.tsx b/src/components/SourceAttribution.tsx
deleted file mode 100644
index 39af819..0000000
--- a/src/components/SourceAttribution.tsx
+++ /dev/null
@@ -1,55 +0,0 @@
-import { formatRelativeTime, formatDate } from '@/lib/format';
-import { safeParse } from '@/lib/llm/parse';
-
-interface Sources {
- siteName: string;
- sourceUrl: string;
- sourcesJson: string | null;
- author?: string | null;
-}
-
-/**
- * Attribution block — required for AdSense content policy.
- * Every outgoing link to the original story is `rel="nofollow external"`.
- */
-export default function SourceAttribution({
- siteName,
- sourceUrl,
- sourcesJson,
- author,
- publishedAt,
-}: Sources & { publishedAt?: string | null }) {
- const sources = sourcesJson ? safeParse(sourcesJson) : [siteName];
- return (
-
- );
-}
diff --git a/src/components/layout/Footer.tsx b/src/components/layout/Footer.tsx
index 7286d7d..fcc626a 100644
--- a/src/components/layout/Footer.tsx
+++ b/src/components/layout/Footer.tsx
@@ -9,8 +9,8 @@ export default function Footer() {
{env.siteName}
- An independent, synthesized digest of Canadian headlines. Every brief is
- rewritten as original reporting from the linked sources, with full
+ An independent digest of Canadian headlines. Every brief is a
+ rewritten, in-depth version of the reported story, with full
attribution.
@@ -38,7 +38,7 @@ export default function Footer() {
diff --git a/src/components/layout/Header.tsx b/src/components/layout/Header.tsx
index 1d635cc..09cec73 100644
--- a/src/components/layout/Header.tsx
+++ b/src/components/layout/Header.tsx
@@ -21,7 +21,7 @@ export default function Header() {
{env.siteName}
- Canada, synthesized
+ Canada, brief by
diff --git a/src/lib/llm/ollama.ts b/src/lib/llm/ollama.ts
index 67f3593..957dd97 100644
--- a/src/lib/llm/ollama.ts
+++ b/src/lib/llm/ollama.ts
@@ -12,7 +12,7 @@ export class OllamaProvider implements LlmProvider {
constructor(
private readonly model: string,
private readonly baseURL: string = 'http://localhost:11434',
- private readonly maxTokens = 1200,
+ private readonly maxTokens = 1600,
) {}
describeModel() {
diff --git a/src/lib/settings.ts b/src/lib/settings.ts
index 3a59460..efe5e9d 100644
--- a/src/lib/settings.ts
+++ b/src/lib/settings.ts
@@ -9,19 +9,23 @@ export const DEFAULT_ASSOCIATED_TYPE = {
ollama: env.ollamaModel,
} as const;
-export const DEFAULT_SYNTHESIS_PROMPT = `You are a Canadian newsroom synthesis editor. Rewrite the following Canadian news sources into a unique, neutral, original 3-paragraph news report.
+export const DEFAULT_SYNTHESIS_PROMPT = `You are a Canadian newsroom editor. Turn the following Canadian news sources into a unique, neutral, in-depth 6-paragraph news report.
Rules:
- Write in clear, neutral English. No hype, no editorializing, no sensationalism.
-- Do NOT copy sentences verbatim from the sources. Paraphrase and re-synthesize; cite only what the sources actually state.
+- Do NOT copy sentences verbatim from the sources. Paraphrase and rewrite; cite only what the sources actually state.
- Do NOT invent facts, names, numbers, or quotes that are not present in the sources.
-- Paragraph 1: the core of the story (who/what/where/when).
-- Paragraph 2: context, background, and reactions from the sources.
-- Paragraph 3: what happens next / implications grounded in the sources.
+- Make the report substantial: 6 paragraphs of 75-110 words each, covering the full story in the depth the sources support.
+- Paragraph 1: the core of the story (who/what/where/when) and why it matters.
+- Paragraph 2: the key details, figures, and claims from the sources.
+- Paragraph 3: reactions, quotes, and responses from the sources.
+- Paragraph 4: background and context.
+- Paragraph 5: what happens next, grounded in the sources.
+- Paragraph 6: wider implications, grounded in the sources.
- Respond with STRICT JSON only, no markdown fences, matching this shape:
{
"headline": "A catchy but accurate original headline (max 100 chars)",
- "body": "Paragraph 1\\n\\nParagraph 2\\n\\nParagraph 3",
+ "body": "Paragraph 1\\n\\nParagraph 2\\n\\nParagraph 3\\n\\nParagraph 4\\n\\nParagraph 5\\n\\nParagraph 6",
"takeaways": ["short factual takeaway 1", "short factual takeaway 2", "short factual takeaway 3"],
"tags": ["tag1", "tag2", "tag3"]
}