Skip to content
Nathan Zhou

Changelog

What the site has gained

Every change, newest first, as it was written down while the site was being built.

Atom feed of the changes

137 changes

October 202684 changes

  1. Added

    The Time Manager answers the keyboard: with a sitting focused, on the Today list, the board or the timeline, D logs it done (Shift+D all of it), L pushes it off today, X says it did not get finished, S splits it, E edits the homework, [ and ] move it a day (the focus goes with it), U undoes a move, and the arrows go from sitting to sitting. “?” lists them there.

  2. Added

    The Time Manager can put your planned study blocks in Google Calendar, Apple Calendar or any calendar that takes a link, kept up to date as the plan changes; the link can be replaced or turned off from settings.

  3. Added

    A Juice assignment can give each player the questions in an order of their own, so neighbours are rarely on the same one; it is on by default and reports read the same.

  4. Added

    A Juice host can start a rematch from the podium: the same quiz again, with a new PIN, and the players follow into the new lobby under the same names and avatars without typing anything.

  5. Added

    A Juice host’s lobby has a “Copy join link” button, for posting the game’s own address in a class chat.

  6. Added

    Project pages can show short screen recordings, muted and looping, that play only while in view, hold still with reduced motion or a data saver, and can always be paused. None are recorded yet.

  7. Added

    The home page shows when each project began, on a strip from July to today, dated by each project’s first commit.

  8. Added

    A project page says when the project last changed, where something can say it truthfully: the Datacenter Tracker from its public code on GitHub, the Time Manager from this site’s own code.

  9. Added

    The home page’s signposts gain a Juice tile, to the join page, saying how many games were played this week and by how many players.

  10. Added

    Each hosted site’s card says how many visits it had this week, counted as its pages are opened, without the owner’s own visits, crawlers or prefetches, and with nothing kept about visitors.

  11. Added

    The admin console counts views of the public pages, a week at a time, by day and by page, without cookies, addresses or IDs; crawlers, browsers that ask not to be tracked, and the admin are left out. The colophon says so.

  12. Added

    /status shows whether the site, its database and Juice’s code runner are up, checked as you look, with when the running copy started and how many Juice games are being played; /api/status gives the same as JSON.

  13. Added

    /colophon says how the site is made: what it is built with, its type, what happens on the page, how a change goes live, and what it does and does not keep about visitors, with the commit that is running.

  14. Added

    /changelog lists everything the site has gained, newest first, each change dated by when it was committed and filterable by kind, with an Atom feed of its own for people who follow the site itself; /now’s “Lately on this site” links to it.

  15. Added

    The Datacenter Tracker’s page has a Source button to its code on GitHub, the one project whose repository is public.

  16. Added

    On a project page, a tool another project also uses is a link to everything on the site that mentions it, and “Built with the same tools” lists those projects with the tools they share.

  17. Added

    A project page’s chapters (See it work, How it works, Worth knowing) end in a § that links to the chapter and copies its address, ready to paste.

  18. Added

    Each project’s page tells search engines what the project is: its name, what it does, what sort of thing it is (“CLI · terminal UI · web console”), what it is built with, and its screenshots with their captions.

  19. Added

    A shared Juice join link (nathanz.cloud/play/123456) unfurls as the quiz: its title, the PIN, how many questions and whether it is live or at your own pace, and that no account is needed.

  20. Added

    “?” opens the command palette on the keyboard jumps (g then h for Home, n for Now, and so on), each of which can be chosen like any page.

  21. Added

    npm run test:a11y checks every page with axe-core in Chrome: public pages in both languages and themes and on a phone, and the working screens when given a local account. Everything it found is fixed (see Fixed).

  22. Added

    Updates, guestbook notes and answers are marked with the language they are written in, on every page and in the feeds, so a screen reader reads a Chinese update in a Chinese voice on the English site (and the other way round), and Chinese is spaced as Chinese there too.

  23. Added

    A thin line across the top shows a page is on its way, when it takes a moment.

  24. Added

    Moving between public pages eases the new page in, the header staying put; still with reduced motion.

  25. Added

    An update, a tag and a project page open with breadcrumbs showing where they sit (Home / Now / …).

  26. Added

    The command palette opens with the pages you visited last, “/” opens it too, and “g” then a letter jumps straight to a page (n for Now, g for the guestbook, and so on).

  27. Added

    From the command palette, the site can be kept still whatever the device says, its text set larger, and reading mode turned on (also on each update’s page). Each is kept in the browser and applied before the page paints.

  28. Added

    The admin’s account button shows how many guestbook stamps wait for approval, with a way straight to them.

  29. Added

    The guestbook has a desk: a visitor can put their stamp where they like on it, and the page shows every stamp in its place. A stamp of the day heads the wall, the wall loads more as you ask, and the admin can answer a stamp, the answer shown under it.

  30. Added

    An enlarged /now picture zooms: double tap or click, pinch, or + and −, then drag to look around; 0 or another double tap comes back.

  31. Added

    Pictures put together in one paragraph of a /now post show as a row, side by side at one height.

  32. Added

    /now images load as AVIF where the browser reads it, and in the width the screen needs, made once on the server and kept.

  33. Added

    An address alone on its line in a /now post shows as a card with the page’s site, title and description, fetched safely by the server and kept a week; no picture is loaded from the other site.

  34. Added

    /now updates can be tagged. Each tag has its own page and feed, the tags show under each update, and /now lists every tag in use.

  35. Added

    The 404 page offers to search the site for the words in the address that found nothing.

  36. Added

    /now has a search box for its updates.

  37. Added

    The site can be searched: /search finds /now updates, projects and pages that mention every word asked for, and the command palette searches as you type.

  38. Added

    Each /now update has a Reply by email link under it, the message’s subject naming the update.

  39. Added

    /now prints cleanly: the words on white in any theme, links followed by their addresses, code wrapped, and the controls left off the page.

  40. Added

    /now gathers its updates under the months they went up in.

  41. Added

    Each heading in a /now post can be linked to, by the # beside it, and an update with three sections or more lists them as its contents.

  42. Added

    /now posts can have footnotes ([^1]), gathered under the post, with links there and back that never jump into another post’s notes.

  43. Added

    /now code blocks name their language and number their lines (from three lines on); copying or selecting the code leaves the numbers behind.

  44. Added

    /now says how long an update takes to read, beside its date, once it is more than a minute.

  45. Added

    The /now editor’s Card panel shows how a link to the update will look when shared, drawn from the draft as you write, with the title and description it will carry.

  46. Added

    The admin console’s audit log reads in words, each with an icon (“Posted to /now”, “Failed sign-in”), the code itself on hover. Approving or removing a guestbook stamp is now recorded there too.

  47. Added

    The admin console lists every image uploaded for /now, with its size and the updates, drafts or earlier wordings that use it. Unused ones can be removed at once, and any can be copied as Markdown.

  48. Added

    The admin console can download a backup of /now: every update as a Markdown file with its dates, beside the images it shows, in one zip.

  49. Added

    ⌘/ (Ctrl / elsewhere) in the /now editor lists every shortcut it answers to.

  50. Added

    Typewriter mode in the /now editor keeps the line you are writing in the middle of the box.

  51. Added

    The /now editor’s spell checker follows the language a draft is written in (English or Chinese), or one you choose, or can be turned off.

  52. Added

    The /now editor’s footer says about how long the update takes to read.

  53. Added

    Images added in the /now editor show upload progress, hold their place in the text while they upload so writing can carry on, and can be tried again or left out when an upload fails.

  54. Added

    The /now editor has an Images panel: every image in the draft with a thumbnail, its description and its caption, filled in without hunting through the Markdown. The warning about an undescribed image opens it.

  55. Added

    Rich text pasted into the /now editor from a web page, Google Docs or Word comes in as Markdown: headings, bold and italic, links, lists, quotes, code and tables. A copy from a code editor still pastes as plain text.

  56. Added

    /now posts are set as type: straight quotes curl the way they face, an apostrophe becomes ’, three dots an ellipsis, --- an em dash and -- an en dash, on the page, in the feed, titles and cards. Code is left as typed.

  57. Added

    /now drafts are kept on the server as well as in the browser, so writing begun on one device carries on on another; the newer copy opens.

  58. Added

    Edited /now updates keep their earlier wordings; the editor’s History shows them and brings one back.

  59. Added

    Removing a /now update can be undone: it disappears at once, the console offers Undo for ten seconds, and it is only deleted for good an hour later.

  60. Added

    /now updates can be scheduled: written now, they go up at the time you choose, and can be moved or posted early until then.

  61. Added

    Enlarged, a /now post’s pictures can be stepped through with ← and →, or the buttons at the sides, with a count of where you are.

  62. Added

    /now post images show a soft placeholder where they will appear while they load.

  63. Added

    The /now editor gains Table and Divider buttons, and pasting a link over selected words turns them into a link.

  64. Added

    Coming back to the site, updates posted since your last look at /now are marked new, on /now and beside its signposts on the home page.

  65. Added

    A shared link to a /now update with a picture unfurls with that picture, framed beside its first line.

  66. Added

    Images in /now posts show their description as a caption underneath, on the page, enlarged and in the feed; ![description](image "caption") gives one a caption of its own.

  67. Added

    Each /now update’s page has a Share: the device’s share sheet, or its link copied.

  68. Added

    Posting or saving a /now update in the admin console links straight to its page.

  69. Added

    /now updates are written in a full-screen Markdown editor, beside a live preview, with a toolbar, shortcuts and drafts kept as you type, and can now run to 8,000 characters (from 2,000).

  70. Added

    Images in /now posts open larger when tapped; Escape, or a tap anywhere, closes them.

  71. Added

    The sitemap names the project screenshots on the pages that show them, so image search can find them there.

  72. Added

    Code blocks in /now posts have a copy button.

  73. Added

    Code in /now posts is coloured by language: Python, JavaScript, Java, C, C++ and C#.

  74. Added

    /now updates can be corrected after posting, keeping their address, so links to them stay good; an edited update says so beside its date, and feed readers and search engines see when it changed.

  75. Added

    Something for anyone who opens the browser’s console.

  76. Added

    With the system’s high-contrast setting on, secondary text darkens, field edges and dividers show clearly, and the glass header turns plain paper.

  77. Added

    The command palette (Ctrl/⌘ K, or the search button) can share the page you are on: through the device’s share sheet where there is one, or by copying its link.

  78. Added

    /.well-known/security.txt says where to report a security problem.

  79. Added

    The CV and the site lobby get share cards of their own, so every public page now unfurls as itself: the CV with its first line, the lobby with how many sites are listed.

  80. Added

    The home footer says when the site was last updated, and links to what changed lately on /now.

  81. Added

    Adding the site to a home screen, or installing it, now gives it its name and a proper icon in the site’s caramel, and a long press offers shortcuts to Now, the guestbook, the Time Manager and Juice (a web manifest).

  82. Added

    A “Skip to content” link, the first stop for the Tab key on every page, jumps past the header to the page itself.

  83. Added

    On a phone the browser’s bar takes the page’s paper colour, light or dark, and follows the site’s own theme switch.

  84. Added

    Selected text takes the site’s own colour, and so do the text cursor and native checkboxes, radio buttons and sliders.

