Host viewer: https://producingtechnology.com/browser.html (TERMINAL_VIEWER v1.0, landed on PAGE 48/143).
LOADED_SRC: https://producingtechnology.com/65-apps/lizhuoning_185002_15200395_daily-planner.html
App name: Daily. — a single-file editorial daily planner by Li Zhuoning that consumes a JSON profile (name, date, mood, morning routine, note) and renders it as an elegant, magazine-style dashboard.
The app opens on an empty state reading “Daily. — Load your JSON to begin”, offering a drag-drop file zone and a Use sample data button. Clicking Use sample data replaces the splash with a full planner for a fictional user “Elaine”, dated Wednesday, February 25, 2026. The rendered view consists of four panels arranged in a 2×2 grid:
A ↩ load new file button in the header resets to the intake state so a new JSON can be dropped in. The visual design is unusually refined for a student submission: editorial serif headings, monospaced micro-labels, a pale cream ruled-paper background, and a rust-orange accent for state highlights (checked chips, completed tasks).
50% to 100%.67% (2 of 3)..mood-picker.open class); each chip is clickable and writes back to state.localStorage. Refreshing the iframe loses every toggled task, added item, mood change,
and note edit. For a planning tool, this is the most jarring limitation.
window.alert(). Inspecting the source shows
alert('Could not load JSON: ' + e.message). A native alert box is jarring inside the
otherwise refined, paper-like aesthetic. The app has rust-toned inline UI elsewhere — those
styles should handle errors too.
name, date, mood,
routine, note…).
Keep the editorial look and feel of Daily., but make it feel like a living planner instead of a demo reading a frozen JSON. Specifically:
- Replace the hard-coded greeting/date with live ones: derive the day/date from
new Date(), and switch “Good morning” between morning / afternoon / evening / night based on local time. Keep the JSON as an optional override only.- Persist all in-memory state to
localStorageunder a per-day key (e.g.daily:2026-04-22). On load, hydrate first from localStorage, then fall back to the JSON file, then to the built-in sample. Show a small “last saved HH:MM” tag in the header.- Add an Export JSON button in the header that downloads the current day's state as a
.jsonfile, so users can back it up or hand off to a different instance.- Give tasks full CRUD. Add a small × affordance on hover for each list item to delete, and allow drag-to-reorder (pointer drag). Preserve completion state across reorders.
- Make the name inline-editable (
contenteditablewith a subtle rust underline on hover) and persist the edit to localStorage. Same treatment for the Note body and the date label.- Replace
alert()with a rust-toned inline toast styled to match the rest of the app. When a JSON upload fails schema validation, show the missing keys in the toast (e.g. “Missing: routine, mood”) and keep the existing state intact rather than wiping it.- Add a small “Expected JSON shape” disclosure on the intake screen with a two-line example, so contributors know what to drop.
- Add an optional dark-mode toggle (ink on charcoal, rust accent unchanged) and a single-column stacked layout below 720px viewport width.
- Add a weekly streak widget derived from the localStorage daily keys, matching the editorial style (serif digit, dotted underline).
Keep the project a single HTML file with vanilla JS so it continues to run inside the TERMINAL_VIEWER iframe without a build step.