git-paid 2.1.8 → 2.1.9

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/README.md CHANGED
@@ -46,7 +46,7 @@ git paid https://your-app.com
46
46
  | :--- | :--- | :--- |
47
47
  | **Technical & AI Search SEO** | Hand-writing meta tags, JSON-LD, and crawler rules | Writes `robots.txt` (`OAI-SearchBot`, `PerplexityBot`, `ClaudeBot`), `sitemap.xml`, `llms.txt`, and `SoftwareApplication` JSON-LD in 1 command |
48
48
  | **25 Structured SEO Pages** | Days of keyword research and static page coding | Pre-renders 25 `/use-cases/*`, `/compare/*`, `/calculators/*`, `/guides/*`, `/templates/*`, `/alternatives/*`, and `/checklists/*` HTML landing pages |
49
- | **85-Directory Launch Kit** | Hours of repetitive copy-pasting & UTM tagging | Synthesizes Show HN / Product Hunt / directory copy, generates 85 prefilled submission links, and pings IndexNow & WebSub |
49
+ | **85-Directory Launch Kit** | Hours of repetitive copy-pasting & UTM tagging | Synthesizes Show HN / Product Hunt / directory copy across 74 curated directories & 11 launch communities (13 URL auto-prefilled links + 72 standalone web forms), and pings IndexNow & WebSub |
50
50
  | **Verification Inbox (`@postbuild.dev`)** | Clutters personal inbox with 85+ confirmation emails | Provisions isolated `<slug>-<hash>@postbuild.dev`, extracts 6-digit OTPs, and surfaces confirmation links |
51
51
  | **Self-Serve Stripe Checkout Gate** | Custom billing boilerplate | Drop-in `<CheckoutGate />` component + `/api/checkout.js` server route template |
52
52
 
package/bin/git-paid.js CHANGED
@@ -283,14 +283,25 @@ async function runCli() {
283
283
  process.exit(0);
284
284
  }
285
285
 
286
+ const publishPseoToPublic = args.includes("--publish-pages");
286
287
  const fixResult = applyLocalSeoFixes(report, {
287
288
  cwd: process.cwd(),
288
289
  overwritePublic: args.includes("--force"),
289
- publishPseoToPublic: args.includes("--publish-pages"),
290
+ publishPseoToPublic,
290
291
  verificationToken: license.verificationToken || ""
291
292
  });
292
293
 
293
294
  console.log(`\n --- Local Repository Auto-Fix (${fixResult.framework} — Licensed to ${license.email}) ---`);
295
+ if (Array.isArray(fixResult.overwrittenPublicFiles) && fixResult.overwrittenPublicFiles.length > 0) {
296
+ for (const ov of fixResult.overwrittenPublicFiles) {
297
+ console.log(` [OVERWRITE] Updated existing file: ${ov}`);
298
+ }
299
+ }
300
+ if (publishPseoToPublic) {
301
+ console.log(
302
+ ` [NOTICE] --publish-pages wrote 25 starter templates into ${fixResult.publicDir}/ with <meta name="robots" content="noindex" />. Customize each page and remove noindex before indexing.`
303
+ );
304
+ }
294
305
  for (const f of fixResult.writtenFiles) {
295
306
  console.log(` [WRITE] ${f.path.padEnd(36)} (${f.role})`);
296
307
  }
