hype-launch 0.2.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (74) hide show
  1. hype_launch-0.2.0/.github/workflows/ci.yml +35 -0
  2. hype_launch-0.2.0/.gitignore +12 -0
  3. hype_launch-0.2.0/CHANGELOG.md +128 -0
  4. hype_launch-0.2.0/LICENSE +21 -0
  5. hype_launch-0.2.0/PKG-INFO +379 -0
  6. hype_launch-0.2.0/README.md +334 -0
  7. hype_launch-0.2.0/SKILL.md +110 -0
  8. hype_launch-0.2.0/SPEC.md +1619 -0
  9. hype_launch-0.2.0/docs/research/bluesky-tools.md +178 -0
  10. hype_launch-0.2.0/docs/research/crosspost.md +431 -0
  11. hype_launch-0.2.0/docs/research/hackernews.md +856 -0
  12. hype_launch-0.2.0/docs/research/hello-rust.md +424 -0
  13. hype_launch-0.2.0/docs/research/launch-strategy.md +703 -0
  14. hype_launch-0.2.0/docs/research/linkedin-automation.md +343 -0
  15. hype_launch-0.2.0/docs/research/reddit.md +543 -0
  16. hype_launch-0.2.0/docs/research/x-reader.md +67 -0
  17. hype_launch-0.2.0/docs/research/x-twitter.md +693 -0
  18. hype_launch-0.2.0/hype/__init__.py +3 -0
  19. hype_launch-0.2.0/hype/cli.py +586 -0
  20. hype_launch-0.2.0/hype/config.py +339 -0
  21. hype_launch-0.2.0/hype/copy.py +391 -0
  22. hype_launch-0.2.0/hype/humanity.py +348 -0
  23. hype_launch-0.2.0/hype/launch/__init__.py +0 -0
  24. hype_launch-0.2.0/hype/launch/copy_review.py +147 -0
  25. hype_launch-0.2.0/hype/launch/executor.py +144 -0
  26. hype_launch-0.2.0/hype/launch/new.py +92 -0
  27. hype_launch-0.2.0/hype/launch/press.py +82 -0
  28. hype_launch-0.2.0/hype/launch/resume_ui.py +56 -0
  29. hype_launch-0.2.0/hype/launch/sequence.py +143 -0
  30. hype_launch-0.2.0/hype/models.py +15 -0
  31. hype_launch-0.2.0/hype/platforms/__init__.py +0 -0
  32. hype_launch-0.2.0/hype/platforms/bluesky.py +168 -0
  33. hype_launch-0.2.0/hype/platforms/devto.py +81 -0
  34. hype_launch-0.2.0/hype/platforms/reddit.py +120 -0
  35. hype_launch-0.2.0/hype/platforms/x.py +207 -0
  36. hype_launch-0.2.0/hype/preflight.py +268 -0
  37. hype_launch-0.2.0/hype/preflight_ui.py +69 -0
  38. hype_launch-0.2.0/hype/scoring.py +300 -0
  39. hype_launch-0.2.0/hype/scrubber.py +181 -0
  40. hype_launch-0.2.0/hype/signal/__init__.py +0 -0
  41. hype_launch-0.2.0/hype/signal/listen.py +254 -0
  42. hype_launch-0.2.0/hype/signal/listener_ui.py +47 -0
  43. hype_launch-0.2.0/hype/signal/monitor.py +92 -0
  44. hype_launch-0.2.0/hype/signal/research.py +943 -0
  45. hype_launch-0.2.0/hype/wizard.py +146 -0
  46. hype_launch-0.2.0/launch.toml.example +49 -0
  47. hype_launch-0.2.0/pyproject.toml +73 -0
  48. hype_launch-0.2.0/site/index.html +770 -0
  49. hype_launch-0.2.0/tests/__init__.py +0 -0
  50. hype_launch-0.2.0/tests/test_cli.py +1025 -0
  51. hype_launch-0.2.0/tests/test_config.py +235 -0
  52. hype_launch-0.2.0/tests/test_copy.py +484 -0
  53. hype_launch-0.2.0/tests/test_copy_review.py +173 -0
  54. hype_launch-0.2.0/tests/test_humanity.py +260 -0
  55. hype_launch-0.2.0/tests/test_launch_executor.py +310 -0
  56. hype_launch-0.2.0/tests/test_launch_new.py +148 -0
  57. hype_launch-0.2.0/tests/test_launch_press.py +85 -0
  58. hype_launch-0.2.0/tests/test_launch_resume_ui.py +81 -0
  59. hype_launch-0.2.0/tests/test_launch_sequence.py +215 -0
  60. hype_launch-0.2.0/tests/test_listener_ui.py +54 -0
  61. hype_launch-0.2.0/tests/test_models.py +38 -0
  62. hype_launch-0.2.0/tests/test_platform_bluesky.py +243 -0
  63. hype_launch-0.2.0/tests/test_platform_devto.py +185 -0
  64. hype_launch-0.2.0/tests/test_platform_reddit.py +184 -0
  65. hype_launch-0.2.0/tests/test_platform_x.py +294 -0
  66. hype_launch-0.2.0/tests/test_preflight.py +558 -0
  67. hype_launch-0.2.0/tests/test_preflight_ui.py +130 -0
  68. hype_launch-0.2.0/tests/test_scoring.py +243 -0
  69. hype_launch-0.2.0/tests/test_scrubber.py +144 -0
  70. hype_launch-0.2.0/tests/test_signal_listen.py +360 -0
  71. hype_launch-0.2.0/tests/test_signal_monitor.py +184 -0
  72. hype_launch-0.2.0/tests/test_signal_research.py +1216 -0
  73. hype_launch-0.2.0/tests/test_wizard.py +356 -0
  74. hype_launch-0.2.0/uv.lock +1155 -0
