Devlog · SoloStack

SoloStack: Building This Site in Public

PJ By PJ Geldenhuis · July 15, 2026 · 13 min read · Live · solo-stack.ai

How this was put together: assembled from the actual planning conversations and automated publishing runs behind this site — more "operations log" than highlight reel, on purpose. Exact dates are reconstructed from file timestamps and the bylines already sitting on each published post, not from a diary. Where I'm approximating, I say so.

Key milestones

SoloStack — run a one-person business like a team of ten
SoloStack's own mark — an indigo square and a bold "S," pulled straight from this site's CSS.
solo-stack.ai
SoloStack live homepage screenshot
This very site's homepage today, July 15 — including the new Devlog nav link.

The tool stack, end to end

Framework / HostPlain static HTML/CSS, no frameworkNetlify (API-based deploy, no git)
DomainName.com registrar
SEO / AnalyticsGoogle Search ConsoleGA4 (tried, removed)Cloudflare Web Analytics (recommended)
CommerceGumroad — toolkit + free sample
AffiliatesElevenLabs (live)PartnerStackImpact (Descript, Grammarly)monday.com

Where the idea came from

This site started from a one-line question: can I make passive income using AI? The spark was a viral AI-generated video that was clearly running display ads against its own traffic. The instinct was: could a solo person copy that playbook — ride AI-driven content, monetize with ads — without a publisher's staff or budget?

The honest research answer was "sort of." The bigger site's version works because it already has scale and domain authority — that part doesn't transfer to a one-person operation. But the underlying model does, especially since search engines were explicitly rewarding quality and real authorship over raw volume of AI-generated pages that year.

Three realistic paths got compared head-to-head: an AI-assisted niche content site (slow to start, compounds over months), scheduled web scraping into a sellable dataset (better margins, but finding a buyer is the hard part), and faceless automated video (highest ceiling, most saturated). The content-site route won on risk and cost, landing on the niche that balanced decent ad rates, recurring affiliate commissions, low saturation, and real personal interest: AI tools and automation for solopreneurs, built to run under a real name for authorship credibility.

Building and launching, same day

Once the niche was set, the whole starter kit got built in one sitting: a homepage, four cornerstone articles, the trust pages a display-ad network expects, and the SEO plumbing. Total footprint: about 88 KB of plain static HTML, no build step, no framework. Before publishing anything, a verification pass checked every internal link and confirmed each article was a genuine 730–1,000 words.

Deployment was deliberately the simplest possible path — drag the folder onto a static-hosting drop zone, live in about three minutes. A domain that was already owned, sitting ready and unused, turned out to be exactly the right one. Once pointed at the host, HTTPS came up automatically. From there, every placeholder domain reference got swapped for the real one, and the site was submitted to search-engine indexing — which came back with the sitemap accepted and all 8 initial pages discovered within moments.

Picking a pace

The next real question was how often to post. The answer landed on ramping to three times a week for about the first eight weeks, then tapering off once a base of content existed — reasoning that raw frequency doesn't matter to search rankings, but reaching topical authority faster does. The one guardrail set alongside that decision: every auto-drafted post still gets a personal review pass. By the end of day one, eight posts were live, including one from the very first fully unattended scheduled run.

A setback worth naming from this same day: the sitemap came back truncated after an edit, several entries and the closing tag simply gone. It was rewritten from scratch and reverified — the first sighting of a recurring theme: the folder that gets deployed and the folder the editing tools show don't always agree.

The first admin day: affiliates, and a change of mind on analytics

Launch day kept going past the build itself, working through affiliate-network applications with honest, unpadded traffic numbers. One quick win went live same-day; several others sat pending for weeks. A genuine reversal is worth recording honestly: a cookie-based analytics tool was added site-wide, then removed a short time later, in favor of something more privacy-friendly — reasoning that cookie-based analytics can lose a large share of traffic to "reject all" clicks, and the search-console tool (already verified) covers the metric that actually matters for an SEO-driven site. A privacy-friendly, cookieless replacement was recommended; I found no evidence in later sessions that it was ever actually installed, so that step appears to still be open.

The weekly machine

From here, publishing became a scheduled, mostly unattended job: three times a week, an automated run reads the content calendar, drafts a 700–1,000-word post from an existing post's exact template, adds a homepage card and sitemap entry, deploys, and verifies the result is actually live before reporting back. That cadence has held exactly, without a missed or off-schedule run, across every cycle since launch.

