Skip to main content

Hermes Journal Writer

@webframp/hermes-journal-writerv2026.08.28.1· 17d agoMODELS
01README

Journal Writer — reads research-collector data from the swamp catalog and writes org-mode journal entries to ~/org/journal/. Commits and pushes to the org repo so entries become part of your living knowledge store.

Methods

  • write_daily_entry — Writes a daily research summary to ~/org/journal/YYYY-MM-DD-dow.org with property drawer, source links, and summaries from HN, Lobste.rs, SRE Weekly, IFIN, and RedMonk.
02Release Notes

2026.08.28.1

Changed: Normalized the extension license to Apache-2.0 and corrected the copyright holder to "Sean Escriva". Extensions that previously shipped an MIT LICENSE.md are now Apache-2.0, consistent with the repository root and every other extension. No code or behavioral changes.

Upgrade note: License text only. No API, schema, or runtime behavior changed.

2026.08.26.3

Fixed: Restored inline npm:zod@4.4.3 import specifiers so the registry quality scorer can resolve dependencies and score the extension. An earlier release used a bare "zod" import-map specifier, which published but scored as unscored.

Changed: Retained explicit compilerOptions.strict in deno.json. No behavioral or schema changes.

03Models1
@webframp/hermes-journal-writerv2026.08.28.1hermes-journal-writer/hermes_jrnl_writer.ts

Global Arguments

ArgumentTypeDescription
orgDirstringRoot directory of the org repo (supports ~ expansion)
jrnlSubdirstringSubdirectory under orgDir for journal entries
swampBinstringPath to the swamp binary (must be on PATH or specify full path)
repoDirstringPath to the swamp repo directory
gitUserNamestringGit commit user name
gitUserEmailstringGit commit user email
sourcesarrayWhich sources to include in the journal entry. Omit a source name to disable it.
fn write_daily_entry()
Write a daily research journal entry to the org repo with commit/push.

Resources

journalEntry(infinite)— Record of a journal entry
04Previous Versions19
2026.08.26.3

2026.08.26.3

Fixed: Restored inline npm:zod@4.4.3 import specifiers so the registry quality scorer can resolve dependencies and score the extension. An earlier release used a bare "zod" import-map specifier, which published but scored as unscored.

Changed: Retained explicit compilerOptions.strict in deno.json. No behavioral or schema changes.

2026.08.26.1

2026.08.26.1

Fixed: Added missing description field to upgrade entry for version 2026.08.24.2. The omission caused swamp extension pull to fail with a catalog validation error ("upgrades.N.description: Invalid input: expected string, received undefined").

2026.08.24.3

2026.08.24.3

Added: Output metadata attributes for observability.

  • durationMs: Method execution duration in milliseconds.
  • collectedBy: Extension name that produced the data.
  • fetchedAt: ISO 8601 timestamp when data was fetched (added to resources that previously lacked it).
2026.08.24.2

2026.08.24.2

Added Troubleshooting section documenting the idempotent file-exists guard, skipped-no-data status, git push/commit failure degrade paths, default arg mismatches with README, and source output slicing limits.

2026.08.21.1

2026.08.21.1

Changed: Added .describe() documentation to the previously undocumented journalEntry resource schema fields (date, file, status, createdAt). No behavioral change — a no-op upgrades entry was added to keep the model's typeVersion tracking in sync with the version bump.

2026.08.01.1

Fixed: Broken model-upgrade chain. The prior version bump (to 2026.07.27.1) updated version but left the upgrades array terminating one step short, which blocks swamp extension push ("model upgrade chain errors"). That version never actually published — the registry was still serving 2026.07.20.1. This release closes the chain with a no-op upgrade entry and republishes everything that had accumulated since 2026.07.20.1.

2026.07.27.1

Changed: Reformatted files that had drifted from deno fmt. No code behavior changes.

Upgrade note: Tooling and formatting only. No model, method, schema, or behavior change — nothing to do on upgrade.

2026.08.15.1
2026.08.12.8

Use named thematic buckets for Signals to Noise analysis.

2026.08.12.7

Filter HTML entities and generic feed artifacts from Signals to Noise.

2026.08.12.6

Add Signals to Noise analysis as the first journal section.

2026.08.12.5

Add Swamp Club to generated org-mode journal entries.

2026.08.12.4

Add System Design to generated org-mode journal entries.

2026.08.12.3

Add Latent.Space to generated org-mode journal entries.

2026.08.12.2

Update existing daily org files instead of skipping them; preserve manual sections.

2026.08.12.1

Include Simon Willison's Weblog in org-mode journal entries.

2026.08.01.1

2026.08.01.1

Fixed: Broken model-upgrade chain. The prior version bump (to 2026.07.27.1) updated version but left the upgrades array terminating one step short, which blocks swamp extension push ("model upgrade chain errors"). That version never actually published — the registry was still serving 2026.07.20.1. This release closes the chain with a no-op upgrade entry and republishes everything that had accumulated since 2026.07.20.1.

2026.07.27.1

Changed: Reformatted files that had drifted from deno fmt. No code behavior changes.

Upgrade note: Tooling and formatting only. No model, method, schema, or behavior change — nothing to do on upgrade.

2026.07.20.1

