diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 929f25d..2965670 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -25,3 +25,4 @@ jobs: args: release --clean env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + HOMEBREW_TAP_GITHUB_TOKEN: ${{ secrets.HOMEBREW_TAP_GITHUB_TOKEN }} diff --git a/.gitignore b/.gitignore index f6f5ae8..cb7f15c 100644 --- a/.gitignore +++ b/.gitignore @@ -11,3 +11,5 @@ dist/ # profiles hold passwords profiles.json + +.playwright-mcp diff --git a/.goreleaser.yaml b/.goreleaser.yaml index bfe827b..5fdadce 100644 --- a/.goreleaser.yaml +++ b/.goreleaser.yaml @@ -26,3 +26,38 @@ changelog: sort: asc filters: exclude: ["^docs:", "^test:", "^chore:"] + +# Package managers. Both publish to repos owned by the same account, which the default +# GITHUB_TOKEN cannot write to, so the release workflow passes a PAT as +# HOMEBREW_TAP_GITHUB_TOKEN (contents: write on homebrew-tap and scoop-bucket). +homebrew_casks: + - name: dbclone + repository: + owner: phuthuycoding + name: homebrew-tap + branch: main + token: "{{ .Env.HOMEBREW_TAP_GITHUB_TOKEN }}" + directory: Casks + homepage: https://phuthuycoding.github.io/dbclone/ + description: Clone MongoDB and MySQL databases between any two connections through local Docker containers + license: MIT + binaries: + - dbclone + commit_author: + name: goreleaserbot + email: bot@goreleaser.com + +scoops: + - name: dbclone + repository: + owner: phuthuycoding + name: scoop-bucket + branch: main + token: "{{ .Env.HOMEBREW_TAP_GITHUB_TOKEN }}" + directory: bucket + homepage: https://phuthuycoding.github.io/dbclone/ + description: Clone MongoDB and MySQL databases between any two connections through local Docker containers + license: MIT + commit_author: + name: goreleaserbot + email: bot@goreleaser.com diff --git a/README.md b/README.md index 4622ddb..9ae2dab 100644 --- a/README.md +++ b/README.md @@ -67,10 +67,13 @@ Checking local setup ## Install ```bash -go install github.com/phuthuycoding/dbclone@latest +brew install phuthuycoding/tap/dbclone # macOS (Homebrew) +scoop bucket add phuthuycoding https://github.com/phuthuycoding/scoop-bucket && scoop install dbclone # Windows +go install github.com/phuthuycoding/dbclone@latest # any OS with Go ``` -or download a binary from [Releases](https://github.com/phuthuycoding/dbclone/releases). +or download a binary from [Releases](https://github.com/phuthuycoding/dbclone/releases) +(linux / macOS / windows, amd64 / arm64). ## Usage diff --git a/docs/launch/README.md b/docs/launch/README.md new file mode 100644 index 0000000..303a8f9 --- /dev/null +++ b/docs/launch/README.md @@ -0,0 +1,35 @@ +# Lịch launch dbclone (bắt đầu 2026-10-07) + +Nguồn và rule từng nền tảng: `docs/reference/2026-10-07-launch-platforms.md`. +Text từng nơi: các file cùng thư mục. **Show HN và Reddit anh phải tự viết lại bằng lời +mình** (HN cấm text AI, Reddit phạt post giống marketing); file chỉ là fact sheet. + +## Tuần 1 — chuẩn bị + +- [x] Repo `homebrew-tap` + `scoop-bucket` tạo xong; goreleaser có `homebrew_casks` + `scoops`. +- [ ] **Anh:** tạo PAT (fine-grained, Contents: Read & write trên `homebrew-tap` và + `scoop-bucket`) rồi `gh secret set HOMEBREW_TAP_GITHUB_TOKEN -R phuthuycoding/dbclone`. +- [ ] Merge PR https://github.com/phuthuycoding/dbclone/pull/1 (nhánh `phuthuycoding/feat/launch-prep`), tag `v0.3.0` → release tự đẩy cask + manifest. +- [ ] Kiểm tra `brew install phuthuycoding/tap/dbclone` trên máy Mac thật. +- [ ] GIF demo (vhs qua Docker) chèn README + site. +- [x] Reddit đã login (Google) trong Chrome profile phuthuycoding. +- [ ] Comment thật ở r/golang, r/devops, HN mỗi ngày (không link dbclone). +- [x] PR awesome-mongodb mở rồi: https://github.com/ramnes/awesome-mongodb/pull/177 (mục Tools › Data). +- [ ] Email Console.dev (hello@console.dev) + Golang Weekly (editor@cooperpress.com): text sẵn trong `emails.md`; Gmail compose bị đóng trước khi autosave nên chưa có draft, anh copy gửi tay. +- [x] Bài dev.to **đã publish 2026-10-07**: https://dev.to/phuthuycoding/cloning-a-staging-mongodb-and-mysql-to-your-laptop-without-installing-a-single-database-client-12dm (tag go/docker/mongodb/mysql, AI disclosure = AI-assisted). + +## Tuần 2 — launch (giờ VN) + +- [ ] Thứ Ba 2026-10-13, 20:00–22:00: Show HN (`show-hn.md`), trực thread ~6 tiếng. +- [ ] Cùng tối: publish dev.to, post X + LinkedIn kèm GIF (`social.md`). +- [ ] Thứ Năm 2026-10-15: r/golang. +- [ ] Thứ Sáu 2026-10-16: comment trong r/selfhosted "New Project Friday". +- [ ] Thứ Bảy 2026-10-17: r/devops. Thứ Hai 19/10: r/mongodb. Thứ Tư 21/10: r/mysql. +- [ ] 2026-10-20..21: gom feedback thành issues, retro. + +## Sau đó + +- ~2026-11-01: đủ 30 ngày tuổi cho homebrew-core; cần 225 sao (tự submit) hoặc 75 (người khác). +- Có invite Lobsters: post tag `show` + `go` + `databases`, giữ < 25% self-promo. +- 2027-01-02: r/selfhosted post riêng. 2027-03-02: awesome-go (coverage ≥ 90%). +- Driver PostgreSQL → resubmit Show HN. diff --git a/docs/launch/awesome-lists.md b/docs/launch/awesome-lists.md new file mode 100644 index 0000000..1148709 --- /dev/null +++ b/docs/launch/awesome-lists.md @@ -0,0 +1,18 @@ +# Curated lists + +## ramnes/awesome-mongodb — PR now (no star/age gate; one item per PR; alphabetical) + +Section: Tools (or "Backup"/"Migration" if a closer fit on the day). Entry: + +- [dbclone](https://github.com/phuthuycoding/dbclone) - CLI to clone databases or selected collections between any two servers through the official Docker image, with parallel streams and retries + +## shlomi-noach/awesome-mysql — after traction ("reasonably recognized and adopted") + +Section: Backup (nearest). Entry (lowercase description, no superlatives): + +- [dbclone](https://github.com/phuthuycoding/dbclone) - clone databases or selected tables between servers through the official docker image, parallel mysqldump streams, retries. + +## avelino/awesome-go — not before 2027-03-02 (5 months since first commit) and coverage ≥ 90% + +- [dbclone](https://github.com/phuthuycoding/dbclone) - Clone MongoDB and MySQL databases between any two servers through local Docker containers. +PR body must include the pkg.go.dev link: https://pkg.go.dev/github.com/phuthuycoding/dbclone diff --git a/docs/launch/dev-to.md b/docs/launch/dev-to.md new file mode 100644 index 0000000..8d1746b --- /dev/null +++ b/docs/launch/dev-to.md @@ -0,0 +1,95 @@ +--- +title: Cloning a staging MongoDB and MySQL to your laptop without installing a single database client +published: false +tags: go, docker, mongodb, mysql +canonical_url: https://phuthuycoding.github.io/dbclone/ +--- + +Every week someone on my team needs a copy of our staging data on their laptop. Two +databases, MongoDB and MySQL, a few gigabytes. For years the answer was a wiki page: +install `mongodump` of the right major version, install the MySQL client, run four +commands, wait, and hope the SSH session doesn't drop halfway through a 3 GB restore. + +I got tired of the wiki page and wrote [dbclone](https://github.com/phuthuycoding/dbclone), +a small Go CLI. This post is about the three decisions that made it pleasant, and the one +limit you should know before you trust it. + +## The trick: your Docker images already contain the tools + +If you run MongoDB or MySQL locally, you almost certainly run the official `mongo` and +`mysql` images. Those images ship `mongodump`, `mongorestore`, `mysqldump` and `mysql`. +dbclone never installs anything on your host; every dump and restore is a `docker exec` +into the container you already have: + +``` + ┌──────────────── local container ────────────────┐ +source ──────────▶│ mongodump / mysqldump ──pipe──▶ mongorestore / mysql │──────────▶ target +(any profile) └──────────────────────────────────────────────────┘ (any profile) +``` + +Two consequences fell out of this that I did not plan for: + +- **Version skew disappears.** The client that dumps is the same major version as the + server that restores, because they are the same image. +- **Any direction works.** The container is just the pipe. `staging → local` is the + common case, but `local → staging` and `staging → another server` go through the same + code path. Your local containers are simply a built-in profile called `local`. + +## Streams, never stages + +Each dump is piped straight into its restore. There is no dump file on disk, so there is no +"out of disk at 90%" and no cleanup step. + +Big work gets its own stream. A MongoDB collection of 64 MiB or more becomes one +`mongodump --collection | mongorestore` pipe; everything smaller travels together in one +extra stream. MySQL tables are split into up to `-w` size-balanced groups, each its own +`mysqldump --single-transaction | mysql` pipe, and triggers, views, routines and events +follow once the data has landed. + +All streams from all databases share one weighted pool of `-j` slots (default 8) and are +dispatched biggest first, so a slot freed by a tiny database goes straight to the large one +instead of waiting for its siblings. + +``` +Cloning 3 databases prod → local · pool 8 streams · max 4 streams/db + +⠹ mongo:shop orders ⇉2 [==========>-------------] 42% 1.2 GiB / ~2.9 GiB 18.4 MiB/s 01:07 +✓ mysql:app done [========================] 100% 235.6 MiB 57.2 MiB/s 00:04 +· mysql:crm waiting for slot [------------------------] 0% 0.0 b / ~80.0 MiB +``` + +## Flaky links and the rails that stop you from hurting yourself + +Every stream is retried three times with backoff. Because restores drop and recreate the +object, a retry starts clean instead of appending to a half-written table. Errors that no +retry can fix, such as access denied, fail at once. + +Then the part I care about most, because the tool can write to a server: + +- Writing to anything but `local` means typing the target's name, interactively or with + `-confirm staging`. +- `-fresh` (drop whole databases first) only works when the target is `local`. +- A server is never cloned onto itself. +- Passwords reach the tools as environment variables, never on a command line. Profiles are + stored with mode `0600`. Every log line is scrubbed of `user:password@`. + +## The limit you should know + +MySQL table groups each take their own `--single-transaction` snapshot. The copy is +therefore not one consistent point in time across tables. That is fine for development +data, which is what this is for. It is not a backup tool, and I would not use it as one. + +## Using it + +```bash +brew install phuthuycoding/tap/dbclone # or scoop, go install, or a binary from Releases +dbclone -check # Docker + containers OK? prints the fix if not +dbclone # first run: add a profile, pick FROM, TO, databases +dbclone -from staging -only mongo:shop,mysql:app -yes +``` + +The engine interface is one package per database (`internal/driver//`), and +PostgreSQL is the obvious next one. If you try it on a setup that breaks, an issue with the +`logs/` folder from that run is the most useful thing you can send me. + +Repo: https://github.com/phuthuycoding/dbclone — MIT. diff --git a/docs/launch/emails.md b/docs/launch/emails.md new file mode 100644 index 0000000..8fb8b0a --- /dev/null +++ b/docs/launch/emails.md @@ -0,0 +1,41 @@ +# Newsletter / curated submissions + +## Console.dev — hello@console.dev (selection criteria: developer is the user, maintained, good docs) + +Subject: Submission: dbclone — clone MongoDB/MySQL between servers using the official Docker images + +Hi, + +I'd like to submit dbclone for consideration. + +- What: an open-source (MIT) Go CLI that clones MongoDB and MySQL databases between any + two connections (staging → local, prod → local, local → staging), whole databases or + selected tables/collections. +- Why it's different: nothing to install on the host. Dump and restore run with the tools + inside the official `mongo`/`mysql` images already on your machine, piped directly, no + dump files. One weighted pool of parallel streams, retries with backoff, live progress. +- Docs: README with every flag and an "what gets overwritten" table; `dbclone -check` + prints the exact command to fix a missing requirement. +- Repo: https://github.com/phuthuycoding/dbclone +- Site: https://phuthuycoding.github.io/dbclone/ +- Install: brew / scoop / go install / binaries for linux, macOS, windows. + +Thanks, +Quyen (phuthuycoding) + +## Golang Weekly — editor@cooperpress.com (no public submit form; contact page says email) + +Subject: Link suggestion: dbclone — Go CLI to clone MongoDB/MySQL via Docker, weighted worker pool + +Hi, + +A link suggestion for Golang Weekly: dbclone, a Go CLI that clones MongoDB/MySQL +databases between servers by piping mongodump/mysqldump straight into the restore inside +the official Docker images. Interesting bits for Go readers: one weighted worker pool +shared across databases dispatched biggest-first, per-stream retries, and a driver +interface that is one package per engine. + +https://github.com/phuthuycoding/dbclone (MIT) + +Thanks, +Quyen diff --git a/docs/launch/reddit.md b/docs/launch/reddit.md new file mode 100644 index 0000000..e6b8e85 --- /dev/null +++ b/docs/launch/reddit.md @@ -0,0 +1,63 @@ +# Reddit posts + +r/golang rules verified 2026-10-07 in the browser (rule 9 "Must be Go Related" explicitly +allows "Announcements & articles about open source Go libraries or applications"; rule 4 bans +engagement hooks; rule 6 bans "Ask an AI" posts). Other subs: see the verified block in +`docs/reference/2026-10-07-launch-platforms.md` §1.2. Keep self-posts under +10% of your activity; comment for real in these subs for 1–2 weeks first. + +## r/golang — text post (technical, Go-first), Thu 2026-10-15 + +**Title:** dbclone: a Go CLI that pipes mongodump/mysqldump into the restore inside Docker, with a weighted worker pool + +**Body (rewrite freely):** + +I wrote a small CLI to clone MongoDB/MySQL databases between servers (mostly staging → my +laptop). The Go-specific parts people here might find interesting: + +- The dump and restore are two `exec.CommandContext` processes run through `docker exec`, + with the dump's stdout wired to the restore's stdin. No temp files, and the progress bar + reads byte counts off the pipe. +- All streams from all databases share one weighted pool (`-j` slots, default 8). Big + Mongo collections (≥ 64 MiB) and size-balanced groups of MySQL tables each get a stream, + dispatched biggest first. +- Retries: 3 attempts with backoff per stream; restores drop-and-recreate so a retry starts + clean. Errors that can't be fixed by retrying (auth) short-circuit. +- Engines are adapters behind one `driver.Driver` interface, one package per engine. Adding + Postgres should touch nothing in scheduling/progress/prompts. +- Safety rails because this thing can write to a server: non-local targets require typing + the target's name; `-fresh` only on `local`; passwords only via env vars, never argv. + +Repo: https://github.com/phuthuycoding/dbclone (MIT). + +(r/golang rule 4, verified 2026-10-07: no "engagement hooks" such as "redundantly asking what +others think" — so end on the facts, not on a question.) + +## r/devops — ONLY as a comment in the weekly self-promotion thread (rule 4, verified). Sat 2026-10-17 + +Start the comment with "I'm the author." (rule 4: affiliation at the top). 5–6 lines, your own +words (rule 5 removes LLM-sounding text). Problem (client version skew, dump files, no +progress on a 3 GB restore) → the pipe trick → the pool → the honest limit → link. No blog +link (rule 4: self-contained). + +## r/mongodb — rules still unverified (login wall). Mon 2026-10-19, after checking the rules + +**Title:** Open-source CLI: clone a MongoDB database (or just some collections) from staging to local, using the mongo image's own mongodump/mongorestore + +Body: 4 lines. Mention per-collection streams ≥ 64 MiB, retries, picker with `/` filter. + +## r/mysql — DROPPED. Rule 2 "No Self Promotion" (verified). Only mention dbclone when it +genuinely answers someone's question. + +## r/selfhosted — ONLY in the "New Project Megathread" until 2027-01-02 (rule 6, verified) + +Comment, Fri 2026-10-16: 3 lines. Rule 2 wants "production ready and have docs" — point at +the README flag table and `-check`. Wednesday exception (rule 5) allows tool posts with the +right flair; still a 3-month-old project is megathread-only, so wait. + +## r/commandline — NOT before 2026-11-02 (rule 5: no projects newer than 30 days, verified) + +Rule 4: title/text must be human-written; if a meaningful share of the code was +AI-generated the post must say "This software's code is partially AI-generated" — decide +honestly. Rule 8: list similar tools and the difference (manual mongodump/mysqldump, +pgsync / replibyte / neosync for Postgres-first setups). Post the GIF of the progress view. diff --git a/docs/launch/show-hn.md b/docs/launch/show-hn.md new file mode 100644 index 0000000..66e3f7d --- /dev/null +++ b/docs/launch/show-hn.md @@ -0,0 +1,61 @@ +# Show HN — material (REWRITE IN YOUR OWN WORDS before posting) + +HN guideline: "Please don't post generated text or AI-edited text." This file is a fact sheet +and a structure, not the post. Type the title and the text yourself from it. + +**URL to submit:** https://github.com/phuthuycoding/dbclone (the repo, not the website — +Show HN wants something people can run). + +## Title candidates (≤ 80 chars, name the databases, name the job) + +1. Show HN: Dbclone – Clone MongoDB/MySQL from prod or staging to local, Docker only +2. Show HN: Dbclone – Copy a staging MongoDB/MySQL database to your laptop in one command +3. Show HN: Dbclone – Stream MongoDB/MySQL databases between servers with nothing installed + +Why this shape: Neosync's vague first post got 4 points; the relaunch titled +"…for Postgres and MySQL" got 246. Replibyte's "A tool to seed your dev database with real +data" got 129. + +## Facts to build the text from (all true per README / code) + +- Why I built it: our team clones a shared staging MongoDB + MySQL to laptops every week. + mongodump/mysqldump by hand meant installing matching client versions on every machine, + dump files on disk, and no idea how far along a 3 GB restore was. +- What it does: picks source and target from named profiles (`staging`, `prod`, `local`), + lists databases, lets you tick collections/tables, then streams each dump straight into the + restore. No dump files on disk. +- Nothing to install on the host: the dump/restore binaries are the ones already inside the + official `mongo` and `mysql` Docker images on your machine. Works between two remote + servers too; the local containers are just the pipe. +- Parallelism: one global pool of streams (`-j`, default 8) shared across all databases, + biggest work dispatched first. Mongo collections ≥ 64 MiB get their own stream; MySQL + tables are split into size-balanced groups (`-w`). +- Flaky links: every stream retried 3× with backoff; restores drop-and-recreate so a retry + starts clean. Auth errors fail immediately instead of retrying. +- Safety: writing to anything but `local` requires typing the target's name; `-fresh` (drop + whole DB) only works on `local`; a server is never cloned onto itself. Passwords go to the + tools via env vars, never argv; profiles are `0600`; logs are scrubbed of `user:password@`. +- Honest limits (say them; HN rewards it): MySQL table groups each take their own snapshot, + so the copy is not one consistent point in time — dev data, not a backup tool. Needs Docker + with containers from the official images. Postgres is not there yet; the driver interface is + one package per engine and it is the obvious next one. +- Install: `brew install phuthuycoding/tap/dbclone`, Scoop, `go install`, or a binary from + Releases (linux/macOS/windows, amd64/arm64). MIT. + +## Suggested structure (6–8 lines, first person) + +1. One sentence: what it is and the exact pain. +2. One sentence: the trick (dump piped into restore inside the official images). +3. Two sentences: scheduling + retries, with the numbers. +4. One sentence: the safety rails. +5. One sentence: what it is NOT (consistency, backup). +6. Ask: what engine next, what breaks on your setup. + +## Day-of checklist + +- Post Tue–Thu, 20:00–22:00 Vietnam time (morning US Pacific). Not an official HN rule; + it is where the audience is awake. +- Stay in the thread for ~6 hours. Answer every comment, including the harsh ones. +- Do NOT ask anyone to upvote. Do not post the link in team chats with "please upvote". +- If it does not take off, it is allowed to resubmit later on a big release (Postgres + driver). lazydocker hit the front page 4 times over 5 years. diff --git a/docs/launch/social.md b/docs/launch/social.md new file mode 100644 index 0000000..8894abf --- /dev/null +++ b/docs/launch/social.md @@ -0,0 +1,25 @@ +# X / LinkedIn (post the same day as Show HN, with the GIF) + +## X — single post + 1 reply + +Clone a MongoDB or MySQL database from staging to your laptop in one command — with +nothing installed except Docker. + +dbclone pipes mongodump/mysqldump straight into the restore inside the official images. +Parallel streams, retries, live progress. Go, MIT. + +https://github.com/phuthuycoding/dbclone + +(reply) The limit, so nobody gets surprised: MySQL tables are dumped in parallel groups, +each with its own snapshot. Dev data, not a backup tool. Postgres is next. + +## LinkedIn — short, first person + +Every week someone on my team needed staging data on their laptop, and the answer was a +wiki page nobody liked. So I wrote dbclone: a small open-source Go CLI that clones +MongoDB/MySQL between any two servers using the dump/restore tools already inside your +Docker containers. No dump files, parallel streams, retries, a progress bar you can +actually read. + +It is MIT and on GitHub: https://github.com/phuthuycoding/dbclone +If you try it and something breaks on your setup, I want to hear about it. diff --git a/docs/reference/2026-10-07-launch-platforms-raw/verify.md b/docs/reference/2026-10-07-launch-platforms-raw/verify.md new file mode 100644 index 0000000..06c83c3 --- /dev/null +++ b/docs/reference/2026-10-07-launch-platforms-raw/verify.md @@ -0,0 +1,33 @@ +# Verification table (all fetches returned summaries by a small model; VERBATIM = the summary quoted the exact text) + +url | status | verdict | note +https://news.ycombinator.com/showhn.html | 200 | VERBATIM | all 5 quotes present (5th continues "; anybody can do that now.") +https://news.ycombinator.com/newsguidelines.html | 200 | VERBATIM | all 3 +https://keydiscussions.com/2026/03/09/hacker-news-moves-toward-restricting-show-hn-posts-amid-the-ai-slop-wave/ | 200 | VERBATIM | page says "discussing throttling Show HN somehow, responding in a thread with 600+ upvotes entitled 'Ask HN: Please restrict new accounts from posting'" +https://arxiv.org/abs/2511.04453 | 200 | VERBATIM | star figures exact; Show HN no advantage + timing confirmed +https://www.producthunt.com/launch | 200 | VERBATIM | both quotes + "best day is the day you're most prepared" +https://help.producthunt.com/en/articles/3615694-community-guidelines | 200 | PARAPHRASE-OK | summary elided the tail of the sentence with "..."; meaning and the removal/loss-of-access consequence preserved +https://www.producthunt.com/launch/how-product-hunt-works | 200 | VERBATIM | +https://lobste.rs/about | 200 | PARAPHRASE-OK | "self-promo ... quarter" verbatim; 70-day limits confirmed (invites, unseen domains, flag); summary listed meta/announce tags, did NOT confirm 'show' tag or "edits"; "New users can't send invites" and the "next five or ten years" tail not seen verbatim +https://redship.io/blog/reddit-self-promotion-rules-2026 | 200 | PARAPHRASE-OK | 10% quote returned as "...probably a spammer." (tail "in Reddit's eyes" not shown); website/redditor quote verbatim +https://dev.to/terms | 200 | VERBATIM | both +https://github.com/avelino/awesome-go/blob/main/CONTRIBUTING.md | 200 | VERBATIM | all 4; page also requires go.mod + a semver release (not in worker file) +https://github.com/ramnes/awesome-mongodb | 200 | VERBATIM | sections exist (mgob under Administration, migrate-mongo under Development, mongo-connector under Data) +https://github.com/shlomi-noach/awesome-mysql | 200 | VERBATIM | Backup section with MyDumper and Xtrabackup present +https://goreleaser.com/customization/homebrew_casks/ | 200 | VERBATIM | "Since v2.10" present; page does NOT state macOS-only (worker hedged as unverified) +https://goreleaser.com/customization/scoop/ | 200 | VERBATIM | +https://docs.brew.sh/Package-Acceptance-Policy | 200 | PARAPHRASE-OK | thresholds 30/30/75 and 90/90/225 and 30-day rule confirmed, but returned as separate fragments, not the single worker sentence +https://pkg.go.dev/about | 200 | VERBATIM | +https://goreleaser.com/customization/docker/ | 200 | VERBATIM | v2.12 deprecation confirmed +https://console.dev/selection-criteria | 200 | VERBATIM | "hello@console.dev" email and the self-service signup criterion +https://dev.to/rophilogene/a-tool-to-seed-your-dev-database-with-real-data-5gj5 | 200 | PARAPHRASE-OK | the summary returned "...does not reflect the real-world data" and then "difficult to maintain"; worker's ending "and painful to keep updated" not confirmed +https://hn.algolia.com/api/v1/search?query=replibyte&tags=story | 200 | VERBATIM | 129/78/2022-04-26; 222/22/2022-07-10; Greenmask 94/19/2024-10-16 all exact +https://hn.algolia.com/api/v1/search?query=neosync&tags=story | 200 | MISMATCH | cited row 246/44/2024-05-22 and archived 1/1/2025-09-22 exact. BUT the worker's claim that the first Show HN (2023-12-07) got 24 points is wrong: live is 4 points, 1 comment, created 2023-12-08 +https://hn.algolia.com/api/v1/search?query=pgsync&tags=story | 200 | VERBATIM | 166/35/2020-03-24 +https://hn.algolia.com/api/v1/search?query=lazydocker&tags=story | 200 | VERBATIM | 340/47/2019-06-30; resubmissions 259 (2021-12), 481 (2023-07), 74 (2024-11) confirmed (submitted by other users, titles differ) +https://hn.algolia.com/api/v1/search?query=dbmate&tags=story | 200 | VERBATIM | 3/3/2015-12-02; 79/13/2024-06-16 +https://hn.algolia.com/api/v1/search?query=snaplet&tags=story | 200 | PARAPHRASE-OK | cited row 13 points/4 comments/2023-10-07 exact; shutdown 4/1/2024-07-01 and open-source 4/1/2024-08-14 exact; the worker's "13, 4 and 5 points" for Show HN posts is unsupported (only one Show HN row; the 4 is the comment count) +https://hn.algolia.com/api/v1/search?query=greenmask&tags=story | 200 | VERBATIM | 94/19/2024-10-16 + +## Totals +VERBATIM: 20 | PARAPHRASE-OK: 6 | MISMATCH: 1 | UNREACHABLE: 0 (27 URLs; reddit skipped, none cited as findings) diff --git a/docs/reference/2026-10-07-launch-platforms-raw/worker-1.md b/docs/reference/2026-10-07-launch-platforms-raw/worker-1.md new file mode 100644 index 0000000..1b338e4 --- /dev/null +++ b/docs/reference/2026-10-07-launch-platforms-raw/worker-1.md @@ -0,0 +1,68 @@ +# Worker 1: launch rules for HN Show HN, Product Hunt, Lobsters (2025-2026) + +Sub-question: current submission rules, best practices, timing, recent changes for Show HN, Product Hunt, Lobsters, for an OSS Go CLI (clone MongoDB/MySQL to local Docker). + +Note: WebFetch returns model-summarized text, so quotes are as returned by the fetch tool; verifier should compare against the live pages. + +## Findings + +According to https://news.ycombinator.com/showhn.html: "Show HN is for something you've made that other people can play with." +→ Runnable software such as a CLI qualifies for Show HN. + +According to https://news.ycombinator.com/showhn.html: "The project must be something you've worked on personally and which you're around to discuss" +→ The author must be present to answer comments. + +According to https://news.ycombinator.com/showhn.html: "Please make it easy for users to try your thing out, ideally without barriers such as signups or emails." +→ Repo plus install instructions (no signup) fits; a landing page or waitlist does not. + +According to https://news.ycombinator.com/showhn.html: "Off topic: blog posts, sign-up pages, newsletters, lists, and other reading material." +→ A website/blog post alone is not a valid Show HN; link the repo or something runnable. + +According to https://news.ycombinator.com/showhn.html: "The project should be non-trivial. Don't post quickly-generated one-offs" +→ Low-effort or quickly generated tools are explicitly discouraged. + +According to https://news.ycombinator.com/newsguidelines.html: "Please don't use HN primarily for promotion. It's ok to post your own stuff part of the time, but the primary use of the site should be for curiosity." +→ Account should show non-promotional participation. + +According to https://news.ycombinator.com/newsguidelines.html: "Don't solicit upvotes, comments, or submissions." +→ Do not ask friends or communities to upvote the Show HN. + +According to https://news.ycombinator.com/newsguidelines.html: "Please don't post generated text or AI-edited text. HN is for conversation between humans." +→ Write the title, post text and replies yourself (2025-2026 relevant policy on AI text). + +According to https://keydiscussions.com/2026/03/09/hacker-news-moves-toward-restricting-show-hn-posts-amid-the-ai-slop-wave/: HN's top moderator was "discussing throttling Show HN somehow, responding in a thread" (fetch summary; the page links a thread "Ask HN: Please restrict new accounts from posting"); no concrete rule was announced. +→ As of March 2026 Show HN restriction was under discussion only; secondary source, no verbatim dang quote obtained. + +According to https://arxiv.org/abs/2511.04453: "repositories gain an average of 121 stars within 24 hours, 189 stars within 48 hours, and 289 stars within a week of HN exposure." +→ Empirical benefit of HN exposure for AI/LLM tool repos (138 launches 2024-2025); the same paper reportedly found the Show HN tag gave no statistical advantage once other variables were controlled, and that posting time matters (fetch summary, not a verbatim quote). + +According to https://www.producthunt.com/launch: "12:01 am Pacific Time is the best time to launch for makers that are planning ahead" +→ Official timing guidance; the same page says the best day is the one you are most prepared for (fetch summary, no fixed weekday). + +According to https://www.producthunt.com/launch: "Company accounts are prohibited." +→ Launch from a personal maker account. + +According to https://help.producthunt.com/en/articles/3615694-community-guidelines: "Mass messaging users, asking for upvotes, using bots, incentivizing upvotes, and any other form of artificially increasing activity on your contribution is not acceptable." +→ Do not ask for upvotes; ask for visits and comments instead. Violations may remove the contribution and cost contribution access. + +According to https://www.producthunt.com/launch/how-product-hunt-works: "The homepage leaderboard changes throughout the day based on the number of upvotes, comments, time since submission, and other factors." +→ Ranking mixes upvotes, comments and recency. The same page requires the product to be new or substantively updated, usable, and offer unique value (fetch summary). + +According to https://lobste.rs/about: "self-promo should be less than a quarter of one's stories and comments." +→ Lobsters self-promotion rule of thumb (about 25% ceiling); the page also says authors should not use the site as "a write-only tool for product announcements or driving traffic to their work" (fetch of /about#invitations). + +According to https://lobste.rs/about: "New users can't send invites" for their first 70 days. +→ Lobsters is invite-only. New users (green usernames) cannot use the 'show' tag, submit links to previously unseen domains, flag, or suggest edits during the first 70 days. An unseen domain such as a new project site/repo host is therefore restricted for new accounts. + +According to https://lobste.rs/about: submission test "Will this improve the reader's next program? Will it deepen their understanding of their last program? Will it be more interesting in five or ten years?" +→ Lobsters favors technically substantive posts, so a design write-up of how the cloning works fits better than an announcement. + +## Not found +- not found: official Product Hunt 2025-2026 changelog of rule changes (e.g. retirement of "Coming Soon", vote-integrity updates) — tried web search; only third-party blogs (innmind, causo, getlaunchlist, mean.ceo) claim it, none fetched; /launch page said no specific changes. +- not found: PH weekday recommendation from an official page — /launch says "the day on which you're most prepared"; third-party "Tue/Wed" claims unverified. +- not found: concrete Show HN rule change 2025-2026 beyond the AI-text guideline — tried search and keydiscussions (secondary, no verbatim dang text); did not fetch the HN thread itself. +- not found: verbatim best-time-to-post for Show HN from an official source — only third-party claims in search snippets (6-9 AM PT, Tue-Thu), not fetched. +- not found: Lobsters 'show' tag description text and any Lobsters AI/LLM policy on /about; the page did not mention AI. Did not fetch lobste.rs/tags or /rules. +- not found: Product Hunt policy on AI content or new accounts in community guidelines (page does not mention it). + +## Calls used: 13/15 diff --git a/docs/reference/2026-10-07-launch-platforms-raw/worker-2.md b/docs/reference/2026-10-07-launch-platforms-raw/worker-2.md new file mode 100644 index 0000000..c2813c3 --- /dev/null +++ b/docs/reference/2026-10-07-launch-platforms-raw/worker-2.md @@ -0,0 +1,33 @@ +# Worker 2: self-promo rules for dbclone launch channels + +Sub-question: current self-promotion rules for r/golang, r/mongodb, r/mysql, r/devops, r/selfhosted, r/commandline, r/opensource, dev.to, Hashnode, Go/DB Discords/Slacks, X/LinkedIn tactics. + +## Findings + +According to https://redship.io/blog/reddit-self-promotion-rules-2026: "if more than about 10% of your activity is submitting your own stuff, you're probably a spammer in Reddit's eyes" +→ The Reddit-wide 10% guideline (reddiquette) is real, but this is a third-party page quoting it, not reddit.com. + +According to https://redship.io/blog/reddit-self-promotion-rules-2026: "it's fine to be a redditor with a website, it's not fine to be a website with a Reddit account" +→ Reddit's guiding principle: build comment history before posting your own project. + +According to https://dev.to/terms: "Users must make a good-faith effort to share content that is on-topic, of high-quality, and is not designed primarily for the purposes of promotion or creating backlinks." +→ dev.to allows project posts only if they have real substance, not as pure promotion. + +According to https://dev.to/terms: "Posts must contain substantial content — they may not merely reference an external link that contains the full post." +→ A dev.to launch post must be a self-contained article (problem, how it works, usage), not a link-only announcement. + +## Unverified (from WebSearch result summaries only, the pages themselves were never fetched; do not quote) +- r/selfhosted Q2 2026 rules update: weekly "New Project Friday" megathread; mods stopped policing AI involvement; 3-month minimum project age (source URL listed in search: https://redlib.groet-infra.nl/r/selfhosted/comments/1rmt39o/rules_update_new_project_friday_here_to_stay/ , fetch returned 502). +- r/golang: weekly "Small Projects" thread with looser standards (search summary only). +- Hashnode: featured articles must not be promotional or spammy (https://support.hashnode.com/en/articles/6435320 redirected to docs.hashnode.com, which returned 404). +- r/devops: self-promotion allowed if it solves real DevOps problems and shares technical detail (secondary-source summary, https://www.teract.ai/resources/reddit-marketing-developer-tools-2026, not fetched). + +## Not found +- not found: r/golang official rules / showcase policy text — tried reddit.com/r/golang/about/rules (fetch blocked), r.datuan.dev/r/golang (failed), search. +- not found: r/selfhosted rules text verbatim — tried reddit.com (blocked), redlib.groet-infra.nl post and wiki (502 x2). +- not found: r/mongodb, r/mysql, r/commandline, r/opensource rules — search returned nothing specific. +- not found: Hashnode promotion guideline verbatim — tried support.hashnode.com (redirect), docs.hashnode.com (404). +- not found: Gophers Slack and MongoDB community Discord/Slack self-promo policy — not searched, cap reached. +- not found: X/Twitter and LinkedIn tactics for solo OSS launches — one generic search, no usable sources. + +## Calls used: 15/15 diff --git a/docs/reference/2026-10-07-launch-platforms-raw/worker-3.md b/docs/reference/2026-10-07-launch-platforms-raw/worker-3.md new file mode 100644 index 0000000..c99add6 --- /dev/null +++ b/docs/reference/2026-10-07-launch-platforms-raw/worker-3.md @@ -0,0 +1,52 @@ +# Worker 3: distribution channels for a Go CLI + +Sub-question: requirements/process for awesome-go, awesome-mongodb/mysql, Homebrew tap, Scoop, pkg.go.dev, Docker via goreleaser, newsletters. + +## Findings + +According to https://github.com/avelino/awesome-go/blob/main/CONTRIBUTING.md: "have at least 5 months of history since the first commit." +→ awesome-go requires a repo at least 5 months old (no star minimum is stated). + +According to https://github.com/avelino/awesome-go/blob/main/CONTRIBUTING.md: "if the library/program is testable, then coverage should be >= 80% for non-data-related packages and >=90% for data-related packages." +→ awesome-go requires coverage of 80% or more (90% for data-related packages) when testable. A DB-clone tool may count as data-related. + +According to https://github.com/avelino/awesome-go/blob/main/CONTRIBUTING.md: "One PR adds, removes, or changes **only one item**." PR body must include "Forge link and pkg.go.dev are provided." +→ PR rules: one item per PR, with both the repo link and the pkg.go.dev link. Format: "- [project-name](https://github.com/org/project) - Short, clear description." with the exact project name and a description ending in punctuation. A pkg.go.dev link that loads is checked automatically. Go Report Card is not listed in the fetched text. + +According to https://github.com/ramnes/awesome-mongodb: "Feel free to improve this list by [contributing](/ramnes/awesome-mongodb/blob/master/CONTRIBUTING.md)!" +→ A suitable list exists (ramnes/awesome-mongodb) with Tools/GUI, Backup (mgob) and Migration (migrate-mongo, mongo-connector) sections. The CONTRIBUTING.md text itself was not read. + +According to https://github.com/shlomi-noach/awesome-mysql: "This list accepts and encourages pull requests. See [CONTRIBUTING](https://github.com/shlomi-noach/awesome-mysql/blob/master/CONTRIBUTING.md)" +→ A suitable list exists (shlomi-noach/awesome-mysql) with a Backup section (MyDumper, Xtrabackup); no explicit clone/migration section was seen. The CONTRIBUTING.md text was not read. + +According to https://goreleaser.com/customization/homebrew_casks/: "Optionally a token can be provided, if it differs from the token provided to GoReleaser" +→ goreleaser publishes to your own tap via `homebrew_casks` (repository.owner/name/branch/token, optional pull_request). The page lists the older "Homebrew (deprecated)" `brews` section separately. `homebrew_casks` is available since v2.10, per the fetch summary. Casks are macOS-only, which matters for a CLI (not verified further). + +According to https://docs.brew.sh/Package-Acceptance-Policy (via WebSearch result snippet only, page NOT fetched; the cap was hit): "at least 30 forks, 30 watchers or 75 stars, or at least 90 forks, 90 watchers or 225 stars for a self-submission by the repository owner. A code repository less than 30 days old is normally not eligible." +→ homebrew-core notability thresholds are 30 forks/30 watchers/75 stars, tripled for self-submission; repos younger than 30 days are normally ineligible. Re-fetch to confirm the wording before relying on it. + +According to https://goreleaser.com/customization/scoop/: "Optionally a token can be provided, if it differs from the token provided to GoReleaser" +→ Scoop publishing uses `scoops:` with repository owner/name/branch/token. Your own bucket repo is enough; no notability gate was found. + +According to https://pkg.go.dev/about: "Making a request to proxy.golang.org for the module version, to any endpoint specified by the Module proxy protocol." +→ Indexing is triggered by requesting the module version from proxy.golang.org (e.g. `.../@v/v1.0.0.info`). A redistributable license affects what is displayed (see https://pkg.go.dev/license-policy, not fetched). + +According to https://goreleaser.com/customization/docker/: "Note that you will have to manually log in to the Docker registries you want to push to — GoReleaser does not log in by itself." +→ Docker Hub and ghcr publishing works through `image_templates` (docker.io/..., and by extension ghcr.io; the page example shows docker.io and gcr.io). You must `docker login` first (CI step). `dockers` and `docker_manifests` are marked deprecated as of v2.12 in favour of `dockers_v2`. + +According to https://console.dev/selection-criteria: "Email [hello@console.dev](mailto:hello@console.dev) with the details and we'll happily take a look." +→ Console.dev submission is by email. Criteria include a developer primary user, active maintenance, good docs, speed, and no security/privacy harm. One criterion is "Is there a self-service signup?" + +## Not found + +- not found: Golang Weekly submission process — tried https://golangweekly.com/ (the page had no submit/contact text). Not tried: a dedicated contact page. +- not found: Changelog News submission rules — tried https://changelog.com/submit (404). A search snippet said submissions go via changelog.com/submit or changelog.com/news/submit, but I did not fetch that page. Go Time was not researched. +- not found: TLDR newsletter submission process — tried a search only; nothing editorial found. +- not found: awesome-mongodb and awesome-mysql CONTRIBUTING.md contents — only the README was fetched. +- not found: awesome-go Go Report Card and star requirements — absent from the fetched CONTRIBUTING.md (may exist in other sections; the fetch used an LLM summary). +- not found: homebrew-core thresholds on the Package-Acceptance-Policy page itself — tried https://docs.brew.sh/Acceptable-Formulae twice (it has no such numbers). The Package-Acceptance-Policy page was not fetched. +- not found: awesome-mongodb-specific requirement for non-Go tools, plus Go-specific Homebrew formula (brews) vs cask guidance for Linux — not researched. + +Note: all WebFetch results are summaries from a small model, not raw page text; quotes should be re-verified. + +## Calls used: 15/15 diff --git a/docs/reference/2026-10-07-launch-platforms-raw/worker-4.md b/docs/reference/2026-10-07-launch-platforms-raw/worker-4.md new file mode 100644 index 0000000..779bef3 --- /dev/null +++ b/docs/reference/2026-10-07-launch-platforms-raw/worker-4.md @@ -0,0 +1,45 @@ +# Worker 4: launch prior art for DB/dev CLI tools + +Sub-question: How did comparable OSS DB/dev CLI tools launch and what worked? +Caveat: the HN Algolia fetches were summarised by the fetch tool into tables. Titles and points are as returned, not raw JSON. A verifier should re-check against the HN item pages. + +## Findings + +According to https://hn.algolia.com/api/v1/search?query=replibyte&tags=story: "Show HN: A tool to seed your dev database with real data | 129 | 78 | 2022-04-26 | https://github.com/Qovery/replibyte" +→ Replibyte launched as a plain Show HN whose title leads with the job-to-be-done and not the product name. It got 129 points and 78 comments. + +According to https://hn.algolia.com/api/v1/search?query=replibyte&tags=story: "Replibyte – Seed your database with real data | 222 | 22 | 2022-07-10" +→ A second, non-Show-HN submission about 2.5 months later scored higher (222 points). The tool was resubmitted when it had more features, so a repeat launch is viable. + +According to https://dev.to/rophilogene/a-tool-to-seed-your-dev-database-with-real-data-5gj5: "As a developer, creating a fake dataset for running tests is tedious. Plus, it does not reflect the real-world data and painful to keep updated." +→ The author's launch post on dev.to opens with a pain-point statement, and Qovery (a company) backed the project. Replibyte's GitHub stars were reported as 4.4k via a search snippet only (not fetched). + +According to https://hn.algolia.com/api/v1/search?query=neosync&tags=story: "Show HN: Neosync – Open-Source Data Anonymization for Postgres and MySQL | 246 | 44 | 2024-05-22" +→ Neosync's first Show HN (2023-12-07, "Open-Source Data Replication and Anonymization") got 24 points. The reframed relaunch on 2024-05-22 got 246 points. The relaunch title named the concrete DBs and the "Open-Source" angle. + +According to https://hn.algolia.com/api/v1/search?query=neosync&tags=story: "Neosync OSS repository is archived | 1 | 1 | 2025-09-22" +→ Neosync's OSS repo was archived in Sept 2025. A search snippet (not fetched) says Grow Therapy acquired Neosync on 2025-09-25. Good HN traction did not mean a durable standalone business. + +According to https://hn.algolia.com/api/v1/search?query=pgsync&tags=story: "PgSync: Sync Postgres data between databases | 166 | 35 | 2020-03-24 | https://github.com/ankane/pgsync" +→ pgsync reached 166 points with a plain-descriptive title, not a Show HN. Ankane did the posting or someone else did; this is unknown. The title has no marketing language. + +According to https://hn.algolia.com/api/v1/search?query=lazydocker&tags=story: "Lazydocker: a terminal GUI for Docker | 340 | 47 | 2019-06-30" +→ Lazydocker's launch-day HN submission scored 340 points. It was resubmitted three more times: 2021-12 (259), 2023-07 (481), 2024-11 (74). Repeated resubmission of the same repo kept producing front-page hits. + +According to https://hn.algolia.com/api/v1/search?query=dbmate&tags=story: "Show HN: A lightweight, framework-agnostic database migration tool | 3 | 3 | 2015-12-02" +→ dbmate's 2015 Show HN got 3 points. A 2024-06-16 resubmission ("Dbmate: A lightweight, framework-agnostic database migration tool") got 79. The launch flopped, and adoption came later via other channels (unknown which). + +According to https://hn.algolia.com/api/v1/search?query=snaplet&tags=story: "Show HN: Seed your Postgres database with production-like data | 13 | 4 | 2023-10-07" +→ Snaplet's Show HN posts were small (13, 4 and 5 points). Its other submissions: "Snaplet Is Shutting Down" (4 points, 2024-07-01) and "Snaplet is now open source" (4 points, 2024-08-14). A funded venture-style launch got little HN traction. + +According to https://hn.algolia.com/api/v1/search?query=replibyte&tags=story: "Show HN: Greenmask 0.2 – Database anonymization tool | 94 | 19 | 2024-10-16" +→ A later competitor in the same space got 94 points with a versioned Show HN title. + +## Not found +- not found: author write-up "how I got N GitHub stars" for any of these tools. Tried searches on lazydocker/Jesse Duffield and Replibyte, and the dev.to post. +- not found: verbatim Snaplet founder shutdown quote on a fetched page. plushcap.com paraphrased only; the supabase.com/snaplet.dev posts were not fetched (cap). The search snippet attributes a quote to Peter Pistorius (unverified). +- not found: the Jesse Duffield "posted on reddit ... virtually zero responses" story as a fetched page. It appeared only in a search snippet, source lookingatcomputer.substack.com/p/q-and-a-with-jesse-duffield (not fetched). +- not found: what channel drove pgsync and dbmate adoption (Show HN vs Rails/Ruby community vs Homebrew). Only HN Algolia data was fetched. +- not found: star counts at launch time for any tool (only the current 4.4k for Replibyte, from a snippet). + +## Calls used: 15/15 diff --git a/docs/reference/2026-10-07-launch-platforms.md b/docs/reference/2026-10-07-launch-platforms.md new file mode 100644 index 0000000..48985b8 --- /dev/null +++ b/docs/reference/2026-10-07-launch-platforms.md @@ -0,0 +1,138 @@ +# dbclone — nền tảng launch & marketing (research có trích dẫn) + +**Ngày:** 2026-10-07 +**Repo:** https://github.com/phuthuycoding/dbclone (tạo 2026-10-02, v0.2.0, 2 sao, MIT, Go CLI) +**Site:** https://phuthuycoding.github.io/dbclone/ +**Câu hỏi:** Nên launch dbclone ở đâu, theo thứ tự nào, với rule hiện hành (2025–2026) của từng nền tảng? +**Phương pháp:** 4 worker `znf:researcher` fan-out (HN/PH/Lobsters · Reddit/dev.to · kênh phân phối · prior art) + 1 worker verify re-fetch toàn bộ 27 URL (20 verbatim, 6 paraphrase đúng nghĩa, 1 mismatch đã sửa, 0 dead link). Raw: `docs/reference/2026-10-07-launch-platforms-raw/` (worker-1..4, verify). +**Độ tin cậy:** Mỗi mục ghi rõ **Verified** (fetch trực tiếp trang gốc) hay **Unverified** (chỉ có snippet search / nguồn thứ cấp). Reddit login-wall cả curl lẫn Playwright nên toàn bộ rule subreddit là Unverified — anh mở bằng browser đã login kiểm tra 1 phút trước khi post. + +--- + +## 0. Hiện trạng repo & việc phải làm TRƯỚC khi launch + +Kiểm tra trực tiếp trong repo (`README.md`, `.goreleaser.yaml`, `gh repo view`): + +- **Chưa có demo GIF/asciinema.** README chỉ có mock ASCII (grep `gif|asciinema|= 80% for non-data-related packages and >=90% for data-related packages" nếu testable (dbclone hiện có `main_test.go` nhỏ — cần đầu tư test). 1 item/PR, kèm link repo + pkg.go.dev. +- **awesome-mongodb** (ramnes, CONTRIBUTING fetch OK): không gate sao/tuổi; format `[Name](link) - description`, alphabetical, 1 PR/item → **làm ngay tuần 1**, mục Tools hoặc Backup/Migration. +- **awesome-mysql** (shlomi-noach, CONTRIBUTING fetch OK): "Must be free and open source"; phải "reasonably recognized and adopted", "Code must not be abandoned/discontinued"; script mới chưa test bị từ chối → **đợi có traction** (sau HN). + +### 1.5 Newsletter / curated · **Impact trung bình · Effort rất thấp (1 email) · Một phần Verified** + +- **Console.dev** (https://console.dev/selection-criteria, Verified): gửi email hello@console.dev; tiêu chí: developer là user chính, maintain tích cực, docs tốt. Phù hợp. +- **Golang Weekly:** homepage không có mục submit; trang contact Cooperpress chỉ có editor@cooperpress.com ("If you have any questions or suggestions, the ideal way … is by emailing us") → gửi email ngắn + link GIF. +- **Changelog News:** `/submit` 404 → không tìm được quy trình. **TLDR:** không tìm được. Bỏ qua. + +### 1.6 Product Hunt · **Impact thấp cho OSS CLI · Effort trung bình · Verified** + +**Rule:** https://www.producthunt.com/launch — "12:01 am Pacific Time is the best time to launch" (= **14:01 giờ VN**); "Company accounts are prohibited" → account cá nhân. Community guidelines: cấm "asking for upvotes … incentivizing upvotes", vi phạm bị gỡ launch. Không có ngày tốt chính thức (Tue/Wed chỉ là snippet thứ cấp). +**Nhận định:** PH thiên SaaS/consumer; Snaplet (sản phẩm cùng mảng, có funding) không lên nổi ở HN và PH không cứu được. Chỉ làm **sau** HN nếu rảnh, kỳ vọng thấp, mục đích chính là backlink + badge. + +### 1.7 Lobsters · **Impact trung bình (đúng gu kỹ thuật) · Bị chặn bởi account · Verified** + +https://lobste.rs/about: invite-only; "self-promo should be less than a quarter of one's stories and comments"; account mới (70 ngày đầu) không được gửi invite, không được submit domain site chưa từng thấy, không được flag (verify xác nhận); việc tag `show` bị khóa cho account mới KHÔNG được xác nhận trên trang. Tag `show` = "Show Lobsters / Projects", có tag `go`, `databases`, `release`. → Cần xin invite ngay (hỏi trong HN thread / Gophers); vì github.com là domain đã thấy, có thể post repo sớm hơn 70 ngày, nhưng giữ dưới 25% self-promo. + +### 1.8 X / LinkedIn / Discord-Slack (Gophers, MongoDB community) · **Không có nguồn — Unverified** + +Worker không tìm được nguồn tin cậy. Khuyến nghị chung: post GIF + 1 câu pain + link, cùng ngày Show HN; LinkedIn hợp với tệp devops VN. Gophers Slack có channel `#showandtell` theo thói quen cộng đồng (chưa verify policy). + +--- + +## 2. Lịch launch 2 tuần (giờ VN) + +```mermaid +gantt + title dbclone launch — 2 tuần + dateFormat YYYY-MM-DD + section Tuần 1 · Chuẩn bị + Demo GIF (vhs) + chèn README :a1, 2026-10-08, 2d + goreleaser homebrew_casks + scoops, cut v0.3.0 :a2, 2026-10-09, 1d + Viết bài dev.to (EN) = text dùng chung :a3, 2026-10-10, 2d + Comment thật ở r/golang r/devops HN :a4, 2026-10-08, 7d + PR awesome-mongodb :a5, 2026-10-11, 1d + Email Console.dev + Golang Weekly :a6, 2026-10-12, 1d + section Tuần 2 · Launch + Show HN (Thứ Ba 20:00–22:00 VN) + trực comment :b1, 2026-10-13, 1d + dev.to publish + X/LinkedIn cùng ngày :b2, 2026-10-13, 1d + r/golang (text post kỹ thuật) :b3, 2026-10-15, 1d + r/devops → r/mongodb → r/mysql (cách 2 ngày) :b4, 2026-10-17, 4d + r/selfhosted New Project Friday :b5, 2026-10-16, 1d + Gom feedback → issues, retro :b6, 2026-10-20, 2d +``` + +**Mốc sau 2 tuần (gate tuổi/sao):** +- ~2026-11-01 (repo ≥ 30 ngày): đủ điều kiện tuổi homebrew-core, còn cần 225 sao (hoặc 75 sao + người khác submit). +- Sau 70 ngày có account Lobsters: post tag `show` + `go` + `databases`. +- 2027-01-02: r/selfhosted standalone post. +- 2027-03-02: awesome-go PR (cần coverage ≥ 90% vì data-related). +- Khi có driver PostgreSQL (README mục "Adding an engine" đã chừa chỗ): resubmit Show HN theo mẫu Neosync/lazydocker — đây là cú đẩy thứ hai lớn nhất, Postgres mở rộng tệp người dùng gấp nhiều lần. + +--- + +## 3. Không tìm được / cần anh tự kiểm tra + +- Rule text chính thức r/golang, r/selfhosted, r/devops, r/mongodb, r/mysql, r/commandline (login-wall) — mở `reddit.com/r//about/rules` bằng browser đã login. +- Giờ post Show HN chính thức (HN không công bố). +- Changelog News / TLDR submit process. +- Policy self-promo của Gophers Slack, MongoDB Discord. +- Tactic X/LinkedIn cho solo OSS có nguồn.