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 +63 -0
- package/LICENSE +21 -0
- package/README.md +320 -0
- package/bin/linkflow.js +22 -0
- package/data/directories.yaml +7175 -0
- package/dist/ai.js +100 -0
- package/dist/ai.js.map +7 -0
- package/dist/config.js +47 -0
- package/dist/config.js.map +7 -0
- package/dist/database.js +66 -0
- package/dist/database.js.map +7 -0
- package/dist/directories.yaml +7175 -0
- package/dist/engine/adapters.js +90 -0
- package/dist/engine/adapters.js.map +7 -0
- package/dist/engine/browser.js +59 -0
- package/dist/engine/browser.js.map +7 -0
- package/dist/engine/fields.js +58 -0
- package/dist/engine/fields.js.map +7 -0
- package/dist/engine/submit.js +90 -0
- package/dist/engine/submit.js.map +7 -0
- package/dist/index.js +273 -0
- package/dist/index.js.map +7 -0
- package/dist/payload.js +63 -0
- package/dist/payload.js.map +7 -0
- package/dist/report.js +42 -0
- package/dist/report.js.map +7 -0
- package/dist/tracker.js +46 -0
- package/dist/tracker.js.map +7 -0
- package/dist/types.js +1 -0
- package/dist/types.js.map +7 -0
- package/llms.txt +13 -0
- package/package.json +50 -0
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)
|
|
8
|
+
[](./package.json)
|
|
9
|
+
[](#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.
|
package/bin/linkflow.js
ADDED
|
@@ -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
|
+
}
|