SRC_URL
https://producingtechnology.com/65-apps/lujiahao_179402_15200390_learning-machines.html
What it does
- Personal blog / newsletter landing page, Substack-style, text-forward
- Titled Learning Machines, Thinking Systems — ML / systems-thinking blog
- Top nav: Home, Series, Reading shelf, Subscribe (all anchor links to sections below)
- Four body sections:
- Featured post — hero slot for a pinned or latest post
- Series — grouped multi-post threads
- Reading shelf — curated external references
- Subscribe — email form with Newsletter / Frequency / Format prefs
- Content hydrates client-side — shows “Loading from producingtechnology.com…” banner before content paints, implies a
fetch() on a JSON/Markdown data file
- Footer attributes the data source (“data · producingtechnology.com”)
Didn't work
- Featured post title renders a bare
# — looks broken, should be a title or a real empty state
- Series + Reading shelf show headers but no visible items — unclear if empty, still loading, or fetch failed (no state distinction)
- Loading banner stays visible next to rendered section headers — loading and loaded states overlap instead of swapping out
- Subscribe form shows the three preference labels but no visible submit button or confirmation feedback
- Footer “data” link points to
# — dead anchor for a page whose whole story is “thin client over a data file”
- No post cards, timestamps, or read-time anywhere — hard to tell if the blog has ever shipped a post
Prompt to improve
Single HTML file, no frameworks. Split loading / empty / error into three distinct per-section states — skeleton rows while fetching, written empty states (“no series started yet”) when the data is empty, retry button with the failing URL on error. Kill the global loading banner once any section resolves. Replace the Featured post # with a real post card (title, date, 1-line dek, read-post link) and ship a fallback sample in the JSON so it never looks broken. Make Subscribe actually submit: add a button, validate the email, persist prefs to localStorage, show an inline success state with a 600ms fake delay. Make the footer “data” link open the real JSON source in a new tab — reinforces the thin-client story. Add one piece of personality that fits an ML blog: read-time per post or “updated N days ago” computed from the data file.