@@ -0,0 +1,35 @@
1
+ name: CI
2
+
3
+ on:
4
+ push:
5
+ branches: [master, main]
6
+ pull_request:
7
+ branches: [master, main]
8
+
9
+ jobs:
10
+ test:
11
+ runs-on: ubuntu-latest
12
+ strategy:
13
+ matrix:
14
+ python-version: ["3.12", "3.13"]
15
+
16
+ steps:
17
+ - uses: actions/checkout@v4
18
+
19
+ - name: Install uv
20
+ uses: astral-sh/setup-uv@v5
21
+
22
+ - name: Set up Python ${{ matrix.python-version }}
23
+ run: uv python install ${{ matrix.python-version }}
24
+
25
+ - name: Install dependencies
26
+ run: uv sync --all-extras
27
+
28
+ - name: Lint
29
+ run: uv run ruff check .
30
+
31
+ - name: Type check
32
+ run: uv run mypy hype/
33
+
34
+ - name: Test
35
+ run: uv run pytest
@@ -0,0 +1,12 @@
1
+ *.pyc
2
+ __pycache__/
3
+ .env
4
+ *.sqlite
5
+ .DS_Store
6
+ dist/
7
+ node_modules/
8
+ .coverage
9
+ htmlcov/
10
+ .pytest_cache/
11
+ .claude/
12
+ .superset/
@@ -0,0 +1,128 @@
1
+ # Changelog
2
+
3
+ All notable changes to this project will be documented in this file.
4
+
5
+ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
6
+ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
+
8
+ ## [Unreleased]
9
+
10
+ ## [0.2.0] - 2026-04-08
11
+
12
+ ### Added
13
+
14
+ Anti-AI-slop pipeline (this release's headline change):
15
+
16
+ - `hype/humanity.py`: pure regex/heuristic scorer (no LLM calls). Scores
17
+ text 0-100 across five signals. AI phrases (38-pattern banlist
18
+ including `delve`, `leverage`, `robust`, `tapestry`, `cutting-edge`,
19
+ `battle-tested`, `next-gen`, `not just X but Y`), vague words (29
20
+ corporate fillers), passive voice ratio, conversational signals
21
+ (contractions, questions, first person, parenthetical asides), and
22
+ specificity signals (percentages, currency, years, version numbers,
23
+ named sources, quotes). Exposes `WARN_THRESHOLD=70`,
24
+ `BLOCK_THRESHOLD=50`, `is_warned()`, `is_blocked()`. Em-dash density
25
+ reported as informational signal.
26
+ - `hype/scrubber.py`: text transformer. Strips invisible unicode
27
+ watermarks (zero-width space, joiner, BOM, soft hyphen). Rewrites
28
+ em-dashes to contextual punctuation (semicolon before conjunctive
29
+ adverbs like "however", period after sentence-ending punctuation,
30
+ comma otherwise). Normalizes whitespace (collapse multiple spaces,
31
+ cap blank lines at 2, trim trailing whitespace).
32
+ - `hype.copy._parse_variants()` now scrubs every generated variant
33
+ through `scrub_text()` and scores it through `humanity.score_text()`
34
+ before constructing the `CopyVariant`. Score, breakdown, and scrub
35
+ stats are attached to the variant for the review UI.
36
+ - `CopyVariant` gains `humanity_score`, `humanity_breakdown`,
37
+ `scrub_stats`, `is_slop_blocked`, `is_slop_warned` fields.
38
+ - `CopyResult.best` now picks the variant with the highest humanity
39
+ score among scored variants, falling back to `variants[0]` for
40
+ short content (under 50 words) where no humanity score is computed.
41
+ - `hype.copy.generate_hn_first_comment()`: author's first reply on a
42
+ Show HN submission, hard-capped at 250 words. Previously users had
43
+ to write this by hand.
44
+ - `hype.copy.generate_x_thread()`: 3-5 tweet thread variant with
45
+ per-tweet character cap. Previously users got a single hook and
46
+ built the thread themselves.
47
+
48
+ Other features (carried forward from previously-unreleased work):
49
+
50
+ - `hype launch update`: release announcement command for X, Bluesky,
51
+ Reddit, and Dev.to with preflight, AI copy generation, and scored
52
+ review.
53
+ - `hype launch minor`: lightweight feature-drop command for X +
54
+ Bluesky only; auto-picks best variant without interactive review.
55
+ - `hype launch press`: generates `press-release.md` and
56
+ `outreach-template.md` via Claude from your project brief.
57
+ - `hype launch resume --execute`: executor engine that dispatches to
58
+ platform adapters (X, Bluesky, Reddit, Dev.to auto; HN, PH manual
59
+ with confirm prompt), with timed scheduling and state persistence
60
+ after each step.
61
+ - `hype launch resume --one`: execute a single step then stop, for
62
+ step-by-step manual control.
63
+ - `hype config set <key> <value>`: set any config value via dotted
64
+ key path (e.g. `platforms.x.api_key`); creates section if missing,
65
+ redacts secrets in output.
66
+ - `launch.toml.example`: fully documented example with all supported
67
+ fields.
68
+ - `subreddit` field on `LaunchState` for Reddit post targeting during
69
+ execution.
70
+ - Multi-pass positioning analysis in `signal research` (competitive
71
+ landscape, audience profile, positioning angles, per-platform
72
+ messaging hooks, and a draft of `launch.toml` hints).
73
+
74
+ ### Changed
75
+
76
+ - `_SYSTEM_PROMPT` in `hype.copy` rewritten as a hard-rules block.
77
+ Lists 35+ banned words and phrases. Prohibits em-dashes outright.
78
+ Bans hedging phrases (`perhaps`, `might`, `could potentially`).
79
+ Bans no-information openers (`Great question!`, `Let me explain`).
80
+ Bans transition words at paragraph starts (`Moreover`, `Furthermore`,
81
+ `In conclusion`). Bakes slop prevention into generation rather than
82
+ relying solely on post-hoc detection.
83
+ - All `generate_*` prompts gain explicit hard length caps:
84
+ Reddit body 100-200 words (was uncapped),
85
+ Dev.to article 600-900 words (was 1000-1500),
86
+ PH first comment 150-250 words (was ~300),
87
+ HN first comment <= 250 words (new function with cap from inception),
88
+ HN title 50-80 chars,
89
+ X tweet <= 280 chars / 0-2 hashtags / 0-emoji target,
90
+ Bluesky <= 300 chars / 0 hashtags.
91
+ - `CopyResult.best` semantics: was "first variant"; now "highest-
92
+ humanity scored variant, falling back to first if no scores".
93
+ - `hype launch resume` now executes pending steps by default (use
94
+ `--no-execute` for view-only mode, preserving old behavior).
95
+ - `signal research` now defaults to running the positioning analysis
96
+ on top of the raw HN/Reddit/X sweep; pass `--no-positioning` for
97
+ raw-only behavior.
98
+
99
+ ### Tests
100
+
101
+ - 24 new humanity scorer tests, 18 new scrubber tests, 12 new copy
102
+ integration tests covering the scrub-on-parse, score-on-parse, and
103
+ best-by-humanity behaviors.
104
+ - Full suite: **487 tests, 99.28% coverage** (above the 95% gate).
105
+
106
+ ## [0.1.0] - 2026-04-07
107
+
108
+ ### Added
109
+ - `hype launch new` — full launch orchestrator with preflight, AI copy generation, scored review, and timed sequence
110
+ - `--platforms` filter on `hype launch new` for partial/single-platform launches
111
+ - `hype launch resume` — resume interrupted launch sequences from saved state
112
+ - `hype signal research` — concurrent topic research across HN, Reddit, and X via Claude synthesis
113
+ - `hype signal listen` — post-launch brand monitoring with alert callbacks
114
+ - `hype preflight` — credential and timing validation before launch
115
+ - `hype config init` — interactive credential wizard with progressive disclosure
116
+ - `hype config show` / `hype config validate` — config inspection and validation
117
+ - Scoring layer: fast local scorers for HN titles (7 signals) and X hooks (9 signals)
118
+ - Copy review UI: per-variant score badges, signal breakdown, user picker
119
+ - Launch sequencer with 24-hour blitz schedule and JSON state persistence
120
+ - Platform adapters: X (inline OAuth 1.0a), Reddit (PRAW), Bluesky (atproto), Dev.to (httpx)
121
+ - Optional dependency extras: `hype[ai]`, `hype[reddit]`, `hype[bluesky]`, `hype[all]`
122
+ - X preflight: billing cost notice (~$0.01/post since Feb 2026 API change)
123
+ - X platform: HTTP 402 detection with clear billing error message
124
+ - Reddit preflight: OAuth app approval warning (manual review required)
125
+ - GitHub Actions CI: Python 3.12/3.13 matrix, ruff + pytest with 95% coverage floor
126
+
127
+ [Unreleased]: https://github.com/DjinnFoundry/hype/compare/v0.1.0...HEAD
128
+ [0.1.0]: https://github.com/DjinnFoundry/hype/releases/tag/v0.1.0
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 DjinnFoundry
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in all
13
+ copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
+ SOFTWARE.
@@ -0,0 +1,379 @@
1
+ Metadata-Version: 2.4
2
+ Name: hype-launch
3
+ Version: 0.2.0
4
+ Summary: Announce your OSS project like you know what you're doing
5
+ Author: DjinnFoundry
6
+ License: MIT
7
+ License-File: LICENSE
8
+ Keywords: announcements,cli,devtools,launch,opensource
9
+ Classifier: Development Status :: 3 - Alpha
10
+ Classifier: Environment :: Console
11
+ Classifier: Intended Audience :: Developers
12
+ Classifier: License :: OSI Approved :: MIT License
13
+ Classifier: Programming Language :: Python :: 3
14
+ Classifier: Programming Language :: Python :: 3.12
15
+ Classifier: Programming Language :: Python :: 3.13
16
+ Classifier: Programming Language :: Python :: 3.14
17
+ Classifier: Topic :: Software Development :: Build Tools
18
+ Classifier: Topic :: System :: Software Distribution
19
+ Requires-Python: >=3.12
20
+ Requires-Dist: httpx>=0.27
21
+ Requires-Dist: rich>=13
22
+ Requires-Dist: typer>=0.12
23
+ Provides-Extra: ai
24
+ Requires-Dist: anthropic>=0.30; extra == 'ai'
25
+ Provides-Extra: all
26
+ Requires-Dist: anthropic>=0.30; extra == 'all'
27
+ Requires-Dist: atproto>=0.0.50; extra == 'all'
28
+ Requires-Dist: praw<8,>=7.7; extra == 'all'
29
+ Provides-Extra: bluesky
30
+ Requires-Dist: atproto>=0.0.50; extra == 'bluesky'
31
+ Provides-Extra: dev
32
+ Requires-Dist: anthropic>=0.30; extra == 'dev'
33
+ Requires-Dist: atproto>=0.0.50; extra == 'dev'
34
+ Requires-Dist: mypy>=1.9; extra == 'dev'
35
+ Requires-Dist: praw<8,>=7.7; extra == 'dev'
36
+ Requires-Dist: pytest-asyncio>=0.23; extra == 'dev'
37
+ Requires-Dist: pytest-cov>=5; extra == 'dev'
38
+ Requires-Dist: pytest-mock>=3.14; extra == 'dev'
39
+ Requires-Dist: pytest>=8; extra == 'dev'
40
+ Requires-Dist: respx>=0.21; extra == 'dev'
41
+ Requires-Dist: ruff>=0.4; extra == 'dev'
42
+ Provides-Extra: reddit
43
+ Requires-Dist: praw<8,>=7.7; extra == 'reddit'
44
+ Description-Content-Type: text/markdown
45
+
46
+ ```
47
+ ██╗ ██╗██╗ ██╗██████╗ ███████╗
48
+ ██║ ██║╚██╗ ██╔╝██╔══██╗██╔════╝
49
+ ███████║ ╚████╔╝ ██████╔╝█████╗
50
+ ██╔══██║ ╚██╔╝ ██╔═══╝ ██╔══╝
51
+ ██║ ██║ ██║ ██║ ███████╗
52
+ ╚═╝ ╚═╝ ╚═╝ ╚═╝ ╚══════╝
53
+ ```
54
+
55
+ ### announce your OSS project like you know what you're doing
56
+
57
+ Launching OSS is a 14-hour day of copy-pasting into HN, Reddit, X, Bluesky, Dev.to, and Product Hunt — half of which you'll get wrong, half of which you'll mistime, and one of which will get you shadowbanned. `hype` is a CLI that runs the coordinated 24-hour blitz from a single `launch.toml`: it generates platform-specific copy with Claude, scores it before posting, runs pre-flight checks against your accounts, and executes the timed sequence so you can sit back and watch the spike. Then it listens for the spike.
58
+
59
+ [![build](https://img.shields.io/badge/build-passing-success)](https://github.com/djinnfoundry/hype/actions)
60
+ [![coverage](https://img.shields.io/badge/coverage-100%25-brightgreen)](https://github.com/djinnfoundry/hype)
61
+ [![pypi](https://img.shields.io/badge/pypi-v0.2.0-blue)](https://pypi.org/project/hype-launch/)
62
+ [![license](https://img.shields.io/badge/license-MIT-blue)](LICENSE)
63
+ [![python](https://img.shields.io/badge/python-3.12+-yellow)](https://www.python.org/)
64
+
65
+ ---
66
+
67
+ ## Demo
68
+
69
+ ```console
70
+ $ hype launch new --schedule auto
71
+
72
+ hype v0.2.0 — coordinated launch sequencer
73
+ project: hype
74
+ mode: new
75
+ brief: ./launch.toml
76
+
77
+ ▶ pre-flight ───────────────────────────────────────────────
78
+ [PASS] X account active, write scope confirmed
79
+ [PASS] Reddit 847d old, 2,341 karma — eligible for all subs
80
+ [WARN] Reddit r/programming karma 2,341 < recommended 5,000
81
+ [PASS] HN account karma 1,204
82
+ [PASS] Bluesky handle resolved
83
+ [PASS] Dev.to API key valid
84
+ [PASS] Timing Sun 11:14 UTC — low-competition HN window
85
+ [PASS] Content HN title 82/100, X hook 87/100
86
+
87
+ Continue with 1 warning? [y/N] y
88
+
89
+ ▶ copy generation (claude-sonnet-4-6) ─────────────────────
90
+ 18 completions · 3 variants each · 9.2s · $0.31
91
+
92
+ ▶ scheduled sequence ──────────────────────────────────────
93
+ 12:01 AM PT → Product Hunt (guided)
94
+ 12:30 AM PT → X thread (auto)
95
+ 1:00 AM PT → Show HN (guided)
96
+ 3:00 AM PT → Bluesky (auto)
97
+ 6:00 AM PT → Reddit wave 1 (auto, 60s stagger)
98
+ 2:00 PM PT → Reddit wave 2 (auto, 60s stagger)
99
+ 6:00 PM PT → Dev.to (auto)
100
+
101
+ Proceed? [y/N] y
102
+ ```
103
+
104
+ ---
105
+
106
+ ## Features
107
+
108
+ - **Coordinated blitz** — one `launch.toml`, six platforms, one tightly-timed sequence. Scatter-posting is strictly worse than the spike.
109
+ - **Pre-flight layer** — account health, karma age, rate-limit windows, timing window, content scoring. Catches the failure before it costs you a launch.
110
+ - **AI copy generation** — Claude turns your project brief into platform-specific copy: HN titles (3 scored variants), Reddit posts (per-subreddit framing, never identical), X threads, Bluesky, Dev.to articles, PH listings.
111
+ - **Content scoring** — HN title scorer (specificity, hype-word penalty, corpus similarity vs top-100 Show HNs). X hook scorer (9 signals: hook strength, link placement, hashtag count, CTA clarity).
112
+ - **Anti-AI-slop pipeline** — every generated variant is scrubbed (em-dashes rewritten to commas/semicolons, invisible unicode watermarks stripped) and scored against a 38-pattern AI banlist (`delve`, `leverage`, `robust`, `tapestry`, `not just X but Y`, etc.) plus passive-voice, vague-word, conversational, and specificity signals. Variants below the WARN threshold (70/100) flag in the review UI; below BLOCK (50/100) the review refuses to ship them. `CopyResult.best` picks the highest-humanity variant instead of trusting the LLM's stated order.
113
+ - **signal listen** — post-launch monitoring across HN Algolia, Reddit PRAW, and X. Alerts on point velocity, comment surges, notable mentions. Terminal bell, desktop notification, JSONL log.
114
+ - **signal research** — pre-launch positioning workflow. Pulls 30/60/90-day corpus from HN, Reddit, X, then runs a multi-pass Claude pipeline that returns a competitive landscape, audience profile, positioning angles, per-platform messaging hooks, and a draft of `launch.toml` hints. Pass `--no-positioning` for raw signal only.
115
+ - **Launch executor** — `hype launch resume` dispatches to platform adapters automatically (X, Bluesky, Reddit, Dev.to) and prompts for manual platforms (HN, Product Hunt). Timed scheduling sleeps until each step is due. `--one` for step-by-step control.
116
+ - **Resumable sequences** — Ctrl-C anytime, `hype launch resume` picks up where you left off. State saved after every step.
117
+ - **Press materials** — `hype launch press` generates a `press-release.md` and `outreach-template.md` from your project brief via Claude.
118
+ - **Config mutation** — `hype config set platforms.x.api_key <value>` sets any config value via dotted key path. Creates sections if missing, redacts secrets in output.
119
+
120
+ ---
121
+
122
+ ## Install
123
+
124
+ ```bash
125
+ pip install hype-launch
126
+ ```
127
+
128
+ Or with `uv` (recommended):
129
+
130
+ ```bash
131
+ uv tool install hype-launch
132
+ ```
133
+
134
+ Then:
135
+
136
+ ```bash
137
+ hype config init # interactive credential wizard
138
+ hype config validate # confirm everything works
139
+ hype config set platforms.x.api_key "your-key" # or set individual values
140
+ ```
141
+
142
+ ---
143
+
144
+ ## Quick start
145
+
146
+ ```bash
147
+ # 1. install
148
+ uv tool install hype-launch
149
+
150
+ # 2. set up credentials (one-time, per machine)
151
+ hype config init
152
+
153
+ # 3. drop a launch.toml in your project repo
154
+ cd ~/src/myproject
155
+ hype config edit launch.toml # writes a starter file
156
+
157
+ # 4. dry run the whole thing
158
+ hype launch new --dry-run
159
+
160
+ # 5. ship it
161
+ hype launch new --schedule auto
162
+ ```
163
+
164
+ That's the complete loop.
165
+
166
+ ---
167
+
168
+ ## Platform support
169
+
170
+ | Platform | Read | Write | Automation | Notes |
171
+ | ------------ | ----------------- | ---------------------------- | -------------- | ----- |
172
+ | X / Twitter | x-reader | OAuth 1.0a | full auto | ~$0.01/post (pay-per-use since Feb 2026) |
173
+ | Reddit | PRAW | PRAW | full auto | OAuth app approval required (1-3 days) |
174
+ | Hacker News | Algolia | clipboard + browser (manual) | guided | Bots banned — hype copies title and opens submit page |
175
+ | Bluesky | AT Protocol | AT Protocol | full auto | |
176
+ | Dev.to | REST | REST | full auto | |
177
+ | Product Hunt | GraphQL | browser (you fill the form) | guided | |
178
+ | Lobste.rs | none | none | manual + copy | |
179
+
180
+ Full automation where the platform allows it. Guided submission where it doesn't — HN bans automated posting, so hype copies your title to clipboard and opens the submit page in your browser.
181
+
182
+ ---
183
+
184
+ ## `hype signal`
185
+
186
+ ### Research a topic before launch
187
+
188
+ ```bash
189
+ hype signal research "rust tui frameworks"
190
+ hype signal research "OSS launch strategy" --days 90 --depth deep
191
+ hype signal research "bun vs node" --platforms hn,reddit --output ./research.md
192
+ hype signal research "rust tui frameworks" --no-positioning # raw only
193
+ ```
194
+
195
+ `signal research` is now a positioning workflow, not just raw signal collection. After the concurrent HN/Reddit/X sweep, it runs a multi-pass Claude pipeline that produces a structured strategy report:
196
+
197
+ - **Summary, sentiment, top concerns, opportunities** — Pass 1, the original synthesis.
198
+ - **Competitive landscape** — named alternatives mentioned in the corpus, with strengths/weaknesses and rough mention counts.
199
+ - **Audience profile** — per-platform experience level, stack, motivations, and language style.
200
+ - **Positioning angles** — 2-4 sharp angles that exploit the gaps in the competitive landscape, each with evidence and a risk note.
201
+ - **Per-platform messaging hooks** — concrete one-liner examples for HN, Reddit, X, and Bluesky, plus what to avoid.
202
+ - **Suggested `launch.toml` hints** — tagline options, problem/solution statements, a differentiator, and target subreddits you can paste straight into your `launch.toml`.
203
+
204
+ Strategy sections render before the raw post lists so you read conclusions first. Pass `--no-positioning` if you only want the raw signal sweep.
205
+
206
+ ### Listen to your launch in real time
207
+
208
+ ```bash
209
+ hype signal listen "hype" --hn-id 43789012 --notify
210
+ hype signal listen "hype" --log ./launch-events.jsonl &
211
+ ```
212
+
213
+ ```console
214
+ [HN] item/43789012 43 pts / 12 comments rank ~#24 +7 pts ← SPIKE
215
+ [Reddit] r/rust 89 pts / 23 comments +12 pts ← SPIKE
216
+ New comment (user_foo): "How does this compare to..."
217
+ [X] 14 mentions since launch +3 new ← SPIKE
218
+ Notable: @importantdev (12k followers): "Just tried hype..."
219
+ ```
220
+
221
+ Alerts on: point velocity, comment surges, controversy ratios (`comments > points` is a death spiral), milestones (100/200/500 points), notable mentions from accounts >5k followers.
222
+
223
+ ---
224
+
225
+ ## `hype launch`
226
+
227
+ Four modes for four levels of "is this a real launch":
228
+
229
+ | Mode | Default platforms | Use it for |
230
+ | ---------------- | --------------------------------------- | ------------------------- |
231
+ | `launch new` | PH, HN, Reddit (3 subs), X, Bluesky, Dev.to | Initial launch |
232
+ | `launch update` | X, Bluesky, Reddit, Dev.to | v2.0, major release |
233
+ | `launch minor` | X, Bluesky | Quick feature drop tweet |
234
+ | `launch press` | none — file output | Press release + outreach template |
235
+
236
+ ```bash
237
+ hype launch new # interactive, optimal-window auto-schedule
238
+ hype launch new --dry-run # generate everything, post nothing
239
+ hype launch new --platforms "hn,reddit:rust,x" --media demo.mp4
240
+ hype launch new --variants 5 --no-confirm # agent / CI mode
241
+
242
+ hype launch update --version v2.0.0 --changelog CHANGELOG.md
243
+ hype launch update --dry-run
244
+
245
+ hype launch minor --note "added --json flag to all commands"
246
+ hype launch minor --dry-run
247
+
248
+ hype launch press # generates press-release.md + outreach-template.md
249
+ hype launch press --output ./press/
250
+
251
+ hype launch resume # execute all pending steps
252
+ hype launch resume --one # execute one step then stop
253
+ hype launch resume --no-execute # view status only
254
+ ```
255
+
256
+ ---
257
+
258
+ ## Pre-flight output
259
+
260
+ Pre-flight runs before any post leaves your machine. Three severity levels: `BLOCK` (cannot proceed), `WARN` (confirm to proceed), `INFO` (FYI). Exit code reflects the worst outcome — wire it into CI if you're into that.
261
+
262
+ ```console
263
+ $ hype preflight new
264
+
265
+ ▶ pre-flight checks ────────────────────────────────────────
266
+
267
+ [PASS] X credentials valid, write scope confirmed
268
+ [PASS] Reddit account 847d old, karma 2,341 — eligible
269
+ [WARN] Reddit r/programming karma 2,341 < recommended 5,000
270
+ [BLOCK] HN queue has 8 posts in last 15min — wait 12 min
271
+ [PASS] Bluesky handle resolved, app password valid
272
+ [PASS] Dev.to API key valid
273
+ [PASS] Timing Sun 11:14 UTC — optimal HN low-competition window
274
+ [PASS] HN title 82/100 (specificity 18/20, hype-words 15/15)
275
+ [PASS] X hook 87/100 (hook 18/20, link placement 10/10)
276
+
277
+ Result: 1 BLOCK, 1 WARN, 7 PASS — cannot proceed.
278
+
279
+ exit 2
280
+ ```
281
+
282
+ Exit codes: `0` all clear · `1` warnings · `2` blocking issues.
283
+
284
+ ---
285
+
286
+ ## Config — the two-file model
287
+
288
+ `hype` uses two config files. One has secrets and lives on your machine. One has the brief and lives in your repo.
289
+
290
+ **`~/.config/hype/config.toml`** — credentials. Never committed. One per machine. Written by `hype config init`.
291
+
292
+ **`./launch.toml`** — the project brief. Committed to your repo. No secrets. Reviewable by collaborators.
293
+
294
+ ```toml
295
+ [project]
296
+ name = "hype"
297
+ tagline = "announce your OSS project like you know what you're doing"
298
+ repo = "https://github.com/djinnfoundry/hype"
299
+ version = "0.2.0"
300
+ license = "MIT"
301
+ stack = ["python", "cli", "devtools"]
302
+
303
+ [project.brief]
304
+ problem = """
305
+ Launching OSS requires the same announcement across 10+ communities
306
+ with different formats, timing, and norms. Most developers do it manually.
307
+ """
308
+ solution = """
309
+ hype generates platform-optimized copy from one brief, scores it before posting,
310
+ and executes a coordinated timed sequence.
311
+ """
312
+ differentiator = """
313
+ Pre-flight layer: account health, karma, timing, content scoring checked
314
+ before any post goes out. One brief → Claude → platform-specific copy.
315
+ """
316
+ install = "pip install hype-launch"
317
+ personal_story = "Built after manually posting a launch to 12 communities in one day."
318
+
319
+ [launch]
320
+ scheduled_at = "auto"
321
+ subreddit = "python"
322
+ platforms = [] # empty = all configured platforms
323
+ ```
324
+
325
+ See [`launch.toml.example`](launch.toml.example) for all fields with documentation.
326
+
327
+ Environment variable overrides (`HYPE_PLATFORMS__X__API_KEY=...`) for CI and agents.
328
+
329
+ ---
330
+
331
+ ## Why hype?
332
+
333
+ The coordinated 24-48 hour blitz is the mechanic that makes OSS launches work. HN + GitHub release + X simultaneous, then Reddit waves through the morning — that's what creates the spike that triggers GitHub Trending, which triggers more eyes, which triggers more stars, which is the entire point.
334
+
335
+ Scatter posting across different days is **strictly worse**. Posting to HN at the wrong hour is strictly worse. Forgetting to check your Reddit karma against the subreddit minimum is strictly worse. Generating identical copy for r/rust and r/programming is strictly worse — it's also a great way to get filtered.
336
+
337
+ `hype` operationalizes the mechanic. It's not a social media scheduler. It's not a marketing platform. It generates no landing pages, no email sequences, no analytics dashboards. It does one thing: run the launch you would have run manually, except it actually starts on time, the copy is scored, the windows are optimal, the karma is checked, the rate limits are respected, and you get to watch it happen instead of executing it.
338
+
339
+ Speed is not the goal. Quality is. Every guardrail in `hype` exists to protect you from getting flagged.
340
+
341
+ ---
342
+
343
+ ## Alternatives
344
+
345
+ | Tool | What it does | What it doesn't |
346
+ |------|-------------|----------------|
347
+ | **Postiz** | 34-platform social scheduler, open-source | No HN, no Product Hunt, no launch orchestration |
348
+ | **Buffer / Hootsuite** | Social media schedulers | No HN, no Reddit, no Dev.to, no developer focus |
349
+ | **Crier** | Cross-posting CLI | No HN, no Reddit, no Product Hunt, no timing/scoring |
350
+
351
+ hype's edge: launch orchestration (timing, pre-flight, scoring), HN + Product Hunt coverage, CLI-first workflow for developers.
352
+
353
+ ---
354
+
355
+ ## Contributing
356
+
357
+ PRs welcome. The bar:
358
+
359
+ 1. Fork, branch, test (`pytest`), open PR.
360
+ 2. Ruff-clean, mypy-clean, no decrease in coverage.
361
+ 3. Behavior changes need a `CHANGELOG.md` entry.
362
+ 4. Don't add platforms that require paid APIs unless you've tested the auth flow end-to-end.
363
+
364
+ Tests run on every PR. Coverage is enforced. We have zero tolerance for red tests.
365
+
366
+ ```bash
367
+ git clone https://github.com/djinnfoundry/hype
368
+ cd hype
369
+ uv sync
370
+ uv run pytest
371
+ ```
372
+
373
+ ---
374
+
375
+ ## License
376
+
377
+ MIT. See [LICENSE](LICENSE).
378
+
379
+ Built by [djinnfoundry](https://github.com/djinnfoundry). `hype` launched itself with `hype`. If it couldn't, it would be broken.