package/lib/auth.js CHANGED
@@ -246,6 +246,7 @@ export function upsertEntitlement({
246
246
  if (cleanEmail) {
247
247
  memoryEntitlements.set(`email:${cleanEmail}`, record);
248
248
  memoryEntitlements.set(`email:${cleanEmail}:${plan}`, record);
249
+ memoryEntitlements.set(`email:${cleanEmail}:domain:${cleanDomain}`, record);
249
250
  }
250
251
  if (customerId) {
251
252
  memoryEntitlements.set(`cust:${customerId}`, record);
@@ -299,18 +300,36 @@ export function updateEntitlementStatus({
299
300
  return updated;
300
301
  }
301
302
 
302
- export function getEntitlement({ jti, email, customerId, plan = null } = {}) {
303
+ export function getEntitlement({ jti, email, customerId, plan = null, domain = null } = {}) {
304
+ const cleanDomain = domain
305
+ ? String(domain)
306
+ .toLowerCase()
307
+ .trim()
308
+ .replace(/^https?:\/\//, "")
309
+ .replace(/^www\./, "")
310
+ .split("/")[0]
311
+ .split(":")[0]
312
+ : "";
303
313
  if (jti && memoryEntitlements.has(`jti:${jti}`)) {
304
314
  return memoryEntitlements.get(`jti:${jti}`);
305
315
  }
306
316
  if (email) {
307
317
  const cleanEmail = String(email).toLowerCase().trim();
318
+ if (cleanDomain && memoryEntitlements.has(`email:${cleanEmail}:domain:${cleanDomain}`)) {
319
+ return memoryEntitlements.get(`email:${cleanEmail}:domain:${cleanDomain}`);
320
+ }
308
321
  if (plan && memoryEntitlements.has(`email:${cleanEmail}:${plan}`)) {
309
- return memoryEntitlements.get(`email:${cleanEmail}:${plan}`);
322
+ const rec = memoryEntitlements.get(`email:${cleanEmail}:${plan}`);
323
+ if (!cleanDomain || rec.domain === cleanDomain || rec.status !== "active") {
324
+ return rec;
325
+ }
310
326
  }
311
327
  if (memoryEntitlements.has(`email:${cleanEmail}`)) {
312
328
  const rec = memoryEntitlements.get(`email:${cleanEmail}`);
313
- if (!plan || !rec.plan || rec.plan === plan || rec.status === "revoked" || rec.status === "suspended") {
329
+ if (
330
+ (!plan || !rec.plan || rec.plan === plan || rec.status === "revoked" || rec.status === "suspended") &&
331
+ (!cleanDomain || rec.domain === cleanDomain || rec.status !== "active")
332
+ ) {
314
333
  return rec;
315
334
  }
316
335
  }
@@ -329,8 +348,8 @@ export function getEntitlement({ jti, email, customerId, plan = null } = {}) {
329
348
  return null;
330
349
  }
331
350
 
332
- export function isEntitlementRevoked({ jti, email, customerId, plan = null } = {}) {
333
- const rec = getEntitlement({ jti, email, customerId, plan });
351
+ export function isEntitlementRevoked({ jti, email, customerId, plan = null, domain = null } = {}) {
352
+ const rec = getEntitlement({ jti, email, customerId, plan, domain });
334
353
  if (!rec) return false;
335
354
  return rec.status !== "active";
336
355
  }
@@ -481,7 +500,7 @@ export function signLicenseToken({
481
500
  domain = "postbuild.dev",
482
501
  jti = "",
483
502
  customerId = null,
484
- emailVerified = true,
503
+ emailVerified = false,
485
504
  ttlSeconds = 365 * 24 * 3600
486
505
  }) {
487
506
  const secret = requireAuthSecret();
@@ -815,7 +834,7 @@ export async function sendLicenseFulfillmentEmail({ email, licenseToken, planId,
815
834
  <ol style="margin: 0; padding-left: 18px; color: #475569; font-size: 13px; line-height: 1.6;">
816
835
  <li style="margin-bottom: 6px;"><strong>Deploy Your .zip Launch Bundle:</strong> Click <em>Download .zip</em> on your Account tab (includes <code>START_HERE.md</code>, <code>public/.well-known/postbuild-verify.txt</code>, starter HTML SEO pages, and <code>directories-85.csv</code>) and deploy to <code>${safeDomain}</code>.</li>
817
836
  <li style="margin-bottom: 6px;"><strong>Verify Domain Ownership:</strong> ${autoVerifiedByEmail ? `Confirm your <code>@${safeDomain}</code> email once on your Account tab (or paste the license key below) to open <code>${inbox}</code>.` : `Click <em>Verify Domain Now</em> on your Account tab after deploying your bundle (or adding the meta tag / DNS TXT record) and keep it in place to unlock <code>${inbox}</code>.`}</li>
818
- <li><strong>Submit to 85 Directories:</strong> Launch prefilled directory links from the Dispatch tab or <code>directories-85.csv</code> using <code>${inbox}</code> — 6-digit OTPs and confirmation links arrive in your Account Inbox.</li>
837
+ <li><strong>Submit Across 85 Directories &amp; Communities:</strong> Launch links from the Dispatch tab or <code>directories-85.csv</code> using <code>${inbox}</code> — 6-digit OTPs and confirmation links arrive in your Account Inbox.</li>
819
838
  </ol>
820
839
  </div>
821
840
 
@@ -894,8 +913,15 @@ export async function checkStripeCustomerStatusCached(verified) {
894
913
  return "active";
895
914
  }
896
915
 
897
- export async function authenticateUser({ email, token, sessionId, otpCode, challengeToken }) {
916
+ export async function authenticateUser({ email, token, sessionId, otpCode, challengeToken, domain: requestedDomain = "" }) {
898
917
  const founderEmails = getFounderEmailsSet();
918
+ const cleanRequestedDomain = String(requestedDomain || "")
919
+ .toLowerCase()
920
+ .trim()
921
+ .replace(/^https?:\/\//, "")
922
+ .replace(/^www\./, "")
923
+ .split("/")[0]
924
+ .split(":")[0];
899
925
 
900
926
  // 1. Verify existing pb_live_ token via HMAC-SHA256 + revocation check + 60s Stripe Customer pb_status check
901
927
  if (token && token.startsWith("pb_live_")) {
@@ -933,12 +959,17 @@ export async function authenticateUser({ email, token, sessionId, otpCode, chall
933
959
  if (!check.valid) {
934
960
  return { ok: false, authenticated: false, error: check.error || "Invalid verification code." };
935
961
  }
936
- if (isEntitlementRevoked({ email: check.email, customerId: check.customerId, plan: check.plan })) {
962
+ if (isEntitlementRevoked({ email: check.email, customerId: check.customerId, plan: check.plan, domain: check.domain })) {
937
963
  return { ok: false, authenticated: false, error: "This license entitlement has been revoked or refunded." };
938
964
  }
939
- const existingEnt = getEntitlement({ email: check.email, customerId: check.customerId, plan: check.plan });
965
+ const existingEnt = getEntitlement({
966
+ email: check.email,
967
+ customerId: check.customerId,
968
+ plan: check.plan,
969
+ domain: check.domain
970
+ });
940
971
  const plan = existingEnt?.plan || check.plan || "launch_pass";
941
- const domain = existingEnt?.domain || check.domain || "postbuild.dev";
972
+ const domain = check.domain || existingEnt?.domain || "postbuild.dev";
942
973
  const customerId = existingEnt?.customerId || check.customerId || null;
943
974
  const issued = signLicenseToken({ email: check.email, plan, domain, customerId, emailVerified: true });
944
975
  return {
@@ -988,7 +1019,7 @@ export async function authenticateUser({ email, token, sessionId, otpCode, chall
988
1019
  const customerObj = session.customer && typeof session.customer === "object" ? session.customer : null;
989
1020
  const customerId = typeof session.customer === "string" ? session.customer : customerObj?.id || null;
990
1021
  const custStatus = customerObj?.metadata?.pb_status || "active";
991
- if (custStatus !== "active" || isEntitlementRevoked({ email: custEmail, customerId, plan })) {
1022
+ if (custStatus !== "active" || isEntitlementRevoked({ email: custEmail, customerId, plan, domain })) {
992
1023
  return { ok: false, authenticated: false, error: "This license entitlement has been revoked or refunded." };
993
1024
  }
994
1025
  const newToken = signLicenseToken({ email: custEmail, plan, domain, customerId, emailVerified: false });
@@ -1025,7 +1056,17 @@ export async function authenticateUser({ email, token, sessionId, otpCode, chall
1025
1056
  let isExplicitlyRevoked = false;
1026
1057
  let anyCustomerHadPbStatus = false;
1027
1058
 
1028
- const localEnt = getEntitlement({ email: cleanEmail });
1059
+ // Review 10 Finding 4: Skip Stripe customer loop for operator emails so test purchases (e.g. cal.com) never hijack operator sign-in
1060
+ if (founderEmails.has(cleanEmail) && (!cleanRequestedDomain || cleanRequestedDomain === "postbuild.dev")) {
1061
+ hasActivePurchase = true;
1062
+ resolvedPlan = "studio_monthly";
1063
+ resolvedDomain = "postbuild.dev";
1064
+ }
1065
+
1066
+ const localEnt = !hasActivePurchase
1067
+ ? getEntitlement({ email: cleanEmail, domain: cleanRequestedDomain || null }) ||
1068
+ getEntitlement({ email: cleanEmail })
1069
+ : null;
1029
1070
  if (localEnt && (localEnt.status === "revoked" || localEnt.status === "suspended")) {
1030
1071
  isExplicitlyRevoked = true;
1031
1072
  } else if (localEnt && localEnt.status === "active") {
@@ -1039,26 +1080,31 @@ export async function authenticateUser({ email, token, sessionId, otpCode, chall
1039
1080
  try {
1040
1081
  const customers = await stripe.customers.list({ email: cleanEmail, limit: 10 });
1041
1082
  if (Array.isArray(customers?.data)) {
1083
+ const activeCustomers = [];
1042
1084
  for (const cust of customers.data) {
1043
1085
  const pbStatus = cust.metadata?.pb_status;
1044
1086
  if (pbStatus) {
1045
1087
  anyCustomerHadPbStatus = true;
1046
1088
  }
1047
- if (pbStatus === "revoked" || pbStatus === "suspended") {
1048
- // Do not break early in case a legitimate active customerId exists for this email
1049
- continue;
1050
- }
1051
- if (pbStatus === "cancelled") {
1089
+ if (pbStatus === "revoked" || pbStatus === "suspended" || pbStatus === "cancelled") {
1052
1090
  continue;
1053
1091
  }
1054
1092
  if (!pbStatus || pbStatus === "active") {
1055
- hasActivePurchase = true;
1056
- resolvedCustomerId = cust.id;
1057
- resolvedPlan = cust.metadata?.pb_plan || "launch_pass";
1058
- resolvedDomain = cust.metadata?.pb_domain || "postbuild.dev";
1059
- break;
1093
+ activeCustomers.push(cust);
1060
1094
  }
1061
1095
  }
1096
+ const matchedCust =
1097
+ (cleanRequestedDomain
1098
+ ? activeCustomers.find(
1099
+ (c) => String(c.metadata?.pb_domain || "").toLowerCase().trim() === cleanRequestedDomain
1100
+ )
1101
+ : null) || activeCustomers[0];
1102
+ if (matchedCust) {
1103
+ hasActivePurchase = true;
1104
+ resolvedCustomerId = matchedCust.id;
1105
+ resolvedPlan = matchedCust.metadata?.pb_plan || "launch_pass";
1106
+ resolvedDomain = matchedCust.metadata?.pb_domain || "postbuild.dev";
1107
+ }
1062
1108
  }
1063
1109
  } catch {}
1064
1110
 
@@ -1071,7 +1117,16 @@ export async function authenticateUser({ email, token, sessionId, otpCode, chall
1071
1117
  s.payment_status !== "unpaid" &&
1072
1118
  (s.customer_details?.email || s.customer_email || "").toLowerCase().trim() === cleanEmail
1073
1119
  );
1120
+ const domainMatchedSession = cleanRequestedDomain
1121
+ ? matchingSessions.find(
1122
+ (s) =>
1123
+ String(s.client_reference_id || s.metadata?.target_domain || "")
1124
+ .toLowerCase()
1125
+ .trim() === cleanRequestedDomain
1126
+ )
1127
+ : null;
1074
1128
  const preferred =
1129
+ domainMatchedSession ||
1075
1130
  matchingSessions.find((s) => s.mode === "payment" || s.metadata?.plan_id === "launch_pass") ||
1076
1131
  matchingSessions[0];
1077
1132
  if (preferred) {
@@ -1,101 +1,102 @@
1
- // Complete 85-Directory Database for Postbuild (postbuild.dev)
1
+ // Complete 85-Entry Launch Database for Postbuild (postbuild.dev)
2
+ // Comprises 74 Curated Software, AI & Business Directories + 11 Launch Communities.
2
3
  // Every entry points to a direct submission form path or native URL-prefillable launch endpoint (zero root homepages or dead domains).
3
4
 
4
5
  export const DIRECTORIES = [
5
- // Tier 1: Flagship Launch Boards & URL-Prefillable Communities (1-15)
6
- { id: "dir-01", name: "Hacker News (Show HN)", url: "https://news.ycombinator.com/submit", dr: 92, category: "Developer Community", authType: "URL Prefill + Account", autoSubmit: false, prefillMode: "url_params" },
7
- { id: "dir-02", name: "Reddit r/SideProject", url: "https://www.reddit.com/r/SideProject/submit", dr: 91, category: "Launch Board", authType: "URL Prefill + Account", autoSubmit: false, prefillMode: "url_params" },
8
- { id: "dir-03", name: "Product Hunt", url: "https://www.producthunt.com/posts/new", dr: 91, category: "Launch Board", authType: "OAuth / Magic Link", autoSubmit: false, prefillMode: "clipboard_form" },
9
- { id: "dir-04", name: "BetaList", url: "https://betalist.com/submissions/new", dr: 76, category: "Early Adopters", authType: "Email Verification", autoSubmit: true, prefillMode: "clipboard_form" },
10
- { id: "dir-05", name: "SaaSHub", url: "https://www.saashub.com/submit", dr: 77, category: "Software Directory", authType: "OTP (@postbuild.dev)", autoSubmit: true, prefillMode: "clipboard_form" },
11
- { id: "dir-06", name: "AlternativeTo", url: "https://alternativeto.net/add-application/", dr: 86, category: "Software Discovery", authType: "OTP (@postbuild.dev)", autoSubmit: true, prefillMode: "clipboard_form" },
12
- { id: "dir-07", name: "There's An AI For That", url: "https://theresanaiforthat.com/submit/", dr: 82, category: "AI Directory", authType: "OTP (@postbuild.dev)", autoSubmit: true, prefillMode: "clipboard_form" },
13
- { id: "dir-08", name: "FutureTools.io", url: "https://futuretools.io/submit-a-tool", dr: 75, category: "AI Directory", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form" },
14
- { id: "dir-09", name: "Indie Hackers Launch", url: "https://www.indiehackers.com/new-post", dr: 81, category: "Indie SaaS", authType: "Email Link", autoSubmit: true, prefillMode: "clipboard_form" },
15
- { id: "dir-10", name: "Toolify.ai", url: "https://www.toolify.ai/submit", dr: 74, category: "AI Directory", authType: "Direct Form + Email", autoSubmit: true, prefillMode: "clipboard_form" },
16
- { id: "dir-11", name: "G2 Software", url: "https://www.g2.com/products/new", dr: 90, category: "B2B Software", authType: "Work Email (@postbuild.dev)", autoSubmit: true, prefillMode: "clipboard_form" },
17
- { id: "dir-12", name: "Reddit r/indiehackers", url: "https://www.reddit.com/r/indiehackers/submit", dr: 91, category: "Indie SaaS", authType: "URL Prefill + Account", autoSubmit: false, prefillMode: "url_params" },
18
- { id: "dir-13", name: "SourceForge", url: "https://sourceforge.net/create/", dr: 91, category: "Developer Tools", authType: "OTP (@postbuild.dev)", autoSubmit: true, prefillMode: "clipboard_form" },
19
- { id: "dir-14", name: "Slashdot Submission", url: "https://slashdot.org/submission", dr: 89, category: "Developer Community", authType: "URL Prefill Form", autoSubmit: true, prefillMode: "url_params" },
20
- { id: "dir-15", name: "StackShare", url: "https://stackshare.io/submit", dr: 82, category: "Developer Stack", authType: "GitHub / Email", autoSubmit: false, prefillMode: "clipboard_form" },
6
+ // Tier 1: Flagship Directories & Launch Boards (1-15)
7
+ { id: "dir-01", name: "Hacker News (Show HN)", url: "https://news.ycombinator.com/submit", dr: 92, category: "Developer Community", authType: "URL Prefill + Account", autoSubmit: false, prefillMode: "url_params", listingType: "community", pricing: "Free", communityRule: "Use 'Show HN:' prefix and explain the technical architecture in the first comment." },
8
+ { id: "dir-02", name: "Reddit r/SideProject", url: "https://www.reddit.com/r/SideProject/submit", dr: 91, category: "Launch Community", authType: "URL Prefill + Account", autoSubmit: false, prefillMode: "url_params", listingType: "community", pricing: "Free", communityRule: "Post in 1–2 subreddits max per week; never cross-post identical links on the same day." },
9
+ { id: "dir-03", name: "Product Hunt", url: "https://www.producthunt.com/posts/new", dr: 91, category: "Launch Directory", authType: "OAuth / Magic Link", autoSubmit: false, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
10
+ { id: "dir-04", name: "BetaList", url: "https://betalist.com/submissions/new", dr: 76, category: "Early Adopters", authType: "Email Verification", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free + Paid" },
11
+ { id: "dir-05", name: "SaaSHub", url: "https://www.saashub.com/submit", dr: 77, category: "Software Directory", authType: "OTP (@postbuild.dev)", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
12
+ { id: "dir-06", name: "AlternativeTo", url: "https://alternativeto.net/add-application/", dr: 86, category: "Software Discovery", authType: "OTP (@postbuild.dev)", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
13
+ { id: "dir-07", name: "There's An AI For That", url: "https://theresanaiforthat.com/submit/", dr: 82, category: "AI Directory", authType: "OTP (@postbuild.dev)", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free + Paid" },
14
+ { id: "dir-08", name: "FutureTools.io", url: "https://futuretools.io/submit-a-tool", dr: 75, category: "AI Directory", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
15
+ { id: "dir-09", name: "Indie Hackers Launch", url: "https://www.indiehackers.com/new-post", dr: 81, category: "Founder Community", authType: "Email Link", autoSubmit: false, prefillMode: "clipboard_form", listingType: "community", pricing: "Free", communityRule: "Share a genuine build milestone or lesson learned rather than promotional copy." },
16
+ { id: "dir-10", name: "Toolify.ai", url: "https://www.toolify.ai/submit", dr: 74, category: "AI Directory", authType: "Direct Form + Email", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free + Paid" },
17
+ { id: "dir-11", name: "G2 Software", url: "https://www.g2.com/products/new", dr: 90, category: "B2B Software", authType: "Work Email (Your Domain)", autoSubmit: false, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
18
+ { id: "dir-12", name: "Reddit r/indiehackers", url: "https://www.reddit.com/r/indiehackers/submit", dr: 91, category: "Founder Community", authType: "URL Prefill + Account", autoSubmit: false, prefillMode: "url_params", listingType: "community", pricing: "Free", communityRule: "Check subreddit self-promotion guidelines; space out Reddit posts by several days." },
19
+ { id: "dir-13", name: "SourceForge", url: "https://sourceforge.net/create/", dr: 91, category: "Software Directory", authType: "OTP (@postbuild.dev)", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
20
+ { id: "dir-14", name: "Slashdot Submission", url: "https://slashdot.org/submission", dr: 89, category: "Developer Community", authType: "URL Prefill Form", autoSubmit: true, prefillMode: "url_params", listingType: "community", pricing: "Free", communityRule: "Best suited for open-source releases, developer tools, or technical benchmarks." },
21
+ { id: "dir-15", name: "StackShare", url: "https://stackshare.io/submit", dr: 82, category: "Developer Stack", authType: "GitHub / Email", autoSubmit: false, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
21
22
 
22
- // Tier 2: Developer, CLI & Open-Source Directories (16-30)
23
- { id: "dir-16", name: "DevHunt", url: "https://devhunt.org/login", dr: 68, category: "Developer Tools", authType: "GitHub / Email", autoSubmit: false, prefillMode: "clipboard_form" },
24
- { id: "dir-17", name: "OpenAlternative", url: "https://openalternative.co/submit", dr: 66, category: "Open Source", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form" },
25
- { id: "dir-18", name: "Console.dev", url: "https://console.dev/selection-criteria", dr: 69, category: "Developer Tools", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form" },
26
- { id: "dir-19", name: "Lobste.rs", url: "https://lobste.rs/stories/new", dr: 76, category: "Developer Community", authType: "URL Prefill + Account", autoSubmit: false, prefillMode: "url_params" },
27
- { id: "dir-20", name: "Awesome Indie (GitHub)", url: "https://github.com/mezod/awesome-indie/issues/new", dr: 96, category: "Open Source", authType: "URL Prefill Issue", autoSubmit: false, prefillMode: "url_params" },
28
- { id: "dir-21", name: "Free-for-Dev (GitHub)", url: "https://github.com/ripienaar/free-for-dev/pulls", dr: 96, category: "Developer Tools", authType: "GitHub PR", autoSubmit: false, prefillMode: "clipboard_form" },
29
- { id: "dir-22", name: "Dev.to Launch Post", url: "https://dev.to/new", dr: 88, category: "Developer Feed", authType: "Account Session", autoSubmit: false, prefillMode: "clipboard_form" },
30
- { id: "dir-23", name: "Hashnode Launch Story", url: "https://hashnode.com/create/story", dr: 84, category: "Developer Feed", authType: "Account Session", autoSubmit: false, prefillMode: "clipboard_form" },
31
- { id: "dir-24", name: "Reddit r/devtools", url: "https://www.reddit.com/r/devtools/submit", dr: 91, category: "Developer Tools", authType: "URL Prefill + Account", autoSubmit: false, prefillMode: "url_params" },
32
- { id: "dir-25", name: "Reddit r/opensource", url: "https://www.reddit.com/r/opensource/submit", dr: 91, category: "Open Source", authType: "URL Prefill + Account", autoSubmit: false, prefillMode: "url_params" },
33
- { id: "dir-26", name: "Reddit r/commandline", url: "https://www.reddit.com/r/commandline/submit", dr: 91, category: "CLI & Terminal", authType: "URL Prefill + Account", autoSubmit: false, prefillMode: "url_params" },
34
- { id: "dir-27", name: "Reddit r/selfhosted", url: "https://www.reddit.com/r/selfhosted/submit", dr: 91, category: "Self-Hosted / Dev", authType: "URL Prefill + Account", autoSubmit: false, prefillMode: "url_params" },
35
- { id: "dir-28", name: "Selfh.st", url: "https://selfh.st/submit/", dr: 62, category: "Self-Hosted / Dev", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form" },
36
- { id: "dir-29", name: "Reddit r/coolgithubprojects", url: "https://www.reddit.com/r/coolgithubprojects/submit", dr: 91, category: "Open Source", authType: "URL Prefill + Account", autoSubmit: false, prefillMode: "url_params" },
37
- { id: "dir-30", name: "TerminalTrove", url: "https://terminaltrove.com/submit/", dr: 58, category: "CLI & Terminal", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form" },
23
+ // Tier 2: Developer, Open-Source & B2B Directories (16-30)
24
+ { id: "dir-16", name: "DevHunt", url: "https://devhunt.org/login", dr: 68, category: "Developer Tools", authType: "GitHub / Email", autoSubmit: false, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
25
+ { id: "dir-17", name: "OpenAlternative", url: "https://openalternative.co/submit", dr: 66, category: "Open Source", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
26
+ { id: "dir-18", name: "Awesome OSS Alternatives", url: "https://github.com/RunaCapital/awesome-oss-alternatives/issues/new", dr: 96, category: "Open Source", authType: "URL Prefill Issue", autoSubmit: false, prefillMode: "url_params", listingType: "directory", pricing: "Free" },
27
+ { id: "dir-19", name: "Lobste.rs", url: "https://lobste.rs/stories/new", dr: 76, category: "Developer Community", authType: "URL Prefill + Account", autoSubmit: false, prefillMode: "url_params", listingType: "community", pricing: "Free", communityRule: "Requires an existing Lobste.rs member account; use the 'show' tag for your own work." },
28
+ { id: "dir-20", name: "Awesome Indie (GitHub)", url: "https://github.com/mezod/awesome-indie/issues/new", dr: 96, category: "Indie Directory", authType: "URL Prefill Issue", autoSubmit: false, prefillMode: "url_params", listingType: "directory", pricing: "Free" },
29
+ { id: "dir-21", name: "Awesome Generative AI", url: "https://github.com/steven2358/awesome-generative-ai/issues/new", dr: 96, category: "AI Directory", authType: "URL Prefill Issue", autoSubmit: false, prefillMode: "url_params", listingType: "directory", pricing: "Free" },
30
+ { id: "dir-22", name: "Dev.to Launch Post", url: "https://dev.to/new", dr: 88, category: "Developer Community", authType: "Account Session", autoSubmit: false, prefillMode: "clipboard_form", listingType: "community", pricing: "Free", communityRule: "Publish a technical build-log or tutorial rather than a short link post." },
31
+ { id: "dir-23", name: "Hashnode Launch Story", url: "https://hashnode.com/create/story", dr: 84, category: "Developer Community", authType: "Account Session", autoSubmit: false, prefillMode: "clipboard_form", listingType: "community", pricing: "Free", communityRule: "Write an engineering article explaining how you built the product." },
32
+ { id: "dir-24", name: "SpotSaaS Directory", url: "https://www.spotsaas.com/get-listed", dr: 64, category: "SaaS Directory", authType: "Direct Form + Email", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
33
+ { id: "dir-25", name: "SelectedFirms Directory", url: "https://selectedfirms.co/get-listed", dr: 67, category: "B2B Directory", authType: "Email Verification", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
34
+ { id: "dir-26", name: "B2B Stack Directory", url: "https://www.b2bstack.com.br/cadastrar-solucao", dr: 63, category: "B2B Software", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
35
+ { id: "dir-27", name: "AITools.inc Directory", url: "https://aitools.inc/submit", dr: 62, category: "AI Directory", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free + Paid" },
36
+ { id: "dir-28", name: "Selfh.st Directory", url: "https://selfh.st/submit/", dr: 62, category: "Self-Hosted / Dev", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
37
+ { id: "dir-29", name: "Active Search Results", url: "https://www.activesearchresults.com/addwebsite.php", dr: 65, category: "Web Directory", authType: "Email Verification", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
38
+ { id: "dir-30", name: "TerminalTrove", url: "https://terminaltrove.com/submit/", dr: 58, category: "CLI & Terminal", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
38
39
 
39
- // Tier 3: Indie Launch & Maker Platforms (31-50)
40
- { id: "dir-31", name: "Uneed.best", url: "https://www.uneed.best/submit-a-tool", dr: 64, category: "Indie Launch", authType: "Magic Link (@postbuild.dev)", autoSubmit: true, prefillMode: "clipboard_form" },
41
- { id: "dir-32", name: "MicroLaunch", url: "https://microlaunch.net/premium", dr: 59, category: "Indie Launch", authType: "OTP (@postbuild.dev)", autoSubmit: true, prefillMode: "clipboard_form" },
42
- { id: "dir-33", name: "TinyLaunch", url: "https://www.tinylaunch.com/submit", dr: 54, category: "Indie Launch", authType: "Direct Form + Email", autoSubmit: true, prefillMode: "clipboard_form" },
43
- { id: "dir-34", name: "Launching Next", url: "https://www.launchingnext.com/submit/", dr: 67, category: "Startup Directory", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form" },
44
- { id: "dir-35", name: "SideProjectors", url: "https://www.sideprojectors.com/project/submit", dr: 62, category: "Side Projects", authType: "Email Verification", autoSubmit: true, prefillMode: "clipboard_form" },
45
- { id: "dir-36", name: "StartupBase", url: "https://startupbase.io/submit", dr: 61, category: "Startup Directory", authType: "OTP (@postbuild.dev)", autoSubmit: true, prefillMode: "clipboard_form" },
46
- { id: "dir-37", name: "Peerlist Launchpad", url: "https://peerlist.io/launchpad", dr: 74, category: "Maker Network", authType: "OTP (@postbuild.dev)", autoSubmit: true, prefillMode: "clipboard_form" },
47
- { id: "dir-38", name: "Reddit r/MicroSaaS", url: "https://www.reddit.com/r/MicroSaaS/submit", dr: 91, category: "Indie SaaS", authType: "URL Prefill + Account", autoSubmit: false, prefillMode: "url_params" },
48
- { id: "dir-39", name: "Fazier", url: "https://fazier.com/launch", dr: 56, category: "Indie Launch", authType: "Magic Link (@postbuild.dev)", autoSubmit: true, prefillMode: "clipboard_form" },
49
- { id: "dir-40", name: "Reddit r/SaaS", url: "https://www.reddit.com/r/SaaS/submit", dr: 91, category: "SaaS Directory", authType: "URL Prefill + Account", autoSubmit: false, prefillMode: "url_params" },
50
- { id: "dir-41", name: "Reddit r/AlphaAndBetaUsers", url: "https://www.reddit.com/r/AlphaAndBetaUsers/submit", dr: 91, category: "Early Adopters", authType: "URL Prefill + Account", autoSubmit: false, prefillMode: "url_params" },
51
- { id: "dir-42", name: "Reddit r/roastmystartup", url: "https://www.reddit.com/r/roastmystartup/submit", dr: 91, category: "Startup Reviews", authType: "URL Prefill + Account", autoSubmit: false, prefillMode: "url_params" },
52
- { id: "dir-43", name: "StartupBuffer", url: "https://startupbuffer.com/site/submit", dr: 60, category: "Startup Directory", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form" },
53
- { id: "dir-44", name: "StartupStash", url: "https://startupstash.com/add-listing/", dr: 72, category: "Startup Resources", authType: "Direct Form + Email", autoSubmit: true, prefillMode: "clipboard_form" },
54
- { id: "dir-45", name: "KillerStartups", url: "https://killerstartups.com/submit-startup/", dr: 71, category: "Startup Reviews", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form" },
55
- { id: "dir-46", name: "Reddit r/EntrepreneurRideAlong", url: "https://www.reddit.com/r/EntrepreneurRideAlong/submit", dr: 91, category: "Indie Founders", authType: "URL Prefill + Account", autoSubmit: false, prefillMode: "url_params" },
56
- { id: "dir-47", name: "Reddit r/startups", url: "https://www.reddit.com/r/startups/submit", dr: 91, category: "Startup Community", authType: "URL Prefill + Account", autoSubmit: false, prefillMode: "url_params" },
57
- { id: "dir-48", name: "NoCodeList", url: "https://nocodelist.co/submit", dr: 57, category: "Modern Software", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form" },
58
- { id: "dir-49", name: "X / Twitter Launch Post", url: "https://x.com/intent/tweet", dr: 94, category: "Launch Social", authType: "URL Prefill Intent", autoSubmit: false, prefillMode: "url_params" },
59
- { id: "dir-50", name: "Bluesky Launch Post", url: "https://bsky.app/intent/compose", dr: 88, category: "Launch Social", authType: "URL Prefill Intent", autoSubmit: false, prefillMode: "url_params" },
40
+ // Tier 3: Indie Launch, SMB & Business Directories (31-50)
41
+ { id: "dir-31", name: "Uneed.best", url: "https://www.uneed.best/submit-a-tool", dr: 64, category: "Indie Launch", authType: "Magic Link (@postbuild.dev)", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free + Paid" },
42
+ { id: "dir-32", name: "Better Business Bureau (BBB)", url: "https://www.bbb.org/get-listed", dr: 93, category: "Business Directory", authType: "Work Email (Your Domain)", autoSubmit: false, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
43
+ { id: "dir-33", name: "TinyLaunch", url: "https://www.tinylaunch.com/submit", dr: 54, category: "Indie Launch", authType: "Direct Form + Email", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free + Paid" },
44
+ { id: "dir-34", name: "Launching Next", url: "https://www.launchingnext.com/submit/", dr: 67, category: "Startup Directory", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free + Paid" },
45
+ { id: "dir-35", name: "SideProjectors", url: "https://www.sideprojectors.com/project/submit", dr: 62, category: "Side Projects", authType: "Email Verification", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
46
+ { id: "dir-36", name: "StartupBase", url: "https://startupbase.io/submit", dr: 61, category: "Startup Directory", authType: "OTP (@postbuild.dev)", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
47
+ { id: "dir-37", name: "Peerlist Launchpad", url: "https://peerlist.io/launchpad", dr: 74, category: "Maker Directory", authType: "OTP (@postbuild.dev)", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
48
+ { id: "dir-38", name: "Alignable Business Network", url: "https://www.alignable.com/biz_users/sign_up", dr: 84, category: "SMB Directory", authType: "Work Email (Your Domain)", autoSubmit: false, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
49
+ { id: "dir-39", name: "Fazier", url: "https://fazier.com/launch", dr: 56, category: "Indie Launch", authType: "Magic Link (@postbuild.dev)", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free + Paid" },
50
+ { id: "dir-40", name: "Reddit r/SaaS", url: "https://www.reddit.com/r/SaaS/submit", dr: 91, category: "SaaS Community", authType: "URL Prefill + Account", autoSubmit: false, prefillMode: "url_params", listingType: "community", pricing: "Free", communityRule: "Follow r/SaaS self-promotion rules; include problem solved, stack, and lessons." },
51
+ { id: "dir-41", name: "Bark Service Directory", url: "https://www.bark.com/en/us/sellers/create/", dr: 81, category: "Business Directory", authType: "Direct Form + Email", autoSubmit: false, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
52
+ { id: "dir-42", name: "MerchantCircle Directory", url: "https://www.merchantcircle.com/signup", dr: 79, category: "Local & SMB", authType: "Email Verification", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
53
+ { id: "dir-43", name: "StartupBuffer", url: "https://startupbuffer.com/site/submit", dr: 60, category: "Startup Directory", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free + Paid" },
54
+ { id: "dir-44", name: "StartupStash", url: "https://startupstash.com/add-listing/", dr: 72, category: "Startup Directory", authType: "Direct Form + Email", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free + Paid" },
55
+ { id: "dir-45", name: "KillerStartups", url: "https://killerstartups.com/submit-startup/", dr: 71, category: "Startup Directory", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free + Paid" },
56
+ { id: "dir-46", name: "Thumbtack Pro Directory", url: "https://www.thumbtack.com/pro", dr: 87, category: "Business Directory", authType: "Direct Form + Email", autoSubmit: false, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
57
+ { id: "dir-47", name: "Entireweb Free Submission", url: "https://www.entireweb.com/free_submission/", dr: 73, category: "Web Directory", authType: "Direct Form + Email", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
58
+ { id: "dir-48", name: "NoCodeList", url: "https://nocodelist.co/submit", dr: 57, category: "Modern Software", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
59
+ { id: "dir-49", name: "X / Twitter Launch Post", url: "https://x.com/intent/tweet", dr: 94, category: "Launch Social", authType: "URL Prefill Intent", autoSubmit: false, prefillMode: "url_params", listingType: "community", pricing: "Free", communityRule: "Attach a 30-second product demo video or screenshot before posting." },
60
+ { id: "dir-50", name: "Bluesky Launch Post", url: "https://bsky.app/intent/compose", dr: 88, category: "Launch Social", authType: "URL Prefill Intent", autoSubmit: false, prefillMode: "url_params", listingType: "community", pricing: "Free", communityRule: "Add a screenshot and tag relevant builder feeds." },
60
61
 
61
62
  // Tier 4: AI, Agent & MCP Directories (51-70)
62
- { id: "dir-51", name: "TopAI.tools", url: "https://topai.tools/submit", dr: 69, category: "AI Directory", authType: "Email Verification", autoSubmit: true, prefillMode: "clipboard_form" },
63
- { id: "dir-52", name: "ToolPilot.ai", url: "https://www.toolpilot.ai/pages/submit-your-ai-tool", dr: 58, category: "AI Directory", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form" },
64
- { id: "dir-53", name: "Easy With AI", url: "https://easywithai.com/submit-tool/", dr: 66, category: "AI Directory", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form" },
65
- { id: "dir-54", name: "FindMyAITool", url: "https://findmyaitool.com/submit-tool", dr: 61, category: "AI Directory", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form" },
66
- { id: "dir-55", name: "Insidr.ai", url: "https://www.insidr.ai/submit-tools/", dr: 65, category: "AI Directory", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form" },
67
- { id: "dir-56", name: "AI Valley", url: "https://aivalley.ai/submit-tool/", dr: 57, category: "AI Directory", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form" },
68
- { id: "dir-57", name: "The Rundown Supertools", url: "https://www.therundown.ai/submit", dr: 78, category: "AI Directory", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form" },
69
- { id: "dir-58", name: "AITools.fyi (Tally Form)", url: "https://tally.so/r/2EkV4g", dr: 62, category: "AI Directory", authType: "URL Prefill Form", autoSubmit: true, prefillMode: "url_params" },
70
- { id: "dir-59", name: "Awesome AI Tools (GitHub)", url: "https://github.com/mahseema/awesome-ai-tools/issues/new", dr: 96, category: "AI Directory", authType: "URL Prefill Issue", autoSubmit: false, prefillMode: "url_params" },
71
- { id: "dir-60", name: "AIxploria", url: "https://www.aixploria.com/en/featured-on-aixploria/", dr: 71, category: "AI Directory", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form" },
72
- { id: "dir-61", name: "SaaS AI Tools", url: "https://saasaitools.com/join/", dr: 59, category: "AI Directory", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form" },
73
- { id: "dir-62", name: "AI Agents Directory", url: "https://aiagentsdirectory.com/submit-agent", dr: 60, category: "AI Agents", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form" },
74
- { id: "dir-63", name: "AI Agents List", url: "https://aiagentslist.com/submit", dr: 56, category: "AI Agents", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form" },
75
- { id: "dir-64", name: "AI Tools Directory", url: "https://aitoolsdirectory.com/submit-tool", dr: 63, category: "AI Directory", authType: "Direct Form + Email", autoSubmit: true, prefillMode: "clipboard_form" },
76
- { id: "dir-65", name: "Glama MCP Servers", url: "https://glama.ai/mcp/servers", dr: 68, category: "MCP & Agents", authType: "GitHub / Form", autoSubmit: false, prefillMode: "clipboard_form" },
77
- { id: "dir-66", name: "BasedTools", url: "https://www.basedtools.ai/submit", dr: 54, category: "AI Directory", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form" },
78
- { id: "dir-67", name: "Tap4 AI", url: "https://tap4.ai/submit/", dr: 58, category: "AI Directory", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form" },
79
- { id: "dir-68", name: "PulseMCP Directory", url: "https://pulsemcp.com/submit", dr: 61, category: "MCP & Agents", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form" },
80
- { id: "dir-69", name: "Reddit r/ChatGPTCoding", url: "https://www.reddit.com/r/ChatGPTCoding/submit", dr: 91, category: "AI & Coding", authType: "URL Prefill + Account", autoSubmit: false, prefillMode: "url_params" },
81
- { id: "dir-70", name: "MCP.so Directory", url: "https://mcp.so/submit?type=server", dr: 64, category: "MCP & Agents", authType: "GitHub / Form", autoSubmit: false, prefillMode: "clipboard_form" },
63
+ { id: "dir-51", name: "TopAI.tools", url: "https://topai.tools/submit", dr: 69, category: "AI Directory", authType: "Email Verification", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free + Paid" },
64
+ { id: "dir-52", name: "ToolPilot.ai", url: "https://www.toolpilot.ai/pages/submit-your-ai-tool", dr: 58, category: "AI Directory", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free + Paid" },
65
+ { id: "dir-53", name: "Easy With AI", url: "https://easywithai.com/submit-tool/", dr: 66, category: "AI Directory", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free + Paid" },
66
+ { id: "dir-54", name: "FindMyAITool", url: "https://findmyaitool.com/submit-tool", dr: 61, category: "AI Directory", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free + Paid" },
67
+ { id: "dir-55", name: "Insidr.ai", url: "https://www.insidr.ai/submit-tools/", dr: 65, category: "AI Directory", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free + Paid" },
68
+ { id: "dir-56", name: "AI Valley", url: "https://aivalley.ai/submit-tool/", dr: 57, category: "AI Directory", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
69
+ { id: "dir-57", name: "The Rundown Supertools", url: "https://www.therundown.ai/submit", dr: 78, category: "AI Directory", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
70
+ { id: "dir-58", name: "AITools.fyi (Tally Form)", url: "https://tally.so/r/2EkV4g", dr: 62, category: "AI Directory", authType: "URL Prefill Form", autoSubmit: true, prefillMode: "url_params", listingType: "directory", pricing: "Free + Paid" },
71
+ { id: "dir-59", name: "Awesome AI Tools (GitHub)", url: "https://github.com/mahseema/awesome-ai-tools/issues/new", dr: 96, category: "AI Directory", authType: "URL Prefill Issue", autoSubmit: false, prefillMode: "url_params", listingType: "directory", pricing: "Free" },
72
+ { id: "dir-60", name: "AIxploria", url: "https://www.aixploria.com/en/featured-on-aixploria/", dr: 71, category: "AI Directory", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free + Paid" },
73
+ { id: "dir-61", name: "SaaS AI Tools", url: "https://saasaitools.com/join/", dr: 59, category: "AI Directory", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
74
+ { id: "dir-62", name: "AI Agents Directory", url: "https://aiagentsdirectory.com/submit-agent", dr: 60, category: "AI Agents", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
75
+ { id: "dir-63", name: "AI Agents List", url: "https://aiagentslist.com/submit", dr: 56, category: "AI Agents", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
76
+ { id: "dir-64", name: "AI Tools Directory", url: "https://aitoolsdirectory.com/submit-tool", dr: 63, category: "AI Directory", authType: "Direct Form + Email", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
77
+ { id: "dir-65", name: "SoMuch Web Directory", url: "https://www.somuch.com/submit-links/", dr: 64, category: "Web Directory", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
78
+ { id: "dir-66", name: "BasedTools", url: "https://www.basedtools.ai/submit", dr: 54, category: "AI Directory", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
79
+ { id: "dir-67", name: "Tap4 AI", url: "https://tap4.ai/submit/", dr: 58, category: "AI Directory", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
80
+ { id: "dir-68", name: "PulseMCP Directory", url: "https://pulsemcp.com/submit", dr: 61, category: "MCP & Agents", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
81
+ { id: "dir-69", name: "Anoox Social Directory", url: "https://www.anoox.com/add_for_indexing_free.php", dr: 63, category: "Web Directory", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
82
+ { id: "dir-70", name: "MCP.so Directory", url: "https://mcp.so/submit?type=server", dr: 64, category: "MCP & Agents", authType: "GitHub / Form", autoSubmit: false, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
82
83
 
83
- // Tier 5: SaaS, B2B & Landing Showcase Directories (71-85)
84
- { id: "dir-71", name: "SaaSWorthy", url: "https://www.saasworthy.com/offerings", dr: 74, category: "SaaS Directory", authType: "Work Email (@postbuild.dev)", autoSubmit: true, prefillMode: "clipboard_form" },
85
- { id: "dir-72", name: "GetApp / Capterra", url: "https://www.capterra.com/vendors/sign-up", dr: 90, category: "B2B Software", authType: "Work Email (@postbuild.dev)", autoSubmit: true, prefillMode: "clipboard_form" },
86
- { id: "dir-73", name: "SoftwareSuggest", url: "https://www.softwaresuggest.com/vendors", dr: 76, category: "SaaS Directory", authType: "Email Verification", autoSubmit: true, prefillMode: "clipboard_form" },
87
- { id: "dir-74", name: "GoodFirms", url: "https://www.goodfirms.co/get-listed", dr: 84, category: "Software Directory", authType: "Email Verification", autoSubmit: true, prefillMode: "clipboard_form" },
88
- { id: "dir-75", name: "TrustRadius", url: "https://www.trustradius.com/vendor", dr: 85, category: "B2B Software", authType: "Work Email (@postbuild.dev)", autoSubmit: true, prefillMode: "clipboard_form" },
89
- { id: "dir-76", name: "Serchen", url: "https://www.serchen.com/get-listed", dr: 68, category: "Cloud & SaaS", authType: "Email Verification", autoSubmit: true, prefillMode: "clipboard_form" },
90
- { id: "dir-77", name: "Crunchbase Add Company", url: "https://www.crunchbase.com/add-new", dr: 91, category: "Startup Directory", authType: "Work Email (@postbuild.dev)", autoSubmit: false, prefillMode: "clipboard_form" },
91
- { id: "dir-78", name: "Feedough Startups", url: "https://www.feedough.com/submit-your-startup/", dr: 69, category: "Startup Media", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form" },
92
- { id: "dir-79", name: "EU-Startups Directory", url: "https://www.eu-startups.com/directory/", dr: 78, category: "Startup Directory", authType: "Email Verification", autoSubmit: true, prefillMode: "clipboard_form" },
93
- { id: "dir-80", name: "F6S Startup Network", url: "https://www.f6s.com/companies", dr: 83, category: "Founder Network", authType: "OTP (@postbuild.dev)", autoSubmit: true, prefillMode: "clipboard_form" },
94
- { id: "dir-81", name: "Reddit r/InternetIsBeautiful", url: "https://www.reddit.com/r/InternetIsBeautiful/submit", dr: 91, category: "Web Showcase", authType: "URL Prefill + Account", autoSubmit: false, prefillMode: "url_params" },
95
- { id: "dir-82", name: "Landingfolio", url: "https://www.landingfolio.com/submit", dr: 72, category: "Landing Design", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form" },
96
- { id: "dir-83", name: "Minimal Gallery", url: "https://minimal.gallery/submit/", dr: 68, category: "Landing Design", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form" },
97
- { id: "dir-84", name: "Land-book", url: "https://land-book.com/submit", dr: 73, category: "Landing Design", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form" },
98
- { id: "dir-85", name: "OnePageLove", url: "https://onepagelove.com/submit", dr: 79, category: "Landing Showcase", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form" }
84
+ // Tier 5: SaaS, B2B, Web & Landing Showcase Directories (71-85)
85
+ { id: "dir-71", name: "SaaSWorthy", url: "https://www.saasworthy.com/offerings", dr: 74, category: "SaaS Directory", authType: "Work Email (Your Domain)", autoSubmit: false, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
86
+ { id: "dir-72", name: "GetApp / Capterra", url: "https://www.capterra.com/vendors/sign-up", dr: 90, category: "B2B Software", authType: "Work Email (Your Domain)", autoSubmit: false, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
87
+ { id: "dir-73", name: "SoftwareSuggest", url: "https://www.softwaresuggest.com/vendors", dr: 76, category: "SaaS Directory", authType: "Email Verification", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
88
+ { id: "dir-74", name: "GoodFirms", url: "https://www.goodfirms.co/get-listed", dr: 84, category: "Software Directory", authType: "Email Verification", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
89
+ { id: "dir-75", name: "TrustRadius", url: "https://www.trustradius.com/vendor", dr: 85, category: "B2B Software", authType: "Work Email (Your Domain)", autoSubmit: false, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
90
+ { id: "dir-76", name: "Serchen", url: "https://www.serchen.com/get-listed", dr: 68, category: "Cloud & SaaS", authType: "Email Verification", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
91
+ { id: "dir-77", name: "Crunchbase Add Company", url: "https://www.crunchbase.com/add-new", dr: 91, category: "Startup Directory", authType: "Work Email (Your Domain)", autoSubmit: false, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
92
+ { id: "dir-78", name: "Feedough Startups", url: "https://www.feedough.com/submit-your-startup/", dr: 69, category: "Startup Directory", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
93
+ { id: "dir-79", name: "Jayde B2B Directory", url: "https://www.jayde.com/submit.html", dr: 66, category: "B2B Directory", authType: "Email Verification", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
94
+ { id: "dir-80", name: "ExactSeek Directory", url: "https://www.exactseek.com/add.html", dr: 64, category: "Web Directory", authType: "Email Verification", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
95
+ { id: "dir-81", name: "ScrubTheWeb Directory", url: "https://scrubtheweb.com/addurl.html", dr: 61, category: "Web Directory", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
96
+ { id: "dir-82", name: "Landingfolio", url: "https://www.landingfolio.com/submit", dr: 72, category: "Landing Design", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
97
+ { id: "dir-83", name: "Minimal Gallery", url: "https://minimal.gallery/submit/", dr: 68, category: "Landing Design", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
98
+ { id: "dir-84", name: "Land-book", url: "https://land-book.com/submit", dr: 73, category: "Landing Design", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" },
99
+ { id: "dir-85", name: "OnePageLove", url: "https://onepagelove.com/submit", dr: 79, category: "Landing Showcase", authType: "Direct Form", autoSubmit: true, prefillMode: "clipboard_form", listingType: "directory", pricing: "Free" }
99
100
  ];
100
101
 
101
102
  export function buildPrefilledDirectoryUrl(dir, launchKit) {