A few runs are worth looking at closely, because the pattern isn't "flawless machine" — it's "machine that hits the same known snag periodically and gets better at recovering." One run hit a real sync bug: edits made through the normal editing tool weren't landing on the copy of the site that actually gets zipped for deployment. Files had to be rewritten directly against the deployed filesystem to guarantee correctness. A fallback deploy attempt then had broken command syntax that silently produced an empty zip — which still returned a successful upload response. That's a genuinely uncomfortable near-miss: a broken deploy that reported success. It was caught before being treated as done, rebuilt correctly, and re-verified. By the most recent run covered here, the process had visibly adapted: file edits were written directly against the deployed copy from the start, sidestepping the divergence rather than discovering it mid-run — a small, real example of a lesson from one run actually sticking by the next.

The Gumroad detour: turning the plan into an actual product

A product page had been sitting live with placeholder links since the first week. Resolving that turned into one of the more technically involved sessions of the whole project: two real digital-product listings went live — a toolkit PDF and a free sample used as an email-capturing lead magnet — plus a fully custom, hand-built landing page for each, verified against the platform's own sanitizer until it came back clean.

Worth naming as a real pivot: the original plan called for pay-what-you-want pricing to lower the bar for a cold audience. What actually shipped is a flat one-time price. Plans and execution didn't quite match by the time this got built — a small, honest gap between the strategy doc and the live page.

The setback: the platform's CLI login requires staying alive through a multi-step approval, but this project's sandboxed environment kills background processes the moment each step ends, so the login couldn't complete that way. The fallback was a browser-generated access token — which meant asking explicit go-ahead first, since that token carries full account access. That consent step happened before any token was created. Also found along the way: the live homepage had quietly diverged from what the editing tool was showing, because the weekly auto-post task had been regenerating it independently — the same sync theme, again.

Once both products were live and verified, they got woven through the whole site, and — so the integration wouldn't quietly erode over time — the weekly scheduled task itself was permanently updated: every new post now gets the product tie-in baked in automatically, and each run re-checks that the homepage's key elements are still present, re-adding them if anything ever strips them out. That's the difference between a one-time integration and one that self-heals.

Honest accounting: the founding day was by far the heaviest single day of work. Each scheduled weekly run is designed to be nearly hands-off; clean runs finish quickly, the runs that hit the sync/stale-zip quirk took visibly longer. The publishing half of the plan has run like clockwork — the personal-touch and affiliate-link half has lagged, with several posts' own run-reports explicitly flagging "add your real experience here" as still open.

Where things stand today

18 posts live, past the point the launch plan set as the minimum bar for applying to display-ad programs — though I found no evidence an actual application has gone in yet. 14 backlog ideas remain in the content calendar. Monetization is now two-sided: the original ad/affiliate model, plus a real digital product live with custom landing pages and site-wide integration. Affiliate status is mixed and mostly still pending. Analytics is unsettled. No traffic or revenue numbers appear anywhere in the material this devlog draws from — consistent with the plan set on day one, which always framed "a few dollars a day" as a several-month target, and it's still early on that clock. I'd rather say that plainly than make up a number.

If there's a one-line honest summary, it's this: the publishing machine works exactly as designed and hasn't missed a beat, the monetization plan took a few weeks longer to actually execute than the docs suggested it would, and the "make it sound like a real person" step — the one thing the plan explicitly says is what beats generic AI content — is the piece still waiting on the personal follow-through.

Open issues

  • Past the recommended page count, but no display-ad (AdSense) application appears to have gone in yet
  • Cloudflare Web Analytics was recommended as a cookieless replacement for GA4 — never confirmed installed
  • The editor-vs-deployed-copy sync gap recurs periodically; a fallback deploy once silently reported success while actually failing

Upgrade opportunities

  • Submit the AdSense application now that the page-count bar is cleared
  • Settle analytics once — either install Cloudflare Web Analytics or drop the idea explicitly
  • Close the personal-touch gap: add real experience and live affiliate links to posts still flagged as placeholders
