backlinkflow 0.1.0

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.
package/CREDITS.md ADDED
@@ -0,0 +1,63 @@
1
+ # LinkFlow — Sources & Credits
2
+
3
+ LinkFlow's directory database (`data/directories.yaml`) is an independent,
4
+ deduplicated compilation built by merging factual directory listings (site
5
+ names + submission URLs) from the open-source projects below.
6
+
7
+ **What we take:** factual data only — site name, submission URL, and (where
8
+ the source provided it) domain authority / price model / status.
9
+
10
+ **What we write ourselves:** all descriptions/notes are LinkFlow's own
11
+ (never copied verbatim from sources), plus the `auto`, `lang`, `category`,
12
+ and `status` enrichment fields.
13
+
14
+ Per-entry provenance is embedded in the data itself: entries carry a
15
+ `notes: [from <source>]` marker so any entry can be traced back here.
16
+
17
+ ---
18
+
19
+ ## Sources (11)
20
+
21
+ | # | Project | License | Used for |
22
+ |---|---------|---------|----------|
23
+ | 1 | [s87343472/backlink-pilot](https://github.com/s87343472/backlink-pilot) | MIT | Base target set (258 sites, richest metadata: `auto`/`status`/`notes`); architecture reference for the automation engine |
24
+ | 2 | [mmccaff/PlacesToPostYourStartup](https://github.com/mmccaff/PlacesToPostYourStartup) | CC0-1.0 | Subreddits + website launch platforms (from the canonical "Ask HN" thread) |
25
+ | 3 | [BossChow/ultimate-submit-list](https://github.com/BossChow/ultimate-submit-list) | no license | Top-100 directory table (names + submit links) |
26
+ | 4 | [theshubh77/awesome-saas-directories](https://github.com/theshubh77/awesome-saas-directories) | CC0-1.0 | SaaS launch platforms + submit links + DR |
27
+ | 5 | [rushout09/directory-submission-sites](https://github.com/rushout09/directory-submission-sites) | GPL-3.0 | 250+ site list (names + URLs only) |
28
+ | 6 | [best-of-ai/ai-directories](https://github.com/best-of-ai/ai-directories) | MIT | AI directories (names + URLs) |
29
+ | 7 | [submitdirectories/submitdirectories](https://github.com/submitdirectories/submitdirectories) | no license | AI/SaaS/Tool/Startup lists with DA + submit URLs |
30
+ | 8 | [nilandev/startup-directories](https://github.com/nilandev/startup-directories) | no license | Startup directories + subreddits |
31
+ | 9 | [mahseema/awesome-saas-directories](https://github.com/mahseema/awesome-saas-directories) | MIT | SaaS directories |
32
+ | 10 | [DirectorySurf/awesome-launch-platforms](https://github.com/DirectorySurf/awesome-launch-platforms) | MIT | Launch platforms |
33
+ | 11 | [volodstaimi/Startup-Launch-List](https://github.com/volodstaimi/Startup-Launch-List) | MIT | 580+ startup directory list (names + URLs) — entries live-verified; dead ones marked `status: dead` |
34
+
35
+ Also referenced for methodology (not data):
36
+ - [swyxio/launch-cheatsheet](https://github.com/swyxio/launch-cheatsheet) — launch playbooks (archived)
37
+ - [AIDevGTM/gtm-cofounder](https://github.com/AIDevGTM/gtm-cofounder) — GTM strategy skills
38
+ - [naxiaoduo/1000UserGuide](https://github.com/naxiaoduo/1000UserGuide) — original source backlink-pilot's `targets.yaml` derives from
39
+
40
+ ---
41
+
42
+ ## License notes
43
+
44
+ - **MIT sources** (backlink-pilot, best-of-ai, mahseema, DirectorySurf,
45
+ Startup-Launch-List): attribution satisfied by this file.
46
+ - **CC0 sources** (mmccaff, theshubh77): public domain; credit retained as
47
+ good practice.
48
+ - **GPL-3.0 source** (rushout09): only factual names/URLs are incorporated
49
+ (facts are not copyrightable); no code or creative expression was taken.
50
+ If you require strict GPL-cleanliness, remove the 4 unique entries from
51
+ `directory-submission-sites` and regenerate (`linkflow db:regenerate`).
52
+ - **No-license sources** (BossChow, submitdirectories, nilandev): used for
53
+ factual data only (names + URLs). If your legal review requires it, these
54
+ can be dropped by removing the corresponding source files from
55
+ `scripts/sources/` and regenerating.
56
+
57
+ ## Regeneration
58
+
59
+ `scripts/regenerate-db.py` rebuilds the database from the vendored source
60
+ files in `scripts/sources/`. Delete a source file there → re-run
61
+ `linkflow db:regenerate` → that source's entries are gone.
62
+
63
+ LinkFlow itself is MIT (see LICENSE).
package/LICENSE ADDED
@@ -0,0 +1,21 @@
1
+ MIT License
2
+
3
+ Copyright (c) 2026 Sankalp Singh
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.
package/README.md ADDED
@@ -0,0 +1,320 @@
1
+ <div align="center">
2
+
3
+ # LinkFlow
4
+
5
+ **Zero-cost backlink & directory submission engine for indie hackers.**
6
+
7
+ [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](./LICENSE)
8
+ [![Node](https://img.shields.io/badge/node-%E2%89%A518-green.svg)](./package.json)
9
+ [![Part of the flow series](https://img.shields.io/badge/flow--series-LinkFlow%20%7C%20SeoFlow%20%7C%20SECflow-blueviolet)](#the-flow-series)
10
+
11
+ *1,123 vetted directories · AI-tailored submission copy · Playwright browser automation · proof-of-submission reports — no SaaS, no credits, no $79 upsell.*
12
+
13
+ </div>
14
+
15
+ ---
16
+
17
+ > **TL;DR** — Submitator, ListingBott, BoringLaunch charge $29–499 to do what LinkFlow does for free: a curated directory list, AI-generated per-directory copy, browser automation, and a status report. The only thing you bring is your own AI endpoint (OmniRoute, OpenAI, or any OpenAI-compatible API). Live-verified. MIT licensed.
18
+
19
+ **The what:**
20
+
21
+ | | What it does | How |
22
+ |---|---|---|
23
+ | **Database** | 1,123 directories across 9 categories (SaaS, AI, travel, startup, general, community, reddit, etc.) | Merged from 11 open-source lists, deduped, live-verified |
24
+ | **AI copy** | Per-directory tagline + description matching your site's voice | Your AI endpoint (OpenAI-compatible) |
25
+ | **Automation** | Real browser submissions via Playwright (`--go`) | Headless Chromium + smart field detection |
26
+ | **Proof** | Screenshots + per-directory markdown report | `.linkflow/report.md` + `.linkflow/proofs/*.png` |
27
+ | **Curation** | `db:review` flags dead links / homepage-as-submit | Idempotent regeneration from sources |
28
+ | **Cost** | $0 (you provide the AI endpoint, typically free) | No paid APIs, no SaaS subscription |
29
+
30
+ ---
31
+
32
+ ## Why LinkFlow?
33
+
34
+ Every paid directory-submission service is the same three things wrapped in a dashboard:
35
+
36
+ 1. **A list of where to submit** — this is open data
37
+ 2. **Per-directory copy** — this is a 5-line AI call
38
+ 3. **A status report** — this is a JSON file + a markdown table
39
+
40
+ LinkFlow gives you all three, plus actual browser automation for sites with open forms. The moat is honesty: 876 directories live-verified, 221 marked dead with reason, 26 marked paid. No padding with self-owned link farms. No "AI" that means "Army of Indians."
41
+
42
+ **vs competitors:**
43
+
44
+ | | LinkFlow | Submitator | ListingBott | BoringLaunch |
45
+ |---|---|---|---|---|
46
+ | Directories | 1,123 (876 alive) | ~150 | ~250 | ~200 |
47
+ | Cost | $0 | $29–79 | $499 | $249 |
48
+ | Time to submit | 24–48h (with `--go`) | 24–48h | 1 month | 7 days |
49
+ | Your AI endpoint | ✅ | ❌ | ❌ | ❌ |
50
+ | Self-hostable | ✅ | ❌ | ❌ | ❌ |
51
+ | Source list | ✅ CREDITS.md | ❌ proprietary | ❌ | ❌ |
52
+ | Badges handled | manual (v0.3) | ✅ | ✅ | ❌ |
53
+ | Open source | ✅ MIT | ❌ | ❌ | ❌ |
54
+
55
+ ---
56
+
57
+ ## Install
58
+
59
+ ```bash
60
+ # from source
61
+ git clone https://github.com/imsankz/linkflow.git
62
+ cd linkflow && npm install && npm run build
63
+
64
+ # or (when published)
65
+ npm install -g linkflow
66
+ ```
67
+
68
+ ## Quick start
69
+
70
+ ```bash
71
+ # 1. Create config
72
+ linkflow init
73
+
74
+ # 2. Edit linkflow.config.json + .env.local (AI endpoint)
75
+ # AI_BASE_URL=http://192.168.0.254:20128/v1 (OmniRoute)
76
+ # AI_API_KEY=... AI_MODEL=auto/best-free
77
+
78
+ # 3. Explore the database
79
+ linkflow stats
80
+ linkflow list --category startup --limit 10
81
+ linkflow search "product hunt"
82
+
83
+ # 4. Generate AI-tailored submission copy (no submission)
84
+ linkflow payload https://yoursite.com --directory "Future Tools"
85
+
86
+ # 5. Plan submissions (dry-run — nothing recorded)
87
+ linkflow submit https://yoursite.com --dry-run --limit 10
88
+
89
+ # 6. Real automation — Playwright browser submits for you
90
+ linkflow submit https://yoursite.com --go --limit 10
91
+
92
+ # 7. Track + report
93
+ linkflow status
94
+ linkflow report # → .linkflow/report.md (Submitator-style proof)
95
+ ```
96
+
97
+ ## Multiple sites, one tool
98
+
99
+ LinkFlow is generic — bring your own site config. Each product = one config file:
100
+
101
+ ```bash
102
+ # SaaS product
103
+ linkflow submit https://kreatorlane.com --config examples/linkflow.config.kreatorlane.json --category startup --go --limit 5
104
+
105
+ # Travel blog
106
+ linkflow submit https://chasingwhereabouts.com --config examples/linkflow.config.chasingwhereabouts.json --category travel --go --limit 5
107
+ ```
108
+
109
+ No hardcoded sites. Examples in `examples/`.
110
+
111
+ ---
112
+
113
+ ## Commands
114
+
115
+ | Command | Description |
116
+ |---|---|
117
+ | `linkflow list [--category X] [--limit N]` | List directories in the database |
118
+ | `linkflow search <query>` | Search directories by name/notes/URL |
119
+ | `linkflow submit <url> [--dry-run] [--limit N] [--category X] [--go] [--config file.json]` | Generate payloads + submit. `--go` = real Playwright automation |
120
+ | `linkflow payload <url> [--directory X]` | AI-tailored submission copy only |
121
+ | `linkflow status` | Tracker summary (submitted/pending/failed) |
122
+ | `linkflow report` | Regenerate proof-of-submission report |
123
+ | `linkflow stats` | Database stats (counts by category, alive/dead) |
124
+ | `linkflow db:review` | Flag DB quality issues (dead links, homepage-as-submit) |
125
+ | `linkflow db:regenerate` | Rebuild DB from source lists |
126
+ | `linkflow init` | Write config template |
127
+
128
+ ---
129
+
130
+ ## Database
131
+
132
+ ```
133
+ ai: 331 startup: 612 general: 80 travel: 26
134
+ ai-zh: 33 general-zh: 14 community: 13 reddit: 10 awesome: 4
135
+ TOTAL: 1,123 · auto-submittable: 183 · alive: 876 · dead: 221 · paid: 26
136
+ ```
137
+
138
+ Every URL was **live-verified** via concurrent HTTP + DNS resolution — 76 truly dead (DNS), 79 with dead submit paths (HTTP 404), 6 connection refused, 29 timeout-confirmed. Soft-errors (402/500/526) are flagged but not killed (may be transient).
139
+
140
+ **Source coverage** (11 lists, all credited in [CREDITS.md](./CREDITS.md)):
141
+
142
+ | Source | Stars | Type |
143
+ |---|---|---|
144
+ | [s87343472/backlink-pilot](https://github.com/s87343472/backlink-pilot) | ⭐348 | Base target set (rich metadata) |
145
+ | [mmccaff/PlacesToPostYourStartup](https://github.com/mmccaff/PlacesToPostYourStartup) | ⭐6,881 | Canonical "Ask HN" directory list |
146
+ | [theshubh77/awesome-saas-directories](https://github.com/theshubh77/awesome-saas-directories) | ⭐56 | SaaS launch platforms |
147
+ | [best-of-ai/ai-directories](https://github.com/best-of-ai/ai-directories) | ⭐868 | AI tool directories |
148
+ | [volodstaimi/Startup-Launch-List](https://github.com/volodstaimi/Startup-Launch-List) | ⭐8 | 580+ startup directories |
149
+ | [BossChow/ultimate-submit-list](https://github.com/BossChow/ultimate-submit-list) | ⭐151 | Top-100 directory table |
150
+ | [rushout09/directory-submission-sites](https://github.com/rushout09/directory-submission-sites) | ⭐12 | 250+ free sites |
151
+ | [submitdirectories/submitdirectories](https://github.com/submitdirectories/submitdirectories) | ⭐9 | AI/SaaS/Tool/Startup lists |
152
+ | [nilandev/startup-directories](https://github.com/nilandev/startup-directories) | ⭐26 | Subreddits + directories |
153
+ | [mahseema/awesome-saas-directories](https://github.com/mahseema/awesome-saas-directories) | ⭐242 | SaaS directories |
154
+ | [DirectorySurf/awesome-launch-platforms](https://github.com/DirectorySurf/awesome-launch-platforms) | ⭐252 | Launch platforms |
155
+
156
+ Per-entry provenance is in the data itself: `notes: [from <source>]` in the YAML.
157
+
158
+ ---
159
+
160
+ ## Configuration
161
+
162
+ `linkflow.config.json`:
163
+
164
+ ```json
165
+ {
166
+ "siteName": "My Product",
167
+ "siteUrl": "https://example.com",
168
+ "siteDescription": "A short, honest description.",
169
+ "tags": ["saas", "devtools"],
170
+ "contentDomain": "SaaS product",
171
+ "writingSample": "2-3 sentences in your site voice",
172
+ "ai": {
173
+ "provider": "openai",
174
+ "baseUrl": "http://192.168.0.254:20128/v1",
175
+ "apiKey": "your-omniroute-key",
176
+ "model": "auto/best-free",
177
+ "maxCallsPerRun": 20
178
+ },
179
+ "pacing": { "minSeconds": 60, "perDay": 10 }
180
+ }
181
+ ```
182
+
183
+ `.env.local` (overrides config):
184
+
185
+ ```bash
186
+ AI_PROVIDER=openai
187
+ AI_BASE_URL=http://192.168.0.254:20128/v1
188
+ AI_API_KEY=sk-...
189
+ AI_MODEL=auto/best-free
190
+ ```
191
+
192
+ Works with any OpenAI-compatible endpoint:
193
+ - [OmniRoute](https://github.com/...) (free, local)
194
+ - OpenAI, Anthropic, Groq, OpenRouter
195
+ - LM Studio, Ollama, vLLM (local)
196
+ - Any custom server
197
+
198
+ The AI client is **SSE-tolerant** — works with providers that stream even when `stream: false` is requested (OmniRoute).
199
+
200
+ ---
201
+
202
+ ## Database curation
203
+
204
+ The directory database is the product's moat. `scripts/regenerate-db.py` rebuilds it idempotently from the 11 source lists (annotated `[from <source>]`). `linkflow db:review` flags quality issues.
205
+
206
+ **Review verdict:**
207
+ - **1,123 entries**, 9 categories — full coverage from all 11 sources
208
+ - **876 verified alive** — every URL live-checked via `scripts/check-urls.py` (concurrent HTTP + DNS verification)
209
+ - **221 verified dead** — marked `status: dead` with reason
210
+ - **26 paid** — carry explicit `status: paid`
211
+ - **183 auto-submittable** (real form adapters via Playwright)
212
+ - **~420 "homepage-as-submit"** flags are alive directories whose real submit pages need discovery — ongoing curation task
213
+
214
+ **Curation workflow:**
215
+
216
+ ```bash
217
+ python3 scripts/check-urls.py /tmp/linkflow-urls.txt # live-check all URLs
218
+ python3 scripts/apply-urlcheck.py # mark verified-dead in DB
219
+ linkflow db:review # see remaining flags
220
+ linkflow db:regenerate # rebuild from sources (idempotent)
221
+ linkflow stats # confirm counts
222
+ ```
223
+
224
+ ---
225
+
226
+ ## The flow series
227
+
228
+ LinkFlow is the third in a series of zero-cost CLI tools, all MIT, all npm-published:
229
+
230
+ | Tool | Job | Engines | npm |
231
+ |---|---|---|---|
232
+ | **[SECflow](https://github.com/imsankz/SECflow)** | Security scanning for AI-driven repos | gitleaks, trivy, npm audit, custom regex | [`secflow`](https://www.npmjs.com/package/secflow) |
233
+ | **[SeoFlow](https://github.com/imsankz/seoflow)** | AI-powered SEO pipeline (audit, internal links, content gen, GSC) | GSC, PSI, Pexels, Ubersuggest, 6 LLMs | [`seoflow`](https://www.npmjs.com/package/seoflow) |
234
+ | **[LinkFlow](https://github.com/imsankz/linkflow)** | Backlink & directory submission automation | Your AI endpoint + Playwright | [`linkflow`](https://www.npmjs.com/package/linkflow) (this repo) |
235
+
236
+ Same DNA across all three: **free engines + your own AI agent as the "smart" layer + npm-published + zero-cost.**
237
+
238
+ ---
239
+
240
+ ## Architecture
241
+
242
+ ```
243
+ linkflow submit <url> --go
244
+
245
+ config loader (linkflow.config.json + .env.local)
246
+
247
+ payload generator (AI + template fallback)
248
+
249
+ database (1,123 directories, 9 categories)
250
+
251
+ for each target:
252
+
253
+ preflight HTTP check ── dead ──→ mark failed
254
+
255
+ launch Chromium ──→ navigate submit URL
256
+
257
+ detect fields (name/url/email/description)
258
+
259
+ site adapter (generic | saashub | ph)
260
+
261
+ fill + submit
262
+
263
+ verify (success message, redirect)
264
+
265
+ screenshot → .linkflow/proofs/
266
+
267
+ record → .linkflow/tracker.json
268
+
269
+ report → .linkflow/report.md
270
+
271
+ pacing → next directory (per-day limit)
272
+ ```
273
+
274
+ ```
275
+ src/
276
+ index.ts # CLI entry
277
+ config.ts # config + .env loader
278
+ database.ts # YAML loader + search
279
+ payload.ts # AI + template payload gen
280
+ ai.ts # OpenAI-compat client (SSE-tolerant)
281
+ tracker.ts # submission history
282
+ report.ts # proof-of-submission markdown
283
+ types.ts # shared interfaces
284
+ engine/
285
+ browser.ts # Playwright wrapper
286
+ fields.ts # smart field detection
287
+ adapters.ts # site-specific + generic adapter
288
+ submit.ts # orchestration: preflight → fill → verify
289
+
290
+ data/directories.yaml # 1,123 vetted directories
291
+ scripts/
292
+ regenerate-db.py # idempotent DB rebuild
293
+ review-db.py # quality flagger
294
+ check-urls.py # live URL checker
295
+ apply-urlcheck.py # mark verified-dead
296
+ sources/ # 18 vendored source files
297
+ examples/ # 2 example site configs
298
+ ```
299
+
300
+ ---
301
+
302
+ ## Roadmap
303
+
304
+ - [x] **v0.1** — directory DB, AI payloads, tracker, reports
305
+ - [x] **v0.2** — Playwright automation engine (`--go`), site adapters, pacing, proof screenshots
306
+ - [ ] **v0.3** — GitHub awesome-list PR generator, IndexNow pings
307
+ - [ ] **v0.4** — seoflow integration (measure backlinks before/after submission)
308
+ - [ ] **v0.5** — Badge-handling component (the Submitator moat we haven't replicated)
309
+
310
+ ---
311
+
312
+ ## License
313
+
314
+ MIT (see [LICENSE](./LICENSE)). Source data compiled from 11 open-source projects — see [CREDITS.md](./CREDITS.md) for per-source licenses and provenance.
315
+
316
+ ---
317
+
318
+ ## ☕ Support
319
+
320
+ LinkFlow is free forever. If it saves you $79 (or 40 hours), [buy me a coffee](https://ko-fi.com/chasingwhereabouts) — it funds more free tools.
@@ -0,0 +1,22 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * LinkFlow CLI launcher.
4
+ * Resolves the built dist/index.js and runs it as the CLI.
5
+ */
6
+ import { createRequire } from 'module';
7
+ import path from 'path';
8
+ import { fileURLToPath } from 'url';
9
+
10
+ const require = createRequire(import.meta.url);
11
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
12
+
13
+ // Prefer dist build; fall back to src via tsx if not built (dev mode)
14
+ try {
15
+ await import(path.join(__dirname, '..', 'dist', 'index.js'));
16
+ } catch (err) {
17
+ if (err.code === 'ERR_MODULE_NOT_FOUND' || err.code === 'ERR_REQUIRE_ESM') {
18
+ console.error('LinkFlow: dist not built. Run `npm run build` first.');
19
+ process.exit(1);
20
+ }
21
+ throw err;
22
+ }