paulca / paulca.com Public

Clone
git clone https://amadan.net/paulca/paulca.com

Plain git — no account needed to clone.

1<!DOCTYPE html>
2<html lang="en">
3<head>
4<meta charset="utf-8">
5<meta name="viewport" content="width=device-width, initial-scale=1">
6<title>Prompt &amp; carbon ledger &mdash; Paul Campbell</title>
7<link rel="icon" href="/icon.png" type="image/png">
8<link rel="icon" href="/icon.svg" type="image/svg+xml">
9<link rel="alternate" type="application/rss+xml" title="Paul Campbell" href="/feed.xml">
10</head>
11<body>
12
13<h1>Prompt &amp; carbon ledger</h1>
14
15<p>The initial version of this site was set up by
16<a href="https://claude.com/claude-code">Claude Code</a> (model: Claude
17Fable&nbsp;5). The plan for ongoing maintenance is to use open-source models
18running on private hardware. Nothing here was written by hand except the
19prompts below. Each row records an instruction given to an agent, which model
20did the work, what came of it, and a rough estimate of the energy and carbon
21the AI work cost. Newest first.</p>
22
23<table border="1" cellpadding="6">
24<tr>
25 <th>Date</th>
26 <th>Model</th>
27 <th>Prompt (verbatim)</th>
28 <th>What happened</th>
29 <th>Est. energy</th>
30 <th>Est. CO&#8322;e</th>
31 <th>Roughly equivalent to</th>
32</tr>
33<tr>
34 <td>August 16, 2026</td>
35 <td>Claude Opus 5 (Claude Code)</td>
36 <td>&quot;Can we move this repo's git hosting to amadan.net/paulca/paulca.com&quot;</td>
37 <td><p>Moved the repo's home to <a href="https://amadan.net/paulca/paulca.com">amadan</a>:
38created the public repo, pushed <code>main</code> and the <code>off-the-grid-cardon</code> branch,
39and made amadan <code>origin</code>. GitHub stays as a second remote named <code>github</code>,
40because GitHub Pages is still what serves the live site — so every push now
41goes to both. Updated <code>AGENTS.md</code> and <code>README.md</code> to say so, repointed the
42homepage's &quot;Last updated&quot; link at amadan, and reworded the publishing FAQ.</p>
43</td>
44 <td>~6 Wh</td>
45 <td>~2.4 g</td>
46 <td>Boiling about a tablespoon of water</td>
47</tr>
48<tr>
49 <td>August 1, 2026</td>
50 <td>Claude Sonnet 5 (Claude Code)</td>
51 <td>&quot;Can you fix the duplication in the last blog post?&quot;</td>
52 <td><p>The body of <code>src/blog/ai-as-accessibility.md</code> had been pasted in twice; removed
53the duplicate copy, rebuilt, and confirmed the RSS feed and page no longer
54repeat the post.</p>
55</td>
56 <td>~2 Wh</td>
57 <td>~0.8 g</td>
58 <td>A minute of a laptop charger idling</td>
59</tr>
60<tr>
61 <td>July 30, 2026</td>
62 <td>Qwen3-Coder 35B (Ollama)</td>
63 <td>&quot;What did we do so far?&quot; ... followed by the full raw text draft of a blog post titled 'AI as accessibility'</td>
64 <td><p>Created <code>src/blog/ai-as-accessibility.md</code> with exact frontmatter and body, rebuilt, and added this ledger entry. The post will publish when committed to <code>main</code>.</p>
65</td>
66 <td>~4 Wh</td>
67 <td>~1.6 g</td>
68 <td>Charging a tablet for half an hour</td>
69</tr>
70<tr>
71 <td>July 29, 2026</td>
72 <td>Qwen3.6 35B (Ollama)</td>
73 <td>&quot;The title is repeated in the post. Just remove that first line and it will be perfect.&quot;</td>
74 <td><p>Removed the duplicated title line from the Glen Hansard blog post.</p>
75</td>
76 <td>~2 Wh</td>
77 <td>~0.8 g</td>
78 <td>Leaving a laptop running for about 10 minutes</td>
79</tr>
80<tr>
81 <td>July 29, 2026</td>
82 <td>Qwen3-Coder 30B (Ollama)</td>
83 <td>&quot;Create a blog post about Glen Hansard memories based on a Mastodon thread.&quot;</td>
84 <td><p>Created a new blog post about Glen Hansard memories based on a Mastodon thread.</p>
85</td>
86 <td>~2 Wh</td>
87 <td>~0.8 g</td>
88 <td>about the same as charging a smartphone for a few minutes</td>
89</tr>
90<tr>
91 <td>July 26, 2026</td>
92 <td>Claude Fable 5</td>
93 <td>“Can I get: an automatically generated RSS feed by Eleventy? A <code>.text</code> version that just shows the post in plain markdown e.g. https://paulca.com/blog/ai-as-augmentation.text”</td>
94 <td><p>Added an RSS feed at <a href="/feed.xml">/feed.xml</a> via the official Eleventy RSS
95plugin, and a plain-Markdown twin for every post: <code>/blog/&lt;slug&gt;.text</code>
96serves the post's source. Both generate automatically at build time, so
97adding a post keeps needing nothing beyond the Markdown file.</p>
98</td>
99 <td>~8 Wh</td>
100 <td>~3.2 g</td>
101 <td>Four hours of a doorbell transformer</td>
102</tr>
103<tr>
104 <td>July 26, 2026</td>
105 <td>Qwen3-Coder 30B (Ollama)</td>
106 <td>&quot;Below 'Email: paul@rslw.com', add 'Keymail: paul@keymail.dev'&quot;</td>
107 <td><p>Added Keymail contact link to the homepage.</p>
108</td>
109 <td>~4 Wh</td>
110 <td>~1.6 g</td>
111 <td>Boiling a cup of tea</td>
112</tr>
113<tr>
114 <td>July 26, 2026</td>
115 <td>Qwen3-Coder 30B (Ollama)</td>
116 <td>&quot;Continue the blog post about using an LLM 'off-the-grid' with updated content reflecting AI augmentation insights and local open-source model usage.&quot;</td>
117 <td><p>Refined the existing blog post by removing outdated references, integrating reflections on AI as augmentation (particularly how Claude Code + Opus enabled complex webhook feature delivery at Tito), and adding context about running open source models locally for data sovereignty. The update shifted tone from initial hype to practical productivity, while preserving Paul's authentic voice about OpenAI concerns and local GPU capabilities.</p>
118</td>
119 <td>~4 Wh</td>
120 <td>~1.6 g</td>
121 <td>A few minutes of a smartphone charging</td>
122</tr>
123<tr>
124 <td>July 26, 2026</td>
125 <td>Qwen3-Coder 30B (Ollama)</td>
126 <td>&quot;Write a blog post about AI as augmentation with the provided content.&quot;</td>
127 <td><p>Created blog post: &quot;AI as augmentation&quot; - Paul's reflections on how AI assistance enables better iteration and closure of the gap between intention and execution, using Tito's webhook implementation as a case study.</p>
128</td>
129 <td>~4 Wh</td>
130 <td>~1.6 g</td>
131 <td>A few minutes of a smartphone charging</td>
132</tr>
133<tr>
134 <td>July 25, 2026</td>
135 <td>Claude Fable 5</td>
136 <td>“Somehow this one got attributed to tomorrow”</td>
137 <td><p>The “Switching from Claude to GPT‑OSS” entry was future-dated July 26 by
138the model that wrote it; the commit actually landed on July 25 at 21:56.
139Renamed the entry file to the real date, restoring true chronological
140order. <code>AGENTS.md</code> now tells agents to get the date from <code>date +%F</code>
141instead of guessing.</p>
142</td>
143 <td>~3 Wh</td>
144 <td>~1.2 g</td>
145 <td>Fifteen minutes of a tablet charging</td>
146</tr>
147<tr>
148 <td>July 25, 2026</td>
149 <td>Claude Fable 5</td>
150 <td>“Agent said it updated the prompt ledger, but I don't see the update on https://paulca.com/ai.html”</td>
151 <td><p>Qwen3‑Coder pushed its ledger entry's source file but staged it alone, so
152<code>docs/</code> — the only directory GitHub Pages serves — kept the old ledger.
153Claude rebuilt and pushed the missing output, corrected the entry below
154(it had credited GPT‑OSS for Qwen's work, and under-counted at 0.4 Wh),
155and sharpened the instructions that failed.</p>
156</td>
157 <td>~4 Wh</td>
158 <td>~1.6 g</td>
159 <td>An hour of an electric toothbrush on its charger</td>
160</tr>
161<tr>
162 <td>July 25, 2026</td>
163 <td>Qwen3-Coder 30B (Ollama)</td>
164 <td>&quot;Add an FAQ entry 'Am I evil?' and the answer is 'Clearly, but I try not to be.'&quot;</td>
165 <td><p>Added a new FAQ entry to the site.</p>
166</td>
167 <td>~2 Wh</td>
168 <td>~0.8 g</td>
169 <td>Four seconds of a kettle</td>
170</tr>
171<tr>
172 <td>July 25, 2026</td>
173 <td>qwen3-coder:30b (opencode)</td>
174 <td>“Can you update the prompt ledger?”</td>
175 <td><p>Updating the prompt ledger with this session's work.</p>
176</td>
177 <td>~2 Wh</td>
178 <td>~0.8 g</td>
179 <td>A few minutes of a smartphone charging</td>
180</tr>
181<tr>
182 <td>July 25, 2026</td>
183 <td>Claude Fable 5</td>
184 <td>“One more: Add an FAQ section, and instructions for adding to the FAQ, then I'll ask pi/gptoss or opencode/qwen-coder to add some FAQ entries, which should also be Markdown files.”</td>
185 <td><p>The FAQ now works like the ledger: one Markdown file per question in
186<code>src/faq/</code>, assembled into <a href="/faq/">/faq/</a> in filename order by Eleventy.
187The five existing questions became the first five files, and <code>AGENTS.md</code>
188gained a recipe for adding a question.</p>
189</td>
190 <td>~8 Wh</td>
191 <td>~3.2 g</td>
192 <td>Twenty minutes of an idle games console</td>
193</tr>
194<tr>
195 <td>July 25, 2026</td>
196 <td>Claude Fable 5</td>
197 <td>“Yeah, do all of those. I am wondering if a PR on this particular repo is necessary, given that I'm the only one working on it…” — deciding, in the end, to drop the pull-request ceremony altogether.</td>
198 <td><p>Backfilled the entry below, closed the “hand-edit” loophole in <code>AGENTS.md</code>
199(a model editing files with its own tools is AI work, full stop), and
200simplified the workflow: agents now commit straight to <code>main</code> — no branches,
201no pull requests — since builds are verified locally and Paul reviews the
202live site anyway.</p>
203</td>
204 <td>~8 Wh</td>
205 <td>~3.2 g</td>
206 <td>Two hours of a 4 W nightlight</td>
207</tr>
208<tr>
209 <td>July 25, 2026</td>
210 <td>GPT-OSS (RTX 3090)</td>
211 <td>(Logged after the fact; the exact wording wasn't recorded.) Paul asked the pi agent to link the “Last updated” footer to the GitHub repo.</td>
212 <td><p>GPT‑OSS linked the homepage footer to
213<a href="https://github.com/paulca/paulca.com">github.com/paulca/paulca.com</a>,
214correctly editing both source and built output — then told Paul the change
215was a “hand-edit” that didn't need a ledger entry. It wasn't, and it did;
216Claude logged it here afterwards.</p>
217</td>
218 <td>~2 Wh</td>
219 <td>~0.8 g</td>
220 <td>An hour of a smart speaker on standby</td>
221</tr>
222<tr>
223 <td>July 25, 2026</td>
224 <td>Claude Fable 5</td>
225 <td>“Can you update the prompt ledger to include the model, and update instructions for pi to include the model if it adds to it too? Should we use Markdown for each ledger entry and compile it with Eleventy?”</td>
226 <td><p>Added the Model column, and yes: the ledger is now one small Markdown file
227per entry in <code>src/ledger/</code>, compiled by Eleventy. Appending an entry can no
228longer corrupt the ones before it, two agents adding entries can't conflict,
229and there's no JSON quote-escaping to trip over. <code>AGENTS.md</code> updated to
230match.</p>
231</td>
232 <td>~10 Wh</td>
233 <td>~4 g</td>
234 <td>A minute of a hairdryer</td>
235</tr>
236<tr>
237 <td>July 25, 2026</td>
238 <td>Claude Fable 5</td>
239 <td>“Maybe we should add an 80ch limit so that it's a bit easier to read?”</td>
240 <td><p>Put a single <code>max-width:80ch</code> inline style on the post template's
241<code>&lt;article&gt;</code> — a line-length cap, no centering — and updated <code>AGENTS.md</code> to
242match.</p>
243</td>
244 <td>~4 Wh</td>
245 <td>~1.6 g</td>
246 <td>Ten minutes of a 25 W monitor</td>
247</tr>
248<tr>
249 <td>July 25, 2026</td>
250 <td>Claude Fable 5</td>
251 <td>“Lose it. The pi post worked great.” — “it” being the one inline style left on the post template.</td>
252 <td><p>Removed the <code>style</code> attribute from the <code>&lt;article&gt;</code> in the post template.
253Blog posts now render with browser default styles only, like everything
254else. Also backfilled the entry below.</p>
255</td>
256 <td>~4 Wh</td>
257 <td>~1.6 g</td>
258 <td>Three minutes of a 75 W ceiling fan</td>
259</tr>
260<tr>
261 <td>July 25, 2026</td>
262 <td>GPT-OSS (RTX 3090)</td>
263 <td>(Logged after the fact; the exact wording wasn't recorded.) Paul asked the pi agent to fix two typos in the first blog post.</td>
264 <td><p>The local GPT‑OSS model's first solo change: “ben” → “been” and “closet” →
265“closest” (plus an added “a”) in the blog post, rebuilt and pushed. It forgot
266to log itself here, so Claude added this entry afterwards.</p>
267</td>
268 <td>~2 Wh</td>
269 <td>~0.8 g</td>
270 <td>Two minutes of an RTX 3090 idling</td>
271</tr>
272<tr>
273 <td>July 25, 2026</td>
274 <td>Claude Fable 5</td>
275 <td>“I want to set up a blog and an FAQ on this site. I want to be able to add to the blog using gpt-oss in the pi harness, so I want to end up with instructions that will allow it to: add a blog post in md format, make any tweaks, build the site, open and merge a PR on GitHub, update the prompt and carbon ledger. I think using 11ty would make all this easier, but building locally rather than build on push.” — plus follow-ups on keeping posts style-free and wording this ledger's introduction.</td>
276 <td><p>Rebuilt the site on <a href="https://www.11ty.dev/">Eleventy</a>: blog posts are now
277Markdown files in <code>src/blog/</code>, a FAQ lives at <a href="/faq/">/faq/</a>, this ledger is
278generated from data with the running total computed at build time, and
279<code>AGENTS.md</code> gives any agent step-by-step instructions for publishing a post,
280opening and merging the PR, and logging it here. The built site is committed
281to <code>docs/</code>; every old URL still works.</p>
282</td>
283 <td>~40 Wh</td>
284 <td>~16 g</td>
285 <td>An hour of a 40 W desk fan</td>
286</tr>
287<tr>
288 <td>July 25, 2026</td>
289 <td>GPT-OSS (RTX 3090)</td>
290 <td>“Switching from Claude to GPT-OSS on my gaming rig in the home office.”</td>
291 <td><p>Switched to a local open‑source LLM running on an RTX 3090 GPU. No data
292leaves home and energy per prompt is roughly 2 Wh.</p>
293</td>
294 <td>~2 Wh</td>
295 <td>~0.8 g</td>
296 <td>A half-hour of a 5 W LED bulb</td>
297</tr>
298<tr>
299 <td>July 25, 2026</td>
300 <td>Claude Fable 5</td>
301 <td>“Remove all the formatting. Just use semantic HTML tags. I don't want any formatting.”</td>
302 <td><p>Stripped the blog post of every CSS class, stylesheet link, Stimulus
303controller, and <code>&lt;em&gt;</code>/<code>&lt;strong&gt;</code> formatting — just bare <code>&lt;article&gt;</code>, <code>&lt;p&gt;</code>,
304<code>&lt;a&gt;</code>.</p>
305</td>
306 <td>~5 Wh</td>
307 <td>~2 g</td>
308 <td>Four minutes of a smartphone charging</td>
309</tr>
310<tr>
311 <td>July 25, 2026</td>
312 <td>Claude Fable 5</td>
313 <td>“Can the post get a back link to the homepage?”</td>
314 <td><p>Added a plain <code>&lt;nav&gt;</code> with a “← Home” anchor at the top of the post.</p>
315</td>
316 <td>~3 Wh</td>
317 <td>~1 g</td>
318 <td>Ten seconds of an e-bike motor</td>
319</tr>
320<tr>
321 <td>July 25, 2026</td>
322 <td>Claude Fable 5</td>
323 <td>“Let's add a &quot;blog post&quot; to the &quot;Writing&quot;” — and I wrote the wording.</td>
324 <td><p>Publishing Paul's first proper blog post: “Using an LLM ‘off-the-grid’”.
325Also added a link under the Writing section on the index page.
326<em>(Committed as <a href="https://github.com/paulca/paulca.com/commit/aa30a29">aa30a29</a>)</em></p>
327</td>
328 <td>~15 Wh</td>
329 <td>~6 g</td>
330 <td>A full phone charge, then a little more</td>
331</tr>
332<tr>
333 <td>July 21, 2026</td>
334 <td>Claude Fable 5</td>
335 <td>“Prompts should be sorted bottom up not top down”</td>
336 <td><p>Reversed the table: newest entries now sit at the top. About 5 model
337invocations.</p>
338</td>
339 <td>~5 Wh</td>
340 <td>~2 g</td>
341 <td>Ten minutes of a 30 W laptop</td>
342</tr>
343<tr>
344 <td>July 21, 2026</td>
345 <td>Claude Fable 5</td>
346 <td>“ALong with Est. energy and Est. CO₂e, can we have a column that does a random comparison like the ‘boiling water’ comparison?”</td>
347 <td><p>Added this column. About 6 model invocations.</p>
348</td>
349 <td>~6 Wh</td>
350 <td>~2.5 g</td>
351 <td>45 minutes of a home Wi-Fi router</td>
352</tr>
353<tr>
354 <td>July 21, 2026</td>
355 <td>Claude Fable 5</td>
356 <td>Quoting this page's method section — “&gt; Anthropic doesn't publish per-request energy figures” — “Anthropic, in their cowardice, doesn't”.</td>
357 <td><p>Sharpened the editorial line below. About 5 model invocations.</p>
358</td>
359 <td>~5 Wh</td>
360 <td>~2 g</td>
361 <td>Half a kilometre on an e-bike</td>
362</tr>
363<tr>
364 <td>July 21, 2026</td>
365 <td>Claude Fable 5</td>
366 <td>Four short follow-ups while waiting on the HTTPS certificate, ending with “Oh, it's done”.</td>
367 <td><p>Pointed Paul at the GitHub Pages settings page (he pressed “Check”, which
368unstuck certificate provisioning), supplied DNS verification commands, then
369enabled HTTPS enforcement and verified every URL against the Pages edge.
370About 15 model invocations.</p>
371</td>
372 <td>~15 Wh</td>
373 <td>~6 g</td>
374 <td>One full phone charge</td>
375</tr>
376<tr>
377 <td>July 21, 2026</td>
378 <td>Claude Fable 5</td>
379 <td>“Can I add a prompt and carbon-use ledger to this site?”</td>
380 <td><p>Added this page. About 8 model invocations.</p>
381</td>
382 <td>~8 Wh</td>
383 <td>~3 g</td>
384 <td>35 seconds of an 800 W microwave</td>
385</tr>
386<tr>
387 <td>July 21, 2026</td>
388 <td>Claude Fable 5</td>
389 <td>“Put Mastodon https://mastodon.social/@paulca above BlueSky, lose Twitter.”</td>
390 <td><p>Reordered the links on the home page. About 6 model invocations.</p>
391</td>
392 <td>~6 Wh</td>
393 <td>~2.5 g</td>
394 <td>An hour of a 6 W LED bulb</td>
395</tr>
396<tr>
397 <td>July 21, 2026</td>
398 <td>Claude Fable 5</td>
399 <td>“I want to replace paulca.com with a static site, default browser styles, like those old original sites that college professors used to have. It will just be a short bio, and link out to various profiles that I have. Let's capture a static copy of the microblog that's there already, and host it on GitHub pages. I think you have all the access on GitHub and DNSimple required to make it happen.”</td>
400 <td><p>Mirrored the Pterodon microblog (113 posts plus replies), built this site,
401created the <a href="https://github.com/paulca/paulca.com">paulca/paulca.com</a> repo,
402enabled GitHub Pages, and switched DNS from the old Rails server to GitHub
403Pages. About 40 model invocations.</p>
404</td>
405 <td>~40 Wh</td>
406 <td>~16 g</td>
407 <td>Charging a phone from flat, three times over</td>
408</tr>
409</table>
410
411<p><b>Running total:</b> ~235 Wh,
412~94 g CO&#8322;e &mdash;
413a bit more than the energy it takes to boil two litres of water, or the emissions of driving a petrol car about half a kilometre.</p>
414
415<h2>Method</h2>
416
417<p>Anthropic, in their cowardice, doesn't publish per-request energy figures, so these are
418order-of-magnitude estimates, not measurements. The arithmetic:
419<i>(model invocations in the session) &times; 1&nbsp;Wh per invocation &times;
420400&nbsp;g CO&#8322;e per kWh</i> (a rough global-average grid intensity). Published
421measurements for single chat queries are around 0.24&ndash;0.33&nbsp;Wh
422(Google's 2025 Gemini disclosure); 1&nbsp;Wh per invocation is deliberately
423generous because agentic coding calls carry much longer contexts than chat.
424For open-source models running on local hardware, the estimate is
425~2&nbsp;Wh per prompt instead, based on the power draw of the GPU doing the
426work. Training-run amortisation, network transfer, and this page being served
427are not counted. Treat every number as right to within a factor of ten, at
428best.</p>
429
430<p>The ledger is append-only: each time an agent works on this site, it adds a
431Markdown file to <code>src/ledger/</code> and rebuilds; this page and the
432running total are generated from those files.</p>
433
434<hr>
435
436<p><a href="/">Home</a></p>
437
438
439</body>
440</html>
441