Render The AI Daily Brief editions in daily org entries: new aiDailyBrief source (on by default) adds an edition section with date, title, tags, thesis, URL, and written takeaways. Upgrade backfills aiDailyBrief onto existing instances' sources list.

2026.07.18.1

2026.07.18.1

Added: An upgrades array entry (no-op) to hermes_jrnl_writer.ts for proper typeVersion tracking on existing instances. No schema or behavior changes.

2026.07.09.1

Fixed: write_daily_entry failed argument validation under swamp. Its method arguments schema was z.object({}).strict(), and .strict() rejects the extra keys swamp injects into a method call — so every invocation errored before the method body ran. The schema is now z.object({}) (no .strict()), accepting the call as swamp makes it.

No behavioral change to the journal output or git handling: every safeguard from 2026.07.08.1 (single-colon FILETAGS, skipped-no-data, honest git status codes, single-file commit, stat rethrow, timeout cleanup) is unchanged.

2026.07.08.1

Changed: One org file per day instead of a monthly rollup.

  • Journal entries are now written to YYYY-MM-DD-dow.org (e.g. 2026-07-08-wed.org), each a standalone org document with #+TITLE, #+DATE, and #+FILETAGS headers. Writing is idempotent — an existing file for the day is left untouched.
  • Section headings are now level-1 (* Hacker News) since the day's entry is the whole document, rather than the ***/**** levels that assumed nesting inside a monthly file.
  • #+FILETAGS are now joined with single colons (:a:b:); the previous join emitted a doubled colon (:a::b:) that org parses as an empty tag. Tags that sanitize to an empty string are dropped rather than emitted.
  • A run with no research data now writes and commits nothing (status skipped-no-data) instead of committing a "No research data" placeholder. The placeholder would trip the idempotency guard and permanently block a later run that day from writing the real entry once the collector had run.

Added:

  • sources global arg — an array drawn from ["hn", "lobsters", "sre", "ifin", "redmonk", "arxiv"]. Defaults to all sources; remove a name to disable that source. An unset/empty value is treated as "all sources".
  • arXiv entries are now rendered as an * arXiv section (previously collected but never written out).

Fixed:

  • Git failures are no longer reported as success. The recorded status now reflects what actually reached the remote: written (committed and pushed), committed-not-pushed (push failed), written-not-committed (commit failed), or written-nothing-to-commit (the file already matched the last commit, so no push was attempted). A failed git status (e.g. a held index.lock) is treated as an error rather than "nothing to commit".
  • The commit now stages and commits only the day's file (git add -- <file>) rather than the whole journal subdirectory, so an unrelated in-progress edit is never swept into the bot commit.
  • The idempotency guard now rethrows non-NotFound stat errors (permission denied, I/O) instead of swallowing them and failing later without context.
  • runCommand clears its timeout timer in a finally block, so the timer no longer leaks if the subprocess call rejects.
  • Reads the research data spec first (the current @webframp/research-collector output), falling back to the legacy brief spec for older instances.
2026.07.09.1
2026.07.08.1

2026.07.08.1

Changed: One org file per day instead of a monthly rollup.

  • Journal entries are now written to YYYY-MM-DD-dow.org (e.g. 2026-07-08-wed.org), each a standalone org document with #+TITLE, #+DATE, and #+FILETAGS headers. Writing is idempotent — an existing file for the day is left untouched.
  • Section headings are now level-1 (* Hacker News) since the day's entry is the whole document, rather than the ***/**** levels that assumed nesting inside a monthly file.
  • #+FILETAGS are now joined with single colons (:a:b:); the previous join emitted a doubled colon (:a::b:) that org parses as an empty tag. Tags that sanitize to an empty string are dropped rather than emitted.

Added:

  • sources global arg — an array drawn from ["hn", "lobsters", "sre", "ifin", "redmonk", "arxiv"]. Defaults to all sources; remove a name to disable that source. An unset/empty value is treated as "all sources".
  • arXiv entries are now rendered as an * arXiv section (previously collected but never written out).

Fixed:

  • Git failures are no longer reported as success. A failed git push now records the entry as committed-not-pushed (and a failed commit as written-not-committed) instead of logging "Pushed to remote" and recording written. The recorded status reflects what actually reached the remote.
  • The commit now stages and commits only the day's file (git add -- <file>) rather than the whole journal subdirectory, so an unrelated in-progress edit is never swept into the bot commit.
  • The idempotency guard now rethrows non-NotFound stat errors (permission denied, I/O) instead of swallowing them and failing later without context.
  • runCommand clears its timeout timer in a finally block, so the timer no longer leaks if the subprocess call rejects.
  • Reads the research data spec first (the current @webframp/research-collector output), falling back to the legacy brief spec for older instances.
05Stats
A
100 / 100
Downloads
7
Archive size
20.2 KB
  • Has README or module doc2/2earned
  • README has a code example1/1earned
  • README is substantive1/1earned
  • Most symbols documented1/1earned
  • No slow types (deprecated)1/1earned
  • Dependencies pass trust audit2/2earned
  • Has description1/1earned
  • Platform support declared (or universal)2/2earned
  • License declared1/1earned
  • Verified public repository2/2earned
06Platforms
07Labels