Skip to main content

Swamp Pulse

@svendowideit/swamp-pulsev2026.09.24.1· 1mo agoBEHAVIORSWORKFLOWSREPORTS
01README

A leaderboard-style activity dashboard for the swamp project itself: it tracks Lab issues, GitHub commits and GitHub releases, merges the three views of one change into a single ranked item, and renders six linked static HTML pages. WHAT IT DOES

Turns the raw firehose of swamp-project activity into a ranked, readable dashboard. A release, its commit and its pull request are the same event, so instead of listing them three times Pulse joins them into one merged item and ranks items by a synthesized significance hierarchy (tier first, recency as tie-break). It renders a documentation summary, an activity leaderboard, an extension-registry page (new / updated / most-pulled), and releases, changes and issues detail pages, each with 24-hour, 7-day and current-month windows and every item linked back to its source. Prefer it over reading the commit log or the issue tracker directly: it answers "what shipped, and does it matter?" in one page, and runs hourly.

INSTALL

# One pull; the declared dependencies install automatically.
swamp extension pull @svendowideit/swamp-pulse

DEPENDENCIES

@webframp/github (extended for the commit/release collectors) and @svendowideit/github-pages (opt-in publishing), both declared in dependencies: and installed by the single pull above. Serving the pages over HTTP additionally uses @svendowideit/systemd-service, and the Caddy publish target uses @svendowideit/caddy; both are optional and only needed if you enable those features.

RUN

# Collect, rank and render in one pass; scheduled hourly by default.
swamp workflow run @svendowideit/swamp-pulse

# Track a specific repository instead of the default set.
swamp workflow run @svendowideit/swamp-pulse \
  --input 'repos:json=["swamp-club/swamp"]'

# See every setting, its current value, and the exact command to change it.
swamp model @svendowideit/swamp-pulse method run setup pulse

Output lands in ~/.swamp/swamp-pulse/ (index.html, leaderboard.html, extensions.html, changes.html, releases.html, issues.html). Publishing is opt-in and never runs by default.

CONFIGURE

All settings are optional and public data needs no secrets. Configure the pulse model instance with global args, or per run with --input:

publishMode       false | caddy | github-pages   (default false)
pagesRepo         owner/repo for github-pages    (required when publishing)
pagesBranch       Pages branch                   (required when publishing)
pagesPath         / or /docs                     (default /)
pagesCname        custom domain
caddyHostname / caddyUpstream                    (for caddy mode)
outputDir         where the HTML is written      (default ~/.swamp/swamp-pulse)
windows           time windows to render         (default 24h, 7d, month)

Precedence is per-run --input > model global arg > schema default, so a bare swamp workflow run never overrides a configured instance. The repositories to track are a workflow input (repos), not a model global.

WHAT IT INSTALLS

No services, triggers, or webhooks on the host by default — it writes static HTML into outputDir when the workflow runs. If you enable the local server (ensure-server step), it installs a systemd user service (via @svendowideit/systemd-service) and enables lingering so the page is served at boot; publishing to GitHub Pages or Caddy commits/serves the pages only when you explicitly select that mode.

02Behaviors3
@svendowideit/swamp-pulsev2026.09.24.1swamp_pulse.ts

Global Arguments

