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.
- hype_launch-0.2.0/.github/workflows/ci.yml +35 -0
- hype_launch-0.2.0/.gitignore +12 -0
- hype_launch-0.2.0/CHANGELOG.md +128 -0
- hype_launch-0.2.0/LICENSE +21 -0
- hype_launch-0.2.0/PKG-INFO +379 -0
- hype_launch-0.2.0/README.md +334 -0
- hype_launch-0.2.0/SKILL.md +110 -0
- hype_launch-0.2.0/SPEC.md +1619 -0
- hype_launch-0.2.0/docs/research/bluesky-tools.md +178 -0
- hype_launch-0.2.0/docs/research/crosspost.md +431 -0
- hype_launch-0.2.0/docs/research/hackernews.md +856 -0
- hype_launch-0.2.0/docs/research/hello-rust.md +424 -0
- hype_launch-0.2.0/docs/research/launch-strategy.md +703 -0
- hype_launch-0.2.0/docs/research/linkedin-automation.md +343 -0
- hype_launch-0.2.0/docs/research/reddit.md +543 -0
- hype_launch-0.2.0/docs/research/x-reader.md +67 -0
- hype_launch-0.2.0/docs/research/x-twitter.md +693 -0
- hype_launch-0.2.0/hype/__init__.py +3 -0
- hype_launch-0.2.0/hype/cli.py +586 -0
- hype_launch-0.2.0/hype/config.py +339 -0
- hype_launch-0.2.0/hype/copy.py +391 -0
- hype_launch-0.2.0/hype/humanity.py +348 -0
- hype_launch-0.2.0/hype/launch/__init__.py +0 -0
- hype_launch-0.2.0/hype/launch/copy_review.py +147 -0
- hype_launch-0.2.0/hype/launch/executor.py +144 -0
- hype_launch-0.2.0/hype/launch/new.py +92 -0
- hype_launch-0.2.0/hype/launch/press.py +82 -0
- hype_launch-0.2.0/hype/launch/resume_ui.py +56 -0
- hype_launch-0.2.0/hype/launch/sequence.py +143 -0
- hype_launch-0.2.0/hype/models.py +15 -0
- hype_launch-0.2.0/hype/platforms/__init__.py +0 -0
- hype_launch-0.2.0/hype/platforms/bluesky.py +168 -0
- hype_launch-0.2.0/hype/platforms/devto.py +81 -0
- hype_launch-0.2.0/hype/platforms/reddit.py +120 -0
- hype_launch-0.2.0/hype/platforms/x.py +207 -0
- hype_launch-0.2.0/hype/preflight.py +268 -0
- hype_launch-0.2.0/hype/preflight_ui.py +69 -0
- hype_launch-0.2.0/hype/scoring.py +300 -0
- hype_launch-0.2.0/hype/scrubber.py +181 -0
- hype_launch-0.2.0/hype/signal/__init__.py +0 -0
- hype_launch-0.2.0/hype/signal/listen.py +254 -0
- hype_launch-0.2.0/hype/signal/listener_ui.py +47 -0
- hype_launch-0.2.0/hype/signal/monitor.py +92 -0
- hype_launch-0.2.0/hype/signal/research.py +943 -0
- hype_launch-0.2.0/hype/wizard.py +146 -0
- hype_launch-0.2.0/launch.toml.example +49 -0
- hype_launch-0.2.0/pyproject.toml +73 -0
- hype_launch-0.2.0/site/index.html +770 -0
- hype_launch-0.2.0/tests/__init__.py +0 -0
- hype_launch-0.2.0/tests/test_cli.py +1025 -0
- hype_launch-0.2.0/tests/test_config.py +235 -0
- hype_launch-0.2.0/tests/test_copy.py +484 -0
- hype_launch-0.2.0/tests/test_copy_review.py +173 -0
- hype_launch-0.2.0/tests/test_humanity.py +260 -0
- hype_launch-0.2.0/tests/test_launch_executor.py +310 -0
- hype_launch-0.2.0/tests/test_launch_new.py +148 -0
- hype_launch-0.2.0/tests/test_launch_press.py +85 -0
- hype_launch-0.2.0/tests/test_launch_resume_ui.py +81 -0
- hype_launch-0.2.0/tests/test_launch_sequence.py +215 -0
- hype_launch-0.2.0/tests/test_listener_ui.py +54 -0
- hype_launch-0.2.0/tests/test_models.py +38 -0
- hype_launch-0.2.0/tests/test_platform_bluesky.py +243 -0
- hype_launch-0.2.0/tests/test_platform_devto.py +185 -0
- hype_launch-0.2.0/tests/test_platform_reddit.py +184 -0
- hype_launch-0.2.0/tests/test_platform_x.py +294 -0
- hype_launch-0.2.0/tests/test_preflight.py +558 -0
- hype_launch-0.2.0/tests/test_preflight_ui.py +130 -0
- hype_launch-0.2.0/tests/test_scoring.py +243 -0
- hype_launch-0.2.0/tests/test_scrubber.py +144 -0
- hype_launch-0.2.0/tests/test_signal_listen.py +360 -0
- hype_launch-0.2.0/tests/test_signal_monitor.py +184 -0
- hype_launch-0.2.0/tests/test_signal_research.py +1216 -0
- hype_launch-0.2.0/tests/test_wizard.py +356 -0
- 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,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
|
+
[](https://github.com/djinnfoundry/hype/actions)
|
|
60
|
+
[](https://github.com/djinnfoundry/hype)
|
|
61
|
+
[](https://pypi.org/project/hype-launch/)
|
|
62
|
+
[](LICENSE)
|
|
63
|
+
[](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.
|