{"id":51641214,"url":"https://github.com/tamnd/pragmaticengineer-cli","last_synced_at":"2026-07-13T19:03:28.221Z","repository":{"id":364748598,"uuid":"1269074396","full_name":"tamnd/pragmaticengineer-cli","owner":"tamnd","description":"Read The Pragmatic Engineer newsletter posts, titles, and audience fields as JSON or table output","archived":false,"fork":false,"pushed_at":"2026-06-14T09:28:31.000Z","size":46,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-14T11:17:34.000Z","etag":null,"topics":["cli","golang","json","newsletter","pragmaticengineer","scraper","substack"],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tamnd.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-14T09:25:08.000Z","updated_at":"2026-06-14T11:03:31.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/tamnd/pragmaticengineer-cli","commit_stats":null,"previous_names":["tamnd/pragmaticengineer-cli"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/tamnd/pragmaticengineer-cli","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tamnd%2Fpragmaticengineer-cli","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tamnd%2Fpragmaticengineer-cli/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tamnd%2Fpragmaticengineer-cli/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tamnd%2Fpragmaticengineer-cli/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tamnd","download_url":"https://codeload.github.com/tamnd/pragmaticengineer-cli/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tamnd%2Fpragmaticengineer-cli/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35432835,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-07-13T02:00:06.543Z","response_time":119,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cli","golang","json","newsletter","pragmaticengineer","scraper","substack"],"created_at":"2026-07-13T19:03:22.358Z","updated_at":"2026-07-13T19:03:28.212Z","avatar_url":"https://github.com/tamnd.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# pragmaticengineer\n\nBrowse [The Pragmatic Engineer](https://newsletter.pragmaticengineer.com/) newsletter from the command line.\n\n`pragmaticengineer` is a single pure-Go binary. It reads public data from The Pragmatic Engineer\nSubstack over plain HTTPS, shapes it into clean records, and prints output that pipes\ninto the rest of your tools. No API key, nothing to run alongside it.\n\n## Install\n\n```bash\ngo install github.com/tamnd/pragmaticengineer-cli/cmd/pragmaticengineer@latest\n```\n\nOr grab a prebuilt binary from the [releases](https://github.com/tamnd/pragmaticengineer-cli/releases), or run\nthe container image:\n\n```bash\ndocker run --rm ghcr.io/tamnd/pragmaticengineer:latest --help\n```\n\n## Usage\n\n```bash\n# List the 25 most recent posts (default)\npragmaticengineer top\n\n# Table output in the terminal\npragmaticengineer top -o table\n\n# Get just the URLs\npragmaticengineer top -o url\n\n# Fetch 10 posts starting at offset 25 (second page)\npragmaticengineer top --limit 10 --offset 25\n\n# As JSON for jq\npragmaticengineer top -o json | jq '.[] | select(.audience == \"free\")'\n\n# CSV for spreadsheets\npragmaticengineer top -o csv \u003e posts.csv\n```\n\nEvery command shares one output contract: `-o table|json|jsonl|csv|tsv|url|raw`,\n`--fields` to pick columns, `--template` for a custom line, and `-n` to limit.\nThe default adapts to where output goes (a table on a terminal, JSONL in a\npipe), so the same command reads well by hand and parses cleanly downstream.\n\n## Commands\n\n| Command | Description |\n|---------|-------------|\n| `top` | List recent posts from The Pragmatic Engineer |\n| `version` | Show version information |\n\n## Flags for `top`\n\n```\n--limit int     number of posts to fetch (default 25)\n--offset int    offset for pagination (default 0)\n```\n\n## Global flags\n\n```\n-o, --output string    output format: table|json|jsonl|csv|tsv|url|raw (default \"auto\")\n-n, --limit int        limit number of records (0 = all)\n    --fields strings   comma-separated columns to include\n    --no-header        omit header row\n    --template string  Go text/template per record\n    --timeout duration per-request timeout (default 30s)\n    --delay duration   minimum spacing between requests\n    --retries int      retry attempts on 429/5xx (default 3)\n```\n\n## Post fields\n\n| Field | Description |\n|-------|-------------|\n| `rank` | Position in the listing (1-based) |\n| `date` | Publication date (YYYY-MM-DD) |\n| `audience` | `free` or `paid` |\n| `title` | Post title |\n| `subtitle` | Post subtitle / summary |\n| `url` | Canonical URL |\n\n## Serve it\n\nThe same operations are available over HTTP and as an MCP tool set for agents,\nwith no extra code:\n\n```bash\npragmaticengineer serve --addr :7777    # GET /v1/top returns NDJSON\npragmaticengineer mcp                   # speak MCP over stdio\n```\n\n## Development\n\n```\ncmd/pragmaticengineer/   thin main: hands cli.NewApp to kit.Run\ncli/                     assembles the kit App from the pragmaticengineer domain\npragmaticengineer/       the library: HTTP client, data models, and domain.go (the driver)\ndocs/                    tago documentation site\n```\n\n```bash\nmake build      # ./bin/pragmaticengineer\nmake test       # go test ./...\nmake vet        # go vet ./...\n```\n\n## Releasing\n\nPush a version tag and GitHub Actions runs GoReleaser, which builds the\narchives, Linux packages, the multi-arch GHCR image, checksums, SBOMs, and a\ncosign signature:\n\n```bash\ngit tag v0.1.0\ngit push --tags\n```\n\n## License\n\nApache-2.0. See [LICENSE](LICENSE).\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftamnd%2Fpragmaticengineer-cli","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftamnd%2Fpragmaticengineer-cli","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftamnd%2Fpragmaticengineer-cli/lists"}