-
Notifications
You must be signed in to change notification settings - Fork 484
Expand file tree
/
Copy path.printing-press.json
More file actions
123 lines (123 loc) · 5.42 KB
/
Copy path.printing-press.json
File metadata and controls
123 lines (123 loc) · 5.42 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
{
"schema_version": 1,
"generated_at": "2026-05-31T01:44:52.337574Z",
"printing_press_version": "4.19.0",
"api_name": "substack",
"display_name": "Substack",
"cli_name": "substack-pp-cli",
"creator": {
"handle": "chirantan",
"name": "Chirantan Rajhans"
},
"owner": "chirantan",
"printer_name": "Chirantan Rajhans",
"spec_path": "substack-spec.yaml",
"spec_format": "internal",
"spec_checksum": "sha256:3a975bd38dd9787216caa419f1d47a47963096f752bd1205702922d2b822b17f",
"run_id": "20260531-014452",
"category": "media-and-entertainment",
"description": "Run your Substack growth loop from the command line — publish, schedule, engage, and measure with cross-table joins no single Substack API call can.",
"mcp_binary": "substack-pp-mcp",
"mcp_tool_count": 39,
"mcp_ready": "partial",
"api_version": "0.1.0",
"auth_type": "cookie",
"endpoint_template_vars": [
"publication"
],
"auth_key_url": "https://substack.com/sign-in",
"novel_features": [
{
"name": "Note-to-subscriber attribution ledger",
"command": "growth attribution",
"description": "Connect every Note you posted to the paid and free subscribers that actually arrived in the 24-hour window after, so you stop guessing which content drove growth."
},
{
"name": "Engagement reciprocity ledger",
"command": "engage reciprocity",
"description": "See net-give/net-take per writer you engage with — who reciprocates your restacks/comments, who quietly free-rides on yours."
},
{
"name": "Cadence guard",
"command": "notes schedule --guard",
"description": "Refuse to fire (or queue) a Note that lands less than 30 minutes after your last own-Note or violates your time-of-day rotation. Returns typed exit 2 with a JSON diagnosis."
},
{
"name": "Goal-aware best-time recommender",
"command": "growth best-time",
"description": "Top day-of-week × hour cells ranked for whichever growth signal you pick (paid subs, likes, restacks, or comments) — not a single average."
},
{
"name": "Hook-pattern miner",
"command": "discover patterns",
"description": "Mechanically extracts which hook patterns (curiosity-gap colon, 3-sentence formula, em-dash reframe, question opener) actually rank in a niche, with restack/comment ratios."
},
{
"name": "Swap-partner finder",
"command": "recs find-partners",
"description": "Score candidate publications for a Substack Recommendations swap by mutual-overlap density across followee + recommendation graphs."
},
{
"name": "Pod restack scoreboard",
"command": "growth pod",
"description": "Given a list of handles, render a member × member engagement matrix — last 30 days of restacks/comments/likes between every pair."
},
{
"name": "Voice fingerprint",
"command": "voice fingerprint",
"description": "Measurable voice profile — sentence length, em-dash rate, colon-hook rate, hook-line ratios, vocabulary uniqueness — for any handle, with --diff to compare against another writer."
},
{
"name": "Portfolio Dashboard",
"command": "portfolio",
"description": "One-screen status of every publication you own: subscriber count, paid count, last-published-at, drafts pending, next scheduled. No tab-switching, no CSV exports."
},
{
"name": "Cross-Publication Twin",
"command": "posts twin",
"description": "Duplicate a published post into another publication you own as a draft. Preserves paywall markers, sections, and re-uploads images to the target publication's CDN."
},
{
"name": "Subscriber Churn Diff",
"command": "subs churn",
"description": "Diff two SQLite snapshots of your subscriber list: who newly subscribed, who unsubscribed, who upgraded free->paid, who downgraded paid->free, since a chosen window."
},
{
"name": "Cross-Sell Candidates",
"command": "subs cross-sell",
"description": "SQL join across your publications' subscriber lists: emails paid on one publication but free or absent on the others, sorted by paid-publication coverage. The cross-sell list Substack does not ship."
},
{
"name": "Best Posts Cross-Publication",
"command": "posts best",
"description": "Rank posts by views, likes, comments, or restacks within a window. Optionally aggregate across every publication you own to find your overall top performer."
},
{
"name": "Bilingual Pair Tracker",
"command": "posts pairs",
"description": "Record EN<->DE post pairings in a local table. 'posts pair <en> <de>' adds; 'posts pairs --missing' lists posts in one language with no recorded twin in the other."
},
{
"name": "Full-Text Grep",
"command": "grep",
"description": "FTS5 over post bodies + Notes + comments, ranked by bm25, returning snippets and source URLs. Optional scope (posts/notes/comments/all), publication, and since filter."
},
{
"name": "Schedule Board",
"command": "schedule board",
"description": "ASCII calendar of the next 30 days showing scheduled posts across every publication you own. Multi-pub editorial overview in one screen."
}
],
"contributors": [
{
"handle": "JPresting",
"name": "JimPresting"
},
{
"handle": "tmchow",
"name": "Trevin Chow"
}
],
"printer": "chirantan",
"owner_name": "Chirantan Rajhans"
}