Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,13 @@ All notable changes to this project will be documented in this file.

The format is based on [Keep a Changelog](http://keepachangelog.com/) and this project adheres to [Semantic Versioning](http://semver.org/).

## [0.6.0] - 2026-04-28

### Changed

- Renamed npm package from `@sadcoderlabs/laughing-man` to `laughing-man-cli`. Install with `npm i -g laughing-man-cli`. The `laughing-man` command itself is unchanged.
- GitHub repository moved to `github.com/vinta/laughing-man`.

## [0.5.0] - 2026-04-12

### Added
Expand Down
4 changes: 2 additions & 2 deletions CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ laughing-man send <N> # Send issue N via Resend Broadcast
laughing-man send status # Show delivery status for all sent broadcasts
```

Install from npm: `npm install -g @sadcoderlabs/laughing-man`
Or run without installing: `npx @sadcoderlabs/laughing-man <command>`
Install from npm: `npm install -g laughing-man-cli`
Or run without installing: `npx laughing-man-cli <command>`

## Tech Stack

Expand Down
12 changes: 6 additions & 6 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@

# laughing-man

[![npm Version](https://img.shields.io/npm/v/@sadcoderlabs/laughing-man?style=for-the-badge)](https://www.npmjs.com/package/@sadcoderlabs/laughing-man)
[![CI](https://img.shields.io/github/actions/workflow/status/sadcoderlabs/laughing-man/ci.yml?style=for-the-badge&label=Build)](https://github.com/sadcoderlabs/laughing-man/actions/workflows/ci.yml)
[![Agent Friendly](https://img.shields.io/badge/Agent-Friendly-blue?style=for-the-badge)](https://github.com/sadcoderlabs/laughing-man/blob/main/skills/laughing-man/SKILL.md)
[![npm Version](https://img.shields.io/npm/v/laughing-man-cli?style=for-the-badge)](https://www.npmjs.com/package/laughing-man-cli)
[![CI](https://img.shields.io/github/actions/workflow/status/vinta/laughing-man/ci.yml?style=for-the-badge&label=Build)](https://github.com/vinta/laughing-man/actions/workflows/ci.yml)
[![Agent Friendly](https://img.shields.io/badge/Agent-Friendly-blue?style=for-the-badge)](https://github.com/vinta/laughing-man/blob/main/skills/laughing-man/SKILL.md)

Turn your Markdown into a self-hosted newsletter.

Expand All @@ -17,21 +17,21 @@ Write your newsletter in Markdown with whatever tools you like (Obsidian, Logseq
Requires Node.js 22+ (for npx) and a domain name.

```bash
npm install -g @sadcoderlabs/laughing-man
npm install -g laughing-man-cli
```

Or run without installing:

```bash
npx @sadcoderlabs/laughing-man --help
npx laughing-man-cli --help
```

## Usage

If you're the type who skips the manual, just copy this prompt to your agent:

```prompt
How do I use this tool? Read https://raw.githubusercontent.com/sadcoderlabs/laughing-man/main/skills/laughing-man/SKILL.md
How do I use this tool? Read https://raw.githubusercontent.com/vinta/laughing-man/main/skills/laughing-man/SKILL.md
```

### Initiate
Expand Down
6 changes: 3 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@sadcoderlabs/laughing-man",
"version": "0.5.0",
"name": "laughing-man-cli",
"version": "0.6.0",
"description": "Turn your Markdown into a self-hosted newsletter",
"type": "module",
"files": [
Expand All @@ -19,7 +19,7 @@
"license": "MIT",
"repository": {
"type": "git",
"url": "git+https://github.com/sadcoderlabs/laughing-man.git"
"url": "git+https://github.com/vinta/laughing-man.git"
},
"keywords": [
"newsletter",
Expand Down
14 changes: 7 additions & 7 deletions skills/laughing-man/SKILL.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ Tell the user which steps you're skipping and why, then start from the first inc
Run this if no `laughing-man.yaml` exists in the working directory:

```bash
npx @sadcoderlabs/laughing-man init
npx laughing-man-cli init
```

Creates:
Expand Down Expand Up @@ -138,7 +138,7 @@ Paste the value when prompted. No redeployment is needed. Secrets take effect im
### 7. Run setup web

```bash
npx @sadcoderlabs/laughing-man setup web
npx laughing-man-cli setup web
```

Expected output (all green):
Expand Down Expand Up @@ -180,7 +180,7 @@ Docs:
### 8. Run setup newsletter

```bash
npx @sadcoderlabs/laughing-man setup newsletter
npx laughing-man-cli setup newsletter
```

Expected output:
Expand Down Expand Up @@ -232,15 +232,15 @@ Frontmatter fields:
### 10. Build and deploy

```bash
npx @sadcoderlabs/laughing-man build
npx @sadcoderlabs/laughing-man deploy
npx laughing-man-cli build
npx laughing-man-cli deploy
```

To preview locally before deploying:

```bash
npx @sadcoderlabs/laughing-man preview # includes drafts
npx @sadcoderlabs/laughing-man preview --no-drafts # published issues only (--production also works)
npx laughing-man-cli preview # includes drafts
npx laughing-man-cli preview --no-drafts # published issues only (--production also works)
```

### 11. Verify
Expand Down
2 changes: 1 addition & 1 deletion src/commands/deploy.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,7 @@ export async function runDeploy(options: DeployOptions): Promise<void> {
if (result.error) {
if ((result.error as NodeJS.ErrnoException).code === "ENOENT") {
throw new Error(
"Bundled wrangler executable was not found. Reinstall @sadcoderlabs/laughing-man.",
"Bundled wrangler executable was not found. Reinstall laughing-man-cli.",
);
}

Expand Down
4 changes: 2 additions & 2 deletions tests/commands/build.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -183,11 +183,11 @@ env: {}

expect(indexHtml).toContain("Created with");
expect(indexHtml).toContain(
'href="https://github.com/sadcoderlabs/laughing-man"',
'href="https://github.com/vinta/laughing-man"',
);
expect(issueHtml).toContain("Created with");
expect(issueHtml).toContain(
'href="https://github.com/sadcoderlabs/laughing-man"',
'href="https://github.com/vinta/laughing-man"',
);
});

Expand Down
2 changes: 1 addition & 1 deletion themes/laughing-man/layout.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,6 @@ export function siteFooter(name: string): string {
<span class="footer-name">${escapeHtml(name)}</span>
<span class="footer-sep" aria-hidden="true">/</span>
<span class="footer-credit">Created with
<a href="https://github.com/sadcoderlabs/laughing-man" target="_blank" rel="noopener noreferrer">laughing-man</a></span>
<a href="https://github.com/vinta/laughing-man" target="_blank" rel="noopener noreferrer">laughing-man</a></span>
</footer>`;
}