Not WordPress, not Wix, not note. Just cp a file to S3, and every Monday morning the AI writes and publishes a post on its own.

That's the personal blog setup I built and have been running. Infrastructure costs a few hundred to a few thousand yen a month. Zero ads. In this post I want to write down the design philosophy behind it and what I've learned from actually running it.

The technical details are covered in a separate article, so here I'll focus on "why I built this" and "what I traded away and what I kept."


It started with one simple want: "a cheap blog with no ads"

For someone running a solo business who wants to put content out there, the options for blogging are surprisingly limited.

  • WordPress — tons of flexibility, but server costs, plugin management, and security patches follow you forever
  • Wix / Squarespace — easy admin panel, but several thousand yen a month, and the free plan slaps ads on everything
  • note / Hatena Blog — great if you just want to write, but you're renting someone else's domain and experience
  • Static site generators (Hugo / Astro) — fast and cheap, but you have to build locally and push every single time

In fields like education, law, or healthcare — where ads directly undermine credibility — the ads on a free plan are a dealbreaker. But I don't have time to self-host WordPress either.

That's where the idea came from: "What if I just drop a file in S3 and the AI turns it into a post and publishes it automatically?"


The core of the design was deciding what to cut

When I was building this, the thing I spent the most time on wasn't what to implement — it was what not to implement.

Things I cut

  • Admin panel — don't need it. aws s3 cp is enough
  • Database — don't need it. A manifest.json sitting in S3 does the job
  • Runtime server — don't need it. Just serve static HTML from CloudFront
  • Login system — don't need it. I'm the only writer
  • Comment section — don't need it. Anyone who wants to reach me can email
  • SNS integration, auto OGP generation, AMP, PWA — don't need them. I'll add them if I ever want them ← added some of these
  • Prev / next links — don't need them (still slightly on the fence about this one) ← ended up implementing them

Things I kept

  • Zero-ad layout
  • GA4 and Microsoft Clarity tracking tags (I want to see how people read via heatmaps)
  • Category system (fixed at 5: tech / study / thought / life / creative)
  • AI-powered post generation (drop a note, it polishes it into a post)
  • Automatic Monday morning publishing (consistent update cadence is good for SEO and for my own peace of mind)

Most people design by addition, but I started from subtraction. Figuring out what you can do with only what's left tends to produce something you'll actually keep running.


Workflow: posts just appear on Monday mornings

Here's what the day-to-day actually looks like.

1. Got an idea? Throw it at S3

aws s3 cp ~/Obsidian/notes/claude-code-jissen.md \
  s3://da-leca-blog/source/

Obsidian notes, ChatGPT conversation logs, docx files, PDFs — anything goes. Drop it under the source/ prefix and you're done.

If I want to combine multiple files into one post, I just throw the whole folder in.

aws s3 sync ./my-article-folder/ \
  s3://da-leca-blog/source/my-article-folder/

2. Next morning at 9:20, the AI drafts the post

Every day at 9:20 JST, a Lambda function runs, checks source/, and if the publishing queue is thin, it prepares a draft for the following Monday.

That's when Bedrock's Claude gets called to handle:

  • Body formatting (Sonnet restructures it as a "blog editor")
  • URL slug generation (Haiku suggests an English kebab-case slug)
  • Category assignment (Haiku picks from the 5 categories)

All of it, automatically.

3. Monday at 6:00, it goes live on its own

publish_lambda fires, copies staging to production, regenerates sitemap.xml, invalidates CloudFront. When it's done, a success notification email lands in my inbox.

My only job is to cp the idea. Everything else finishes while I'm asleep.


Handling the very human need to control the order

Once I had full automation, I started feeling a bit left out — my intentions weren't reflected anywhere. Specifically, I'd sometimes want "publish this series in order" or "get this post out before the others."

So I added a simple rule: prefix a filename with a number and it gets prioritized.

source/
├── 1_intro.md          ← goes out first
├── 2_setup.md          ← goes out next
├── 10_advanced.md      ← then this
└── random-thought.md   ← no number = random order

That's all it takes to have both an "ordered queue" and a "whatever-I-feel-like random pool" coexisting. Once a series wraps up, I go back to the free-range no-number mode.

The "semi-automatic" balance between fully automated and fully manual — that feels right for solo operation.


Cost: estimated ¥150–¥2,200 per month

Here's the rough breakdown by design.

Item Monthly estimate
Bedrock (generating ~4 posts) $0.06
Lambda Within free tier
S3 storage $0.025
CloudFront $1–10 (depends on traffic)
SES (notification emails) Within free tier
Total $1–15 / month

Running a mid-sized WordPress site costs at minimum ¥1,500–¥3,000/month (shared hosting + domain + backups), so while traffic is low, this is dramatically cheaper.

And even as traffic grows, costs just scale linearly with CloudFront's pay-per-use pricing. No discrete jumps from plan upgrades or server expansions. That's quietly great for your mental health.


Vendor lock-in worries? Less than I expected

"Aren't you locked into AWS?" I get asked that a lot. Sure, I depend on S3, CloudFront, and Bedrock. But all the content itself lives in S3 as Markdown or HTML, so migrating is just an aws s3 sync to another host.

  • Move to Cloudflare Pages → copy files + flip DNS, done
  • Move to Netlify → same thing
  • Switch the AI part to OpenAI → swap one spot in the Lambda code

The key is staying in a state where "the infrastructure is AWS, but the assets are mine." Once you put your posts in a database, that goes out the window.


What I've learned from actually running it

What worked well

  • The barrier to writing dropped — since I can hand off "turn this into a proper post" to the AI, just throwing a note in is enough
  • Updates don't stop — load a few posts into the queue and it keeps publishing on its own even if I ignore it for a while
  • The cleanliness of no ads — a site without ads on it is much easier to share with people

What didn't work as well

  • No prev / next links was quietly annoying — planning to add them ← ended up implementing them
  • The AI's output has its own quirks — working on it through system prompt tuning

Next post: the full technical breakdown

Everything above was the "philosophy and operations" side of things.

The next post covers how I actually put it together:

  • Why S3 + CloudFront + Lambda
  • Why Bedrock instead of hitting the API directly
  • Why manifest.json + S3 ListObjects instead of DynamoDB
  • How I secured the security boundary using CloudFront Behavior enumeration
  • How I made failure recovery idempotent

Hoping it reaches people who are stuck on tech stack decisions.


This blog itself runs on this exact system. The source for this post was fed into it with a cp.