DEV Community

Cover image for One repo, ten Next.js sites: the commit that published ten blog posts this morning
Mark Fulton
Mark Fulton

Posted on

One repo, ten Next.js sites: the commit that published ten blog posts this morning

The commit that landed at 10:29 this morning was 30 files and 1,240 insertions. Ten blog posts, ten hero images, ten content calendars ticked one row forward. One commit, ten different websites, ten different audiences, none of which have anything to do with each other.

That commit is the clearest picture I can give of what I have actually been building this year, so I want to walk through it properly: what the ten sites are, what makes them one repo instead of ten, and the parts I have not got right yet.

The ten sites

They live in a Next.js monorepo called DomainNetwork. Every directory under apps/ is a self-contained site with its own domain, its own Vercel project, and its own way of making money. Six of them are launched:

  • trymy.app is a directory for indie apps. The homepage says "You built it. Now get people to try it." The rule that makes it different from the big directories is that every listing has to be something a visitor can actually run today: free, freemium, or a real free trial. Submissions are free and human reviewed. This morning it published a Show HN checklist, which is the kind of thing its audience is genuinely searching for at 2am before a launch.
  • billable.dev is a free invoice generator for developers. It runs entirely in the browser with no server behind it, builds an invoice, and prints to PDF. The feature I still like best is that it reads a git log and turns commit messages into billable line items. Pro is $4 a month billed every six months, or $79 once for life, and it adds branding, templates, estimates and CSV/JSON export.
  • typetimer.com is a typing test with a verified certificate at $4.99, or $29 for a recruiter pack of ten.
  • legalizeai.com is a paid directory for AI legal software.
  • questioncard.com does flash cards and question card games.
  • smbdashboard.com is a small business dashboard.

Four more are built, deployed and publishing soon. They have posts going out every weekday and they are nearly finished products.

What makes it one repo

The thing I want to convince you of is that ten sites is not ten times the work. It is close to one and a half times the work, and almost all of the saving comes from three decisions.

One workspace, ten Vercel projects. The repo is npm workspaces. Vercel imports the same repository ten times, each project pointing its root directory at apps/<name>. A push touching apps/billable deploys billable.dev and nothing else. There is one npm install, one lockfile, one set of upgrades.

A machine-readable manifest. There is a sites.json at the root listing every site with its domain, type, monetization, and whether it is launched. Automations iterate that file rather than a list I keep in my head. Adding a site means adding an entry, and the daily publishing routine and the Search Console indexing sweep both pick it up on their own. That single file is why the eleventh site will not cost me a day of wiring.

Blog posts are markdown, not a CMS. Each site reads apps/<name>/content/posts/*.md. No database, no admin panel, no editor to log into. A post is a file with frontmatter, a hero image is a WebP in public/blog/, and publishing is a commit. That is why this morning's publish is legible as a diff, and why the whole thing survives me not being awake.

There is also a shared BUILD-STANDARDS.md that every app has to follow, covering the SEO baseline, the blog system, voice and env conventions, and a 16-step LAUNCH-CHECKLIST.md for adding a site. Both exist because I shipped config wrong more than once and got tired of rediscovering the same traps.

The part I cannot prove yet

Here is the honest bit. I can show you the machine. I cannot yet show you the traffic.

The posts are real and researched. Today's Billable article works through the nine extra fields a cross-border invoice needs and when a client's country makes them withhold tax at source. Today's SuperSheet article answers "best font for a spreadsheet" by reading the advance width of each digit straight out of the font files instead of repeating what everyone else wrote. That is the standard, and I hold to it.

But a network like this is a bet on compounding, and compounding takes longer than a build log does. On my main domain blog, indexing stalled badly enough that I paused daily publishing there back in July and set a measurable gate before it turns back on: at least one blog URL indexed, or at least one blog impression in 28 days. Neither has happened yet. So when I tell you ten sites publish every weekday, please read that as a bet in progress rather than a result. I will post the numbers when there are numbers.

The rest of today

  • Favors.dev published "Programmatic SEO for Indie Hackers: A Real Teardown". Favors.dev is the one where founders trade favors, earn points, and launch faster.
  • PounceDomains published a comparison piece on why a wholesale appraisal number is not a bid.
  • The Search Console indexing sweep and the daily social drafts both ran on schedule.

Four blogs and ten sites in a morning is the whole point of the arrangement. None of it required me to open an editor.

One ask

On Saturday I am handing the entire repo over. The session is called Domain Factory: One Repo, 10 Sites, 10 Stripe Businesses, it runs Saturday August 22 at 10:00 AM Eastern on Zoom with the replay included, and it is $149. You get the monorepo itself with skeletons for the three business types (paid directory, paid tool, storefront), the daily blog routine, the indexing sweep, the 16-step launch checklist, and I set up one attendee domain live during the hour. If you have three domains sitting in a registrar account doing nothing, that is who it is for.

If that is not your thing, come argue with me for free instead. I run a builder community called Vibe Coding is Life: the Facebook group is at facebook.com/groups/vibecodinglife and the Skool community is at skool.com/vibe-coding-is-life. I post the ugly parts of this build there too.

And the actual ask: go look at trymy.app and tell me whether the directory would have been useful on your last launch, or whether it is one more place nobody visits. I would rather hear the second answer now than in six months.

Top comments (0)