Today (July 15): this devlog section is itself today's work — reconstructed from real session history across all five projects and published the same way everything else on this site gets published. Alongside it: an X profile search (the obvious handles were taken; @dailysolostack and @solostack_hq came back available), a matching avatar and banner built from this site's own design system, and a full email-forwarding review across every project domain.
Week of July 19: The weekly machine did its job — Friday’s post covers an AI bookkeeping workflow for freelancers, toolkit CTA in place, with the usual honest flag that the first-hand anecdote still needs adding. Alongside it, a code-level audit across all five project repos picked two flagship portfolio case studies — DoorOps for its fail-closed safety architecture, Lumenor for its CI-gated eval suite — and produced a single inventory doc listing every site, repo, host, and database in one table. Also new: this devlog now updates itself. Tonight’s entries across the project pages were researched from the week’s real session history, redaction-checked, and published by a scheduled automation — the first run of exactly the kind of hands-off system this site exists to document.
Week of July 26: The weekly post task ran three times this week — client-onboarding templates (closing out a full content cluster), faceless-channel income math, and an AI-passive-income reality check all went live with the toolkit CTA in place, and every one shipped carrying the same standing flag: the first-person anecdote and affiliate links are still placeholders waiting on a human. The stale-zip deploy bug earned its 'recurring' label — it hit two of the three runs, and both posts went out through the inline fallback instead. The pattern this page keeps documenting is now hard to miss: the automated layer publishes on schedule; the personal layer is the bottleneck.
Week of August 2: Three more posts on schedule — four AI habits that save real hours, the cheapest way to start an AI-powered business, and how to write a great prompt — which makes the stale-zip deploy bug three-for-three: every run this week shipped through the inline fallback, and one run's verification briefly reported the wrong deploy id because of a stale temp file. The save of the week: the local copy of the GEO tracker's data file turned out to be 13 days behind the live site, and a full-folder deploy would have silently wiped those two weeks of daily tracking history — caught only because the run now syncs the live file down before pushing. Smaller housekeeping win: the deploy finally stopped shipping stray .bak and junk files that had been sitting live for weeks. The standing pattern holds — the automated layer publishes three times a week; the first-person anecdotes and affiliate links those posts keep asking for are still waiting on a human.
Week of August 9: Three posts on schedule again — a gentle-start guide for people who think they're bad at tech, how to spot and fix robotic AI writing, and when upgrading from free to paid AI is actually worth it — and that last one closed out the entire evergreen idea backlog, so next week the calendar flips to seasonal topics. The catch of the week came mid-run: the live homepage had silently reverted and was missing the two newest post cards, which the deploy only fixed because every run now verifies the full page set instead of just its own new file. The stale-zip deploy bug that went three-for-three last week hit the Monday run but then, for the first time in weeks, the Friday deploy went through the script cleanly with no fallback. The GEO tracker's daily snapshots (now nine) get synced down before every push, so the near-miss that almost wiped two weeks of history has hardened into routine. Standing pattern, unchanged: the automation publishes three times a week; the first-person anecdotes and affiliate links are still waiting on a human.
Week of August 16: First full week past the end of the evergreen backlog, and the calendar worked the way the convention said it should: the only two ideas left are season-locked for November and December, so the runs pegged one post to real news — the free ChatGPT tier going effectively unlimited, and what that actually changes for a small business — invented a 15-minute "what should you automate first" audit, and rounded up the AI tools that genuinely launched this quarter. The GEO tracker sync that began life as a near-miss recovery quietly earned its keep again: the live site held eleven daily snapshots to the local copy's nine, and the run pulled live down before pushing instead of silently overwriting two days of history. The stale-zip deploy bug was back for two of the three runs; both posts shipped through the fallback path without drama. Standing pattern, still unchanged: the automation publishes three times a week, and every post again went out flagged for the first-person anecdote and affiliate links only a human can add.
Week of August 23: Three more posts with the backlog still empty until November — a plain-English guide to what not to paste into AI, a ten-minute monthly check-up for automations that break quietly, and a head-to-head of the AI meeting note-takers — all invented topics, all logged in the calendar per the convention. The stale-zip deploy bug hit two of the three runs and both shipped through the fallback path without drama; the middle run, for whatever reason, went through clean. The GEO tracker's sync-before rule kept quietly paying rent, pulling the live site's newer snapshots down before each push — fifteen, seventeen, then nineteen — instead of overwriting days of history. Standing pattern, still unchanged: every post went out flagged for the personal anecdote and affiliate links that are still a human's to add.
Week of September 13: The honest ledger for these three weeks is two posts where the convention calls for nine. One went out the Monday after the last entry — when not to use AI, seven tasks still faster by hand, an invented trust-cluster topic with the backlog season-locked until November — and then the weekly runs simply stopped firing until this weekend, when the machine came back and shipped a guide to the one-page context doc that makes every AI tool smarter about a business. The sync-before rule that began life as a near-miss recovery had its biggest save yet on that return run: the live site was holding thirty-nine daily GEO snapshots against the local copy's twenty, so a blind deploy would have erased nineteen days of tracking history that had quietly accumulated while the publishing side slept. The stale-zip deploy bug made its usual cameo on one of the two runs and the fallback held, and a missing /geo sitemap entry was spotted and re-added. Standing pattern, with a new clause earned the hard way: the automated layer publishes on schedule — but only on days the machine hosting the schedule is actually awake — and both posts still went out flagged for the first-person anecdotes and affiliate links only a human can add.

← Back to the Devlog