September 202653 changes

  1. Added

    Every /now update has a page of its own, with a share card showing its first line and the updates either side of it; /now pages back through older updates twelve at a time, and has an RSS feed (Atom) for readers. /now and the guestbook get share cards of their own too: the latest update, and how many stamps are on the desk.

  2. Added

    A 404 suggests the page you probably meant: a typo, a project named without /projects/, /resume for the CV, or the section above a page that is gone.

  3. Added

    Search engines get more to go on: a sitemap and robots rules, a canonical address for every public page, and structured data naming the site and its owner, with breadcrumbs, so a result can show the site’s name and a tidy path rather than a bare link; a fuller description for the home page. npm run indexnow tells Bing when pages change.

  4. Added

    Signposts to the smaller pages: under the home introduction, the latest /now update beside a small breathing dot; at the end of the home page, tiles for /now, the guestbook (showing its latest stamp), the CV and the site lobby, each with a live line, in place of the row of small links.

  5. Added

    More avatars for Juice players: seven critters to pick from (the site’s own, a cat, a bunny, a bear, a frog, a robot and a ghost), twelve colours and ten hats, from a graduation cap to a halo. Players who joined before keep theirs.

  6. Added

    Java in Juice: fill-in-the-code questions in Java, checked on the server as soon as they are answered, so self-paced players see their result at once; players’ “Run it” and the editor’s runs work too. Java runs in a code runner of its own (Piston, in a VM with none of the host’s files), where every run gets a fresh sandbox with no network that is deleted afterwards. A “Java basics” starter quiz, and AI drafts can include Java fill-ins.

  7. Added

    Images in /now posts: add them from the admin console by button, paste or drop. Each is resized and re-encoded, and its location data removed.

  8. Added

    Juice, live coding quizzes: make a quiz at /juice from five question types (multiple choice, find the bug, what does it print, fill in the code, put in order), or copy one from a starter library. Fill-in-the-code questions run in the browser, sandboxed, in Python or JavaScript.

  9. Added

    Juice assignments: share a link and PIN, players join on their phones with a nickname and a pixel critter (no account) and work through the quiz at their own pace; results per player and per question, downloadable as CSV.

  10. Added

    Live Juice games: a host screen with the PIN and a QR code, questions with a timer, the room’s answers revealed, a scoreboard between questions and a podium at the end, with players answering on their phones. Fill-in answers are checked by the host’s browser. Deploys wait for live games to finish.

  11. Added

    Juice for the admin: draft a quiz with AI from a topic, and see every account’s games in the admin console.

  12. Added

    A lobby of hosted sites at /sites. Owners choose to list a site, with a line about it; unlisted sites stay reachable only by their address.

  13. Added

    A Chinese version of the public pages: 中文 / EN in the header, or automatically for browsers set to Chinese. Project names, the stack and the working screens (Time Manager, hosting, admin, sign-in) stay in English.

  14. Added

    Hosting for signed-in users: upload a static site (HTML, CSS, JavaScript and their assets) file by file, as a folder, or as one .zip or .7z, and it goes live at /host/ plus a six-character code. Manage your sites at /host; the admin console lists everyone’s. Hosted pages run sandboxed, apart from the rest of the site.

  15. Added

    Share cards: links to the site and to each project unfold into an image with the pixel avatar at its desk.

  16. Added

    A /now page of short updates, posted from the admin console, with what the site gained lately.

  17. Added

    A command palette (Ctrl K, or the search button in the header): every page, copying the email address, theme and sound, the squash game, and the easter eggs found so far.

  18. Added

    Dark mode, following the device unless switched in the header; the pixel art keeps its paper colours.

  19. Added

    Seasonal outfits for the avatar: a witch’s hat at Halloween, a Santa hat at Christmas, a party hat at New Year, lanterns at Lunar New Year.

  20. Added

    A pixel squash game: keep the rally going. From the palette, the 404 page, or typing squash with the avatar.

  21. Added

    A guestbook: leave a pixel stamp; each is approved in the admin console before it shows.

  22. Added

    A printable CV of the projects at /cv.

  23. Added

    Optional sound: soft paper and click sounds, off until turned on in the palette.

  24. Added

    Live figures on the Datacenter Tracker’s card, read straight from its database on the host.

  25. Added

    A replay of Sisyphus at work on its page, with made-up messages.

  26. Added

    An easter egg on the home page: type print("Hello world!") along with the avatar and it runs.

  27. Added

    Type along with the avatar: with nothing focused on the home page, what you type comes up as code in its editor, the arms tapping along; Enter passes the tests for you. A hint appears after a few seconds.

  28. Added

    The avatar follows the visitor’s clock: late at night its lamp is on, there is a moon, and it yawns; on weekend mornings it keeps a squash ball up on a racket, with a court in its editor.

  29. Added

    Signing out plays the sign-in flight backwards: the sheet sinks away and the home page drops into place.

  30. Added

    A copy button beside “Get in touch”: the address folds into a paper plane that flies into the header, and “Copied” lands under the button.

  31. Added

    After choosing a password, the invitation folds back into its envelope, the seal presses shut, and the envelope flies off as the Time Manager rises.

  32. Added

    Numbers in a project’s facts count up the first time they scroll into view.

  33. Added

    Screenshots on a project page lift out into a viewer, their shadow swelling as they rise, and drop back into place when closed.

  34. Added

    In the Time Manager, pressing Done strikes the title through and draws a tick before the celebration opens.

  35. Added

    A small avatar peeks over the sign-in card; it winces at a wrong password and grins on the way in.

  36. Added

    A 404 page: the pixel avatar leafing through a book of blank pages with a magnifying glass, looking for the page that is not there.

  37. Added

    An invitation arrives as a letter: the envelope’s wax seal cracks, the flap opens, a letter addressed to the guest slides out and unfolds into the form for choosing a password.

  38. Added

    Signing in turns the page like a stack of cards: the sign-in card tilts back and flies up off the page while the Time Manager (or the admin console) rises from behind it.

  39. Added

    Each project page ends with a page turn: scrolling past the last section tilts an end card up and away, and the next project’s card rises from behind it, with a glass label over its screenshot.

  40. Added

    A pixel-art avatar beside the home intro: a caramel-orange critter with a mop of dark hair, typing code on a laptop in a loop. The lines type out, the tests pass, it hops and beams, and it starts again. SVG and CSS only, in Meridian colours; it holds still for reduced motion.

  41. Added

    Site icons: an Instrument Serif “N” in paper on a Meridian caramel tile, as a favicon (16/32/48, hinted to the pixel grid), an SVG icon and a marbled Apple touch icon, drawn by scripts/make-icons.py from the tokens file.

  42. Added

    Squash Review as a fourth project, with a details page; contact by email while it has no public deployment. Screenshots of its report, court analysis, upload step and landing page.

  43. Added

    A live marbled-ink background on the public pages, ported from the Squash Review app, coloured from the Meridian tokens instead of its Court Red.

  44. Added

    Project screenshots: a cover on each homepage card and a captioned gallery on each details page, shown as soon as the file exists in public/projects/<slug>/.

  45. Added

    Screenshots for all three projects, with private details blurred: others’ names, the host’s name and paths, the owner’s email and class timetable.

  46. Added

    Portfolio home page and a details page for each project: Datacenter Tracker (links to its live console), Sisyphus (contact by email, address assembled in the browser), and Time Manager (sign-in required).

  47. Added

    The Time Manager, forked from the standalone app, served under /scheduler.

  48. Added

    Sign-in with no signup: the admin is created by npm run admin:create on the server; everyone else by a one-time, 48-hour invite link from /admin.

  49. Added

    Admin console at /admin: grant, suspend, delete, access-until dates, per-user photo scanning with a daily cap, live sessions with per-session sign-out, and an audit log.

  50. Added

    /account to change your own password.

  51. Added

    Failed sign-in throttling per IP and per username.

  52. Added

    /api/health, reporting the commit being served.

  53. Added

    Deploy pipeline in deploy/: the host polls GitHub, builds in an idle slot, switches over only after tests, build and a health check pass, and publishes through a Cloudflare tunnel. A failed dependency install is retried on the next poll rather than refusing the commit.