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} -

{a.image && ( @@ -147,14 +142,6 @@ export default async function ArticlePage({ ))}
- - {tags.length > 0 && (
{tags.map((t) => ( @@ -169,21 +156,6 @@ export default async function ArticlePage({
)} -

- 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} - - . -

- diff --git a/src/app/layout.tsx b/src/app/layout.tsx index b695543..580b64e 100644 --- a/src/app/layout.tsx +++ b/src/app/layout.tsx @@ -8,7 +8,7 @@ import { env } from '@/lib/env'; export const metadata: Metadata = { metadataBase: new URL(env.siteUrl), title: { - default: `${env.siteName} — Synthesized Canadian news briefings`, + default: `${env.siteName} — Canadian news briefings`, template: `%s · ${env.siteName}`, }, description: env.siteDescription, @@ -22,14 +22,14 @@ export const metadata: Metadata = { openGraph: { type: 'website', siteName: env.siteName, - title: `${env.siteName} — Synthesized Canadian news briefings`, + title: `${env.siteName} — Canadian news briefings`, description: env.siteDescription, url: env.siteUrl, images: [{ url: '/og-image.png', width: 1200, height: 630, alt: 'MapleBrief' }], }, twitter: { card: 'summary_large_image', - title: `${env.siteName} — Synthesized Canadian news briefings`, + title: `${env.siteName} — Canadian news briefings`, description: env.siteDescription, images: ['/og-image.png'], }, diff --git a/src/app/not-found.tsx b/src/app/not-found.tsx index 2abd986..0b26d6e 100644 --- a/src/app/not-found.tsx +++ b/src/app/not-found.tsx @@ -9,7 +9,7 @@ export default function NotFound() {

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() {
- © {year} {env.siteName}. Headlines synthesized from public news feeds. + © {year} {env.siteName}. Briefs compiled from public news feeds. All rights to original content remain with the respective publishers.
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"] }