iArt.ai
AI 모션 그래픽 소프트웨어, 누구나 사용할 수 있는 After Effects 대안, 텍스트 프롬프트로 몇 분 안에 애니메이션·설명 영상 제작
The Optimist는 AI가 재작성한 실험입니다 Guardian News & Media와는 관련 없으며 사실은 그대로이고 표현만 바뀝니다
The Optimist is an AI-rewritten experiment. Not affiliated with Guardian News & Media. Facts unchanged, framing changed.
미디어TypeScript · HTMLGitHub @mlangsman온라인운영자 미확인
써 보셨어요? 한 번만 눌러 주세요. 로그인은 필요 없어요.
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기The Optimist - An online newspaper, using AI to rewrite high quality journalism from a respected source with a more positive angle whilst maintaing factual accuracy and tone of voice.
저장소 README에서 가져옴
README 전체를 불러오는 중입니다. 아래는 저장된 발췌입니다.
A daily mirror of the Guardian's UK front page, rewritten with an optimistic point of view. Every fact, figure, quote and name is kept; only the framing changes. A personal, non-commercial experiment in editorial tone.
Not affiliated with Guardian News & Media. Article text is adapted from Guardian journalism under the Open Platform developer terms, with attribution and a link to the original on every article page. Bylines are pseudonymised; the real byline appears in the attribution line.README 전문 보기 ↗A daily mirror of the Guardian's UK front page, rewritten with an optimistic point of view. Every fact, figure, quote and name is kept; only the framing changes. A personal, non-commercial experiment in editorial tone.
Not affiliated with Guardian News & Media. Article text is adapted from Guardian journalism under the Open Platform developer terms, with attribution and a link to the original on every article page. Bylines are pseudonymised; the real byline appears in the attribution line.
Guardian front page (HTML) ──► fetch ──► raw.json
Guardian Content API ──┘ │
context ──► context.json (earlier Guardian coverage)
│
jobs ──► jobs.json
│
rewrite engine (one of two) ▼
• claude-code: Claude Code does it results.json ◄──┐
• api: Anthropic Message Batches │ │
tone ──► tone.json │
check ──► check.json │
│ │
revise ─────┴───────────┘ (until clean)
│
assemble ──► site.json → data/latest.json
│
astro build ──► GitHub Pages
jobs.json and writes results.json. Anything that honours that contract is an engine. scripts/rewrite-api.ts is the reference implementation on the Anthropic API (Sonnet 5 via the Batch API, structured outputs, prompt caching). The daily run uses Claude Code itself as the engine, on a scheduled cloud routine, so there is no API bill.scripts/tone.ts is a mechanical lint with no model behind it. It fails the run on an unchanged or cosmetically edited headline where the original carried a setback ("warns" swapped for "says" and nothing else moved), on a rewritten headline still centred on a word of loss, harm, threat or fear, and on any preview with no rewrite at all. It warns on a headline whose subject or object is the setback itself (cuts, delay, wait, surge, closure and the like) and on a score that contradicts the copy (a 0 with a "What's being done" line, a 3 built on doom). Quotations and house-style compounds such as "climate crisis" are exempt.scripts/check.ts runs two model reviewers on each pair: a fact check (Haiku, thinking off) that demotes anything with an unsupported or altered claim, and a tone review (Sonnet, low effort) that judges the copy against prompts/rewrite.md as an editor would, and writes notes for the writer.scripts/revise.ts sends every rewrite that failed a review back to the rewriter with the previous attempt and the notes, then check.ts --only=failed and tone.ts run again. Loop until clean. The daily routine does the same loop, with the reviews run in separate subagents so the writer never grades its own copy.data/<date>/drop.json (optional) maps content paths to a reason; scripts/assemble.ts leaves those stories out of the front page, article pages and related rails. The daily routine fills it with the stories too bleak for the paper to run.upside score (0–3) from the engine; an article's score, judged from its whole body, is the one its card uses. assemble ranks the cards in each container by it, strongest first, with the Guardian's order breaking ties, and then holds the front to a floor: a card scoring 0 never runs, on the front or in a related rail, and a card scoring 1 runs only beneath a card scoring 2 or more in the same container, never in the highlights strip. A story with no honest upside is left out rather than strained; the brief says so in as many words.fetch also runs one Content API search for recent stories from constructive sections (raw.candidates). The engine picks the genuinely good news into data/<date>/going-right.json; jobs gives each a preview job and assemble shows them as a container straight after the News block.progress line naming who is acting and how, built only from the copy and fact-checked with the rest. It runs under a "What's being done" label at the top of each article.scripts/context.ts runs one Content API search per News article, on its keyword tags, for recent Guardian pieces on the same story, and stores each with an excerpt of its opening (data/<date>/context.json). The engine may add one context line, 10–30 words, built only from one item's excerpt and citing its URL; it runs under the progress line with a link to the piece, and the fact check verifies it against the excerpt. The headline, standfirst and body never draw on it. Nothing comes from the open web: every fact on the site is checkable against Guardian copy under the same terms.prompts/rewrite.md holds the editorial rules: analyse each story for its upsides, build the headline entirely on the strongest one, move the setback to the standfirst, keep headlines short (eight to 12 words, 14 at most) and about people and outcomes, keep Guardian house style, never invent a fact, never make a cosmetic edit, and score a weak response (a postponed review, a call for action, a report that only sizes a problem) honestly rather than stretching it into a headline.cp .env.example .env # add GUARDIAN_API_KEY (and ANTHROPIC_API_KEY for the api engine)
npm install
npm run fetch # data/<today>/raw.json (--front-only needs no key)
npm run context # data/<today>/context.json (optional; earlier Guardian coverage per News article)
npm run jobs # data/<today>/jobs.json
npm run rewrite:api # data/<today>/results.json (or produce it with another engine)
npm run tone # data/<today>/tone.json (no key needed; exits 1 on errors)
npm run check # data/<today>/check.json (facts + tone; --no-tone for facts only)
npm run revise # re-run the failures with the reviewers' notes, then:
npm run check -- --only=failed && npm run tone
npm run assemble # data/<today>/site.json + data/latest.json
npm run build # dist/
npm test runs the unit tests (front-page parser, bylines, sanitiser, request builders). npm run dev previews the site; without data/latest.json it renders data/fixture/site.json.
| Path | What |
|---|---|
scripts/ | Pipeline CLIs and their libraries (lib/front.ts parser, lib/guardian-api.ts client, lib/bylines.ts, lib/sanitise.ts, lib/anthropic.ts, lib/tone.ts lint, lib/check-prompt.ts review prompts) |
prompts/rewrite.md | The system prompt every engine uses |
src/lib/types.ts | The data contract shared by pipeline and site |
src/ | Astro site: pages, components, styles (Guardian design tokens from @guardian/source) |
data/ | One folder per day plus latest.json; the site builds from latest.json only |
routine/ | Instructions for the scheduled Claude Code run |
Names are spoonerised (Marina Hyde → Harina Myde). Where the swap does not read cleanly, a deterministic stock name is used instead, so the same journalist always maps to the same alias. Agency bylines pass through unchanged.
The Guardian's typefaces are proprietary. The site uses free lookalikes by default; the font stacks live in one place in src/styles/tokens.css.