Cross-border Notes

Practical notes for foreign-trade and cross-border sellers

Home/Content Factory

Dev Log #1Ongoing

Dev Log #001: Why I Built a Content Factory (and What the First 35 Days Actually Cost)

2026-10-19 · 4 min readContent Factorybuildingcontent factoryautomation
Contents
  1. The numbers
  2. Three real incidents (more useful than an architecture diagram)
  3. Five questions to ask before building in-house
  4. Where this does not apply
  5. FAQ

The short answer: building a content factory in-house is not about saving money. It is about control — over cost, over quality checks, and over your own data. Off-the-shelf tools can produce a piece of content, but they will not tell you why it is expensive, why it is wrong, or how to roll back when it breaks. You only learn those three things by building it yourself.

Here is the honest ledger for the first 35 days, including three incidents. Every number comes from the repository or the billing records; the scope is stated next to it.

The numbers

Item Value Scope
Period 2026-09-15 → 10-19 (35 days) First commit to writing
Commits 620 git rev-list --count
Active days 18 Days with at least one commit
Busiest day 91 commits 09-19, the architecture refactor
Model bill ≈ USD 29.8 / 35 days ≈ USD 25/month API calls only; power and hardware excluded
Cost per piece (re-edit) ≈ 0 yuan Runs entirely on local hardware
Cost per piece (remix / original) 12–18 yuan 30-second 720p, including rerun headroom

Scope note: the model bill only counts calls with a known price. Some models are unpriced and therefore not included, so “USD 25/month” is a floor, not the full cost.

Commits over the first 35 days

Three real incidents (more useful than an architecture diagram)

1. The backup “failed daily” — the offsite copy was actually 10 days behind

Symptom: the backup service failed three days in a row with status=1/FAILURE. The log contained only an exit code.

Cause: the credential file held two sets of account-level keys. The script read them in order, so the second set overwrote the first — and the second set had no permission. Every run returned 403.

The real cost: tracing it further showed the offsite copy was not three days behind, but ten days behind (the last cloud object was from 09-30). The log understated the severity.

Fix: comment out the second set (values kept, reversible) → backfill 44 files → verify 50 cloud objects one by one (MD5 for small files, download-and-compare for large ones).

Lesson: “the service failed” does not mean “the data is gone” — but logs tend to make incidents look smaller than they are. When something fails, ask first: is the output actually there?

2. The morning report service hung for 2 hours 54 minutes

Symptom: from 08:30 the service sat in activating, printing “5 automatic jobs remaining” every two minutes — 88 times — while the report never appeared.

Cause: it was polling for “automatic jobs to finish”, but the count never changed, and there was no timeout. It was waiting for a condition that could not be satisfied.

Fix: add a timeout; on timeout, report the failure and still produce the report (degrade), instead of letting one step block the chain.

Lesson: a wait without a timeout is an incident waiting to happen. Every loop that waits on external state needs a timeout and a failure path.

3. The running engine was not under version control

Symptom: during a review, the Python files that were actually running (the engine layer) were neither in the main repository nor in the backup package — they existed only on disk.

Cause: the repository and the working directory were two different paths, and the deployed copy was never brought under version control.

Fix: track the engine directory, push it to a remote (inside the agreed push window), and include it in the backup package.

Lesson: “it runs” does not mean “it can be recovered”. The only test that matters: on a fresh machine, can you bring it up from the repository plus backups?

Cost per piece

Five questions to ask before building in-house

  1. Do you have a stable category or multiple content lines? (A one-off test is not worth building for.)
  2. Are you willing to maintain it? (The cost is not in week one; it is in week ten.)
  3. Can you accept rework? (At least three rounds in the first 35 days is normal.)
  4. Do you have measurable definitions? (Cost per piece, pass rate, rework rate — without them you cannot improve.)
  5. What is your failure fallback? (Backups, rollback, timeouts, degradation — all four.)

If fewer than three answers are “yes”, use existing tools and skip the build.

Where this does not apply

  • Good fit: small teams with multiple content lines, a need for steady output, and sensitivity to cost and data ownership.
  • Poor fit: one-off experiments, teams without operations capacity, or anyone who just wants a one-click export.

FAQ

Does building in-house actually save money?

Not necessarily. It saves marginal cost (local re-edits are close to zero per piece) but costs time (620 commits in 35 days). If your volume is small, the time cost will not pay back.

Why not just use an existing tool?

Existing tools can produce output, but they will not give you cost breakdowns, quality criteria, or rollback. You only need to build when you need control.

What is the most common mistake?

Not the model — the operations: backups, timeouts, version control. When those three fail, the system looks alive while it is already losing data.


Last updated: 2026-10-19 (first draft)