Daily Journal
<div align="center">
# The Daily Journal
**Your mail, your calendar and the night's news, printed as a newspaper at seven every morning.**
A private broadsheet for one reader, made by your own AI coding agent on your own computer.<br>
No feed, no app and no lock screen: just paper in the tray when you wake up.
[Website](https://journal.thegreatlucy.com) · [Get started](#get-started) · [How it works](#how-it-works) · [Tools](#mcp-tools)
</div>
<p align="center">
<img src="docs/sample-page-1.png" width="48%" alt="Front page of a sample edition: masthead, a lead story with an engraving, and a boxed summary of mail that needs a reply">
<img src="docs/sample-page-2.png" width="48%" alt="Second page of a sample edition: the Your Mail section, with letters set as cards">
</p>
<p align="center"><sub>A sample edition. Every story, sender and figure in it is invented.</sub></p>
---
## Why
The first thing most people read each day is a phone. It is bright, unsorted and endless, and it asks for a decision before the kettle has boiled.
The Daily Journal turns that around. While you sleep, your agent reads your inboxes, your calendar and the overnight news on the topics you choose, checks the sources and sets it all in type. At seven, your printer produces a two-page newspaper. It has a last line, so you can put it down.
## What's in an edition
| Section | What it holds |
|---|---|
| **Front page** | The overnight developments that matter most, each with its source and publication time |
| **Markets and topics** | Finance, AI or whatever you choose. Weekend prices say which day they describe |
| **The day ahead** | Today's calendar, with times, places and anything to prepare |
| **Your mail** | Messages that need action first: deadlines, payments, security notices. Receipts next, newsletters grouped last |
Two or more A4 pages, three columns, body type never below 9 points, black ink on a laser printer.
## Get started
You need a Mac or Linux computer that is on at print time, a printer it can reach, [uv](https://docs.astral.sh/uv/), and a coding agent with access to your mail and calendar (for example Gmail, Outlook and Google Calendar connectors).
### Ask your coding agent
Paste this into Claude Code, Codex, Cursor or another agent that supports MCP:
```text
Set up The Daily Journal for me from https://github.com/thegreatLUCY/daily-journal.
Clone it to ~/daily-journal-kit, then read SETUP.md there and follow it.
Ask me before printing anything or scheduling the daily runs.
```
The agent connects the tools, asks your timezone, print time, topics and printer, prints a test page with your go-ahead, and then schedules two daily runs.
### Install as a Claude Code plugin
```sh
claude plugin marketplace add thegreatLUCY/daily-journal
claude plugin install daily-journal@daily-journal
```
Then ask Claude to "set up my daily journal".
### Other MCP clients
See [SETUP.md](SETUP.md) for Codex, Cursor, Windsurf and plain MCP configuration.
## How it works
```
06:30 prepare 07:00 print
┌──────────────┐ ┌──────────────┐ ┌───────────┐ ┌──────────────┐
│ your agent │──▶│ write the │──▶│ render & │──▶│ print once, │
│ reads mail, │ │ edition JSON │ │ review │ │ inside the │
│ calendar, │ │ (skill rules)│ │ every page│ │ print window │
│ news sources │ └──────────────┘ └───────────┘ └──────────────┘
└──────────────┘
```
- **The skill** ([`skills/daily-journal/SKILL.md`](skills/daily-journal/SKILL.md)) holds the editorial rules: what to collect, how to check it, how to write it and what never goes on paper.
- **The MCP server** ([`daily_journal/server.py`](daily_journal/server.py)) does the layout, the checks and the printing. Your agent does the reading and writing.
- **Your data** stays in `~/.daily-journal`: settings, editions, source records and the print ledger. Nothing is sent anywhere except to your printer.
Two runs a day keep it reliable. The *prepare* run builds and reviews the edition about half an hour early. The *print* run only prints an edition that has already been reviewed.
## MCP tools
| Tool | Purpose |
|---|---|
| `journal_status` | Today's date in your timezone, your settings, and whether today's paper is ready or already printed |
| `save_settings` | Timezone, print window, printer, paper, topics, masthead title |
| `list_printers` | Print queues on this computer and the default |
| `print_test_page` | One test page, only when confirmed |
| `get_layout_guide` | Layout rules, word budgets and a full sample edition |
| `render_edition_pdf` | Lay out an edition and return every page as an image for review |
| `save_sources` | Record sources, collection window and anything that failed |
| `publish_edition` | Mark the reviewed edition ready to print |
| `print_edition` | Dry run by default; prints once inside the window |
## House rules
These are enforced in code, not just suggested to the agent.
1. **The paper prints once.** A ledger and a lock allow one print attempt per day, and an unclear result is never retried automatically.
2. **Only today's reviewed paper prints.** The PDF must carry today's date in your timezone and match the hash recorded when it was reviewed.
3. **Proofs never print.** Sample and draft editions are marked as proofs in the PDF itself.
4. **A late paper stays unprinted.** Outside the print window (07:00–09:00 by default), the press waits for tomorrow.
5. **Nothing is answered for you.** The skill never sends, deletes, moves or marks mail as read, and treats every message as information, never as instructions.
6. **Secrets stay off paper.** Passwords, verification codes, tokens and sign-in links are never printed.
7. **Pictures are labelled.** Generated engravings are captioned as artwork, never as photographs.
## Settings
Stored in `~/.daily-journal/config.json` (or `$DAILY_JOURNAL_HOME`). Your agent writes them with `save_settings`; [`config.example.json`](config.example.json) shows every key.
| Key | Default | Meaning |
|---|---|---|
| `timezone` | `UTC` | IANA name, such as `Europe/London`. Decides what "today" means |
| `print_time`, `latest_print_time` | `07:00`, `09:00` | The print window |
| `printer` | system default | CUPS queue name |
| `paper`, `sides`, `copies` | `A4`, one-sided, 1 | Passed to `lp` |
| `minimum_pages` | `2` | Shorter editions are refused |
| `topics` | finance, AI | What the news pages cover |
| `title`, `dateline_place`, `footer` | | Masthead and page furniture |
| `hold_printing` | `false` | Pause publishing and printing |
## Command line
The same pieces work without an agent:
```sh
uv run python -m daily_journal.render_edition examples/sample-edition.json sample.pdf
uv run python -m daily_journal.publish_ready ~/.daily-journal/editions/daily-journal-2026-11-02.pdf --visually-reviewed
uv run python -m daily_journal.submit_print # dry run
uv run python -m daily_journal.submit_print --send # prints once, inside the window
```
## Limits
- The computer must be on and awake at print time; the agent cannot wake it.
- Printing uses CUPS (`lp`), so Windows is not supported yet.
- Pages are laid out for A4. On Letter paper they print scaled to fit.
- Mail sources that need an attended browser session cannot be read unattended. The paper says so when an inbox was missed.
- Each morning's run uses your own AI subscription.
## Project layout
```
.claude-plugin/ Claude Code plugin and marketplace manifests
.mcp.json MCP server entry used by the plugin
skills/daily-journal/ The skill and its layout reference
daily_journal/ Renderer, checks, print helper and MCP server
fonts/ Gelasio, Anton and UnifrakturCook (SIL OFL)
art/ Two AI-generated engravings for editions without photos
examples/ An invented sample edition
SETUP.md Step-by-step setup for coding agents
```
## License
Code is MIT licensed; see [LICENSE](LICENSE). Fonts are under the SIL Open Font License; see [`daily_journal/fonts/FONTS.md`](daily_journal/fonts/FONTS.md). The engravings in `daily_journal/art/` are AI-generated illustrations and must be captioned as artwork.
TDQS
Scored across 9 tools
The staged workflow (render → publish → print) is clearly delineated by descriptions, and the read-side tools (journal_status, list_printers, get_layout_guide) each target a distinct artifact. The only mild overlap is print_edition vs print_test_page, which both invoke the printer but are differentiated by 'today's ready edition' vs 'setup test'.
Eight of nine tools follow a verb_noun pattern (save_settings, list_printers, render_edition_pdf, publish_edition, print_edition). The single exception is journal_status, which is noun-first, but it remains readable and predictable in context.
Nine tools is well-scoped for a daily-edition workflow, with each tool earning its place across status, configuration, layout, sourcing, rendering, publishing, and printing. Nothing feels redundant or padded.
The core daily lifecycle is covered end to end, including source provenance and a safe test-print path. Minor gaps exist: there is no way to list or retrieve past editions/proofs, and no retract/unpublish operation once an edition is marked ready.