ArgumentTypeDescription
outputDirstringDirectory to write the rendered HTML pages.
manualBaseUrlstringBase URL used to build published manual links.
windowsarrayActivity windows to compute and render.
storeRetentionDaysnumberHow many days of merged events to retain in the rolling store.
docPathPatternstringOptional extra regex; matching changed paths are treated as documentation.
serverPortnumberPort the pulse static server listens on (used by ensureServer).
serverServiceNamestringsystemd user service name for the pulse static server.
serverScriptPath?stringOverride the path to the bundled pulse-server.ts script.
publishModeenumPublishing mode. 'false' publishes nothing; 'caddy' serves locally via
pagesRepostringTarget repository (owner/name) for publishMode=github-pages.
pagesBranchstringBranch to publish the Pages site to (e.g. gh-pages).
pagesPathenumDirectory within the repository Pages serves from.
pagesCnamestringOptional custom domain to configure for the Pages site.
caddyHostnamestringPublic hostname to serve the pages on for publishMode=caddy.
caddyUpstreamstringhost:port the Caddy reverse proxy points at.
fn publishConfig(mode?: enum, pagesRepo?: string, pagesBranch?: string, pagesPath?: enum, pagesCname?: string, caddyHostname?: string, caddyUpstream?: string)
Resolve the model's publishing globals into a resource the workflow can guard on. Publishes nothing itself. Fails only when the selected mode is missing required settings.
ArgumentTypeDescription
mode?enumOverride publishMode for this run. Empty uses the model global.
pagesRepo?stringOverride the target repository (owner/name).
pagesBranch?stringOverride the Pages branch.
pagesPath?enumOverride the Pages source path.
pagesCname?stringOverride the custom domain.
caddyHostname?stringOverride the Caddy hostname.
caddyUpstream?stringOverride the Caddy upstream.
fn setup(publishMode?: enum, pagesRepo?: string, pagesBranch?: string, pagesPath?: enum, pagesCname?: string, caddyHostname?: string, caddyUpstream?: string, serverPort?: number, serverServiceName?: string, outputDir?: string)
Configuration helper. Run with no inputs to print every setting with its valid values, default and current value; pass any of them as inputs to validate and see the exact command to persist the change. Also reports the resolved publishing config. Persists nothing itself.
ArgumentTypeDescription
publishMode?enumPublishing mode.
pagesRepo?stringTarget repository (owner/name) for github-pages.
pagesBranch?stringBranch Pages serves from, e.g. gh-pages.
pagesPath?enumDirectory Pages serves from.
pagesCname?stringCustom domain.
caddyHostname?stringPublic hostname for caddy mode.
caddyUpstream?stringhost:port the Caddy proxy points at.
serverPort?numberPort the pulse server listens on.
serverServiceName?stringsystemd user service name.
outputDir?stringWhere the HTML pages are written.
fn sync_manual_index()
Fetch and cache the swamp-club manual sitemap so documentation changes can link to their published page.
fn rank(commits?: unknown, releases?: unknown, docChanges?: unknown, labIssues?: unknown, extensions?: unknown, now?: string)
Join releases, commits and Lab issues into one item per change, merge into the rolling store, and rank by window.
ArgumentTypeDescription
commits?unknownOutput of @webframp/github collect_commits (wire via CEL).
releases?unknownOutput of @webframp/github collect_releases (wire via CEL).
docChanges?unknownOutput of @webframp/github collect_doc_changes (wire via CEL).
labIssues?unknownOutput of @svendowideit/swamp-club search_lab_issues (wire via CEL).
extensions?unknownOutput of @svendowideit/swamp-ext-registry collect_extensions (wire via CEL).
now?stringOverride the evaluation timestamp (ISO-8601); useful for tests.
fn render(outputDir?: string)
Render the six linked HTML pages (docs summary, leaderboard, extensions, changes, releases, issues) from the ranked data.
ArgumentTypeDescription
outputDir?stringOverride the output directory for the rendered HTML.
fn ensureServer(port?: number, serviceName?: string, scriptPath?: string)
Idempotently ensure the pulse static server runs as a systemd user service (via @svendowideit/systemd-service) so the generated pages are always served. Resolves the bundled pulse-server.ts script, creates the unit, and starts it. Skips gracefully (with a log) if the systemd-service extension is not installed.
ArgumentTypeDescription
port?numberPort the server listens on (defaults to global serverPort).
serviceName?stringsystemd user service name (defaults to global serverServiceName).
scriptPath?stringOverride the path to the pulse-server.ts script.

Resources

store(infinite)— Rolling merged-event store with collection cursors
ranked(30d)— Ranked merged events per activity window
publishConfig(30d)— Resolved publishing configuration derived from the model's globals
manualIndex(7d)— Cached swamp-club manual page index for doc linking

Files

summaryPage(text/html)— Leaderboard-style summary page
leaderboardPage(text/html)— Activity leaderboard page (24h / 7d / month)
extensionsPage(text/html)— Extension registry page (new / updated / most pulled)
changesPage(text/html)— Commits and changes tour page
releasesPage(text/html)— Releases tour page
issuesPage(text/html)— Lab issues tour page
@svendowideit/swamp-clubv2026.09.18.1swamp_club.ts

Global Arguments

ArgumentTypeDescription
hoststringSwamp Club host, with or without scheme (default swamp-club.com).
apiKey?stringOptional Swamp Club API key, supplied from a vault. Anonymous when unset.
maxCommentsnumberMaximum number of recent comments to retain per issue.
requestTimeoutMsnumberPer-request timeout in milliseconds.
fn get_lab_issue_context(issueNumber: number)
Read one Lab issue and bounded activity without changing its lifecycle.
ArgumentTypeDescription
issueNumbernumber
fn search_lab_issues(since?: string, until?: string, type: enum, source: string, max: number, pageSize: number)
List and paginate Lab issues, optionally filtered by a UTC time window, type, status or source. Works anonymously.
ArgumentTypeDescription
since?stringISO-8601 lower bound on createdAt (inclusive). Defaults to 30 days ago.
until?stringISO-8601 upper bound on updatedAt (inclusive). Defaults to now.
typeenumFilter by issue type.
sourcestringFilter by source tag (exact match). Empty means no filter.
maxnumberMaximum number of issues to collect across pages.
pageSizenumberIssues requested per page (the API caps this at 200).
fn post_ripple(issueNumber: number, body: string)
Post an explicitly approved, exact ripple and record its remote identifier.
ArgumentTypeDescription
issueNumbernumber
bodystring

Resources

labIssue(30m)— Bounded Lab issue context
labIssues(1h)— Paginated Lab issue list for a time window
ripple(30d)— Posted preapproved Lab ripple evidence
@svendowideit/swamp-ext-registryv2026.09.24.1swamp_ext_registry.ts

Global Arguments

ArgumentTypeDescription
hoststringSwamp Club host, with or without scheme (default swamp-club.com).
requestTimeoutMsnumberPer-request timeout in milliseconds.
pageSizenumberExtensions requested per page (the API caps this at 100).
fn collect_extensions(since: string, until?: string, maxPages: number, significantLimit: number)
Page the public extension registry and report extensions that are new or updated within a window, plus the all-time most-pulled overall.
ArgumentTypeDescription
sincestringISO-8601 lower bound on createdAt/updatedAt (inclusive).
until?stringISO-8601 upper bound (inclusive). Defaults to now.
maxPagesnumberMaximum search pages to read (100 extensions each).
significantLimitnumberHow many most-pulled extensions to report.

Resources

extensions(1h)— Registry extensions that are new or changed in a window, plus the most pulled
03Workflows1
@svendowideit/swamp-pulse7c2f9a10-5b4d-4e8f-9a1c-2d3e4f5a6b7c

Swamp Pulse — collect swamp activity and render the dashboard. Every hour: cache the manual index, collect Lab issues, commits, releases and changed docs (fanning out over every configured repo), join each release with its commit and pull request into one merged item, rank by significance (tier first, recency as tie-break), then render five linked HTML pages — a documentation summary, an activity leaderboard, and changes, releases and issues tour pages. Usage: swamp workflow run @svendowidei

mainCollect → rank → render → (optional) publish.
1.configure— Resolve the model's publishing globals into the publishConfig resource. Publishes nothing; every publish guard reads this. Set the mode and targets once on the pulse model and scheduled runs honour it.
2.manual-index— Cache the swamp-club manual page index so doc changes can link to their published page.
3.collect-issues— Collect swamp-club Lab issues (anonymous unless an apiKey is configured).
4.collect-commits— Collect commits for every configured repository in one fan-out call.
5.collect-releases— Collect body-inclusive releases for every configured repository.
6.collect-docs— Find changed documentation files in the window (doc-suspect commits only).
7.collect-extensions— Read the public extension registry and report new / updated extensions plus the most pulled.
8.rank— Join releases↔commits↔PRs into merged items, merge into the rolling store, and rank by window.
9.render— Render the five linked HTML pages from the ranked data.
10.ensure-server— Idempotently ensure the pulse static server runs as a systemd user service (via @svendowideit/systemd-service) so the rendered pages are always served. Skips gracefully with a log if that extension is not installed.
11.publish-caddy— Point a Caddy reverse proxy at the pulse server (requires @svendowideit/caddy and a configured my-caddy model). Guarded to publish=caddy and allowFailure, so an absent Caddy degrades to local-only.
12.require-pages-config— Fail fast when the github-pages publish mode is configured without a target repository and branch, rather than silently doing nothing.
13.publish-github-pages— Commit the rendered pages to a GitHub repository's Pages site (requires @svendowideit/github-pages and gh authentication). Guarded to publish=github-pages so nothing is published by default.
04Reports1
@svendowideit/swamp-pulse-summarymethod
swamp_pulse_report.ts

Summarise a Swamp Pulse run — counts, top-ranked items and doc links

swamp-pulsesummary
05Stats
A
93 / 100
Downloads
33
Archive size
111.7 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
  • License1/2partial

    no SPDX license declared

  • Verified public repository2/2earned
06Platforms