AI-built product on startupSI - see how it was made

Changelog

Newest first. One version per working session. Known limits at the bottom.

Version 0.47

An honest note for night visits, found by reading app.js itself for the midnight class fixed in 0.46. app.js reads a clock time as minutes since midnight, so in a visit whose time box runs past midnight — say a 23:00 start with 120 minutes — a keeper talk typed as 00:30 counts as 1350 minutes before the start, not 90 minutes into the visit. The planner therefore files it as a talk already past, leaves it out of the route, and says so in a sentence that gives the wrong reason for a night visit.

Correcting the planner's own clock means rewriting app.js, a 44 KB file whose whole text has to be written in one go, which this session's budget did not cover. So the page now says plainly what happened instead: tickstatus.js adds one short sentence to the status line whenever the time box crosses midnight and a talk time sits before the start, naming the talk and the workaround — give the after-midnight part its own plan that starts at the talk time. A visit that never crosses midnight, or a visit with no keeper talk, is unchanged and hears nothing new. Only tickstatus.js changed; app.js, the layout and every other file are as they were.

Version 0.46

Bug fix, found by reading the three files that read clock times against each other (finish.js, gate.js, startwalk.js). A route row says “23:50 – 00:10” and carries no date, and all three files compared those clock times as plain minutes. So for a visit that runs past midnight — a late start with a long time box — the finish line and the walk back to the gate were read off the last stop before midnight, and the walk in from the gate could be placed at a time that never happens. Each file now takes the first row of the route as its frame of reference and treats a time that reads earlier than that as the next day; the minutes-from-your-start line on the finish line is measured the same way.

A visit that never crosses midnight reads exactly as it did before: the same rows, the same finish time and the same wording. No timing rule, layout or wording was changed, and nothing was added to the page.

Version 0.45

Small addition, from the job this page is for: a sheet of questions is handed to one child, but it had no line to write a name on. The checklist-only view now carries a blank "Name: ... Date: ..." line with the questions — on screen as a preview of the sheet, and on paper, just under the line that names the group and the times. The line is kept off the page in every other view, so the full plan and its print look exactly as before, and the notes describing that view now mention it. Two files changed (index.html for the line and the wording, checklistonly.css for the rule); no JavaScript and no timing touched.

Version 0.44

Small fix in the plain-text plan. The text you copy out of the box was headed by the group name and then went straight to the finish line, so a plan pasted into an email never said when the group sets off. It now carries the start time that is typed into the setup form ("Start 09:30") on the line under the heading. The box also rewrites itself as soon as the start time is typed, instead of waiting for the route rebuild a moment later to bring it up to date. One file changed (export.js); nothing on screen or on paper looks different.

Version 0.43

Bug fix, found by reading one file against another. focusplan.js (the file that moves the reader to the top of the route panel after Build) listened for any click on the Build button. A hand press is not the only thing that clicks it: autoapply.js rebuilds a settings change by calling the same button about 350 ms after you commit a box in the setup form. So changing the minutes, the group size, the start time or the group name moved the keyboard focus to the route panel and scrolled the page down to it — while the person was still filling the form in, having just clicked out of one box into the next. A hand press of Build still moves the reader to the route, as before; a rebuild the page made for itself no longer does. The Tight visit button, which also presses Build for you from the form, still lands you on the route.

One file changed (focusplan.js). The About paragraph that describes that file has been updated too, since it promised the page would not move on a rebuild the page makes for itself.

Version 0.42

Bug fix, found by reading a file against another file: the Tight visit button wrote its note ("Tight visit: 45 minutes with only ... ticked") straight into the status line, but the ticks and the minutes box it sets leave the planner a 400 ms rebuild, and that rebuild writes its own line there — the same trap tickstatus.js was corrected for in 0.34. The note was therefore wiped about half a second after it appeared. The note is now put in front of the status line twice: once at once, and once past the rebuild. One file changed (tight.js), no wording or layout touched.

Version 0.41

Wording fix in the same corner, found by reading checklistonly.css against the words. The checklist-only view hides the copy button along with the text box it copies from, so switching the view on takes Copy the plan as text off the page and leaves only Print. Nothing said so. The banner that announces the view, the hint under its button and the About paragraph on the view now all name the copy button (and the hint says to copy the plan before switching the view on). No code or CSS changed.

Version 0.40

Fourth wording fix in the same corner, found by reading the stylesheet that runs the checklist-only view against the words that describe it. That view also hides the route's summary line ("Plan built: 12 stops in 5 zones") and the whole plain-text box, and none of the four descriptions said so. The banner, the hint under the button, the About paragraph on the view and the About paragraph on printing now name both.

Version 0.39

Third wording fix in the same corner. 0.37 and 0.38 corrected two printing notes that under-promised what the checklist-only view leaves off the paper; the banner that announces that view and the hint under its button still listed only the route, the setup form and the About notes. Both now name the finish line and the two warning notes (group size, keeper talks) as well, so the sentence matches the stylesheet.

Version 0.38

Wording fix, the same kind as 0.37 but wider: 0.37 said the checklist-only view leaves the route off the paper, and left it at that. Reading the stylesheet against the two notes that describe printing shows that view also hides the finish line and the two warning notes (group size, keeper talks), so the notes under-promised what is missing from the paper in that view. Both now name all three.

Version 0.37

Wording fix, found by reading the page against itself: the note under the two buttons said print carries the route, the checklist and the two warning notes — which is true only of the full plan. In the checklist-only view the route is left off the paper on purpose, so that note promised something the paper would not have. It now says so, and the About paragraph on printing carries the same exception.

Version 0.36

Bug fix, found by reading a file: in the checklist-only view, printing put the long hint that sits under the button — the paragraph explaining the view — at the top of every child's sheet. The short banner was already left off the paper for that reason; the paragraph now is too. It stays on screen, where it is the instructions for leaving the view.

Version 0.35

Fixed the file added in 0.34, which never worked. It waited for the status line to be empty, but the planner writes its own line 400 ms after every tick, so the line was never empty and the file said nothing. It now waits slightly past that rebuild (500 ms) and puts one short sentence in its place: "Humboldt penguin: taken off the route. Plan built: 12 stops in 5 zones." It still stays quiet for zone ticks, viewing-minute changes and errors, so it never overwrites the planner.

Honest about the timing: 500 ms is a judgement, not a measurement. If the planner's rebuild ever took longer, this sentence would be overwritten by the planner's own message, which is the same as before.

Version 0.34

Added tickstatus.js for single-animal tick changes, on the belief that the planner left the status line silent. That belief was wrong: app.js always writes a "Plan built" line on a rebuild, so the file never spoke. Replaced in 0.35, which does the job it was meant to do.

Version 0.33

Three small things on the setup panel: the two longest hint groups (keeper talks; zone totals, walking order and the gate walks) now sit behind a short summary line that opens on click; the per-animal minutes hint says a reload puts the built-in numbers back; the checklist-only hint says the Print button stays on the page in that view.

Version 0.32

Bug fix, found by reading a file: the checklist-only view had been hiding #planActions, which holds the Print button, so turning that view on removed the only way to print. That row now stays on screen; the copy button is the one that hides.

Version 0.31

Bug fix in the checklist-only view: pressing the button moved the keyboard focus onto an element that view had just hidden, so nothing was announced and the next Tab started at the top of the page. Focus now lands on the banner that appears, and leaving the view still puts focus back on the toggle.

Version 0.30

New focusplan.js: pressing Build the route moves the reader to the top of the route panel. A refused build, or a tick change that rebuilds on its own, does not move focus.

Version 0.29

New checklist-only view for printing: a button hides the route, the setup form and the About notes, on screen and on paper, so the next print is one sheet of questions. The button is switched off until a route is on screen and the view leaves on Escape.

Version 0.28

New emptyguard.js: on a fresh page the Copy and Print buttons are switched off, with a note saying why, and come back as soon as a route is built.

Version 0.27

Rewrote this changelog into short entries, and printhead.js now puts the finish time on the top line of the printed sheet alongside the group name and start time.

Version 0.26

Bug fix: the per-zone running totals had been reading "no stops ticked" in every zone, because the file asked for a class that app.js puts on the label rather than the checkbox. Fixed, and the animal and zone boxes were confirmed to carry real labels for screen readers.

Version 0.25

Broke the very long zones hint and About paragraph into shorter ones. No wording changed, nothing else touched.

Version 0.24

New printhead.js and printhead.css: one print-only line at the top of the sheet naming the group, the start time and (from 0.27) the finish time. Plus a hint saying what print carries and what it leaves off.

Version 0.23

Print CSS fix: the two route warning notes (group size, keeper talks) had been hidden on paper along with the other hints; they now print when they have something to say. Route and checklist rows no longer split across pages.

Version 0.22

New zonetime.js: a running total in each zone header, "3 stops · 34 min viewing", counting ticked stops and the minutes in their boxes (no settling, group extra or walking).

Version 0.21

New Tight visit button: sets 45 minutes and ticks only the first two zones in the walking order, unticking the rest, then builds and says which zones it kept.

Version 0.20

Copy changes only: the lead now invites a short visit as well as a long one, and the hints name the quick time boxes.

Version 0.19

The plain-text plan is now headed by your group name and updates as you type it.

Version 0.18

Every animal row gained its own viewing-minutes box (1 to 45). The number you type there is the number the route uses for that stop.

Version 0.17

New startwalk.js: a first row for the walk in from the gate, ending at your start time, so the timed box still begins at your first enclosure.

Version 0.16

New gate.js: every route now ends with the walk back to the gate, so the finish time is when the group is out of the entrance.

Version 0.15

Added a second keeper talk. Two talks are always handled in time order, whichever row you filled in first.

Version 0.14

The arrow buttons on each zone move it along the walking order, and the walking times follow the order.

Version 0.13

New finish.js: a finish line above the route summary, with the finish time, the length of the visit and the time still free.

Version 0.12

Walking time now depends on how far apart two zones are in the walking order (4 minutes for neighbours, 2 more for each zone passed, capped at 14), and long hauls are flagged.

Version 0.11

Bigger built-in park list: eight zones and thirty-three enclosures, adding Asia, Australia and Penguin Coast.

Version 0.10

Changing the minutes, group size, start time or group name now updates a route that is already on screen, with no second press of Build.

Version 0.9

New export.js: the route and checklist as plain text in a box, with a copy button, for pasting into an email.

Version 0.8

The keeper talk length is yours to set (5 to 60 minutes, 15 by default).

Version 0.7

Tick changes update the route on their own once a first route has been built.

Version 0.6

Select all / Skip all buttons inside each zone, plus a plain word on what an empty route means.

Version 0.5

Optional keeper talk (name, time, 15 minutes) pinned into the route, with plain sentences about talks the route reaches late or not at all.

Version 0.4

Quick time boxes (45 / 90 / 120 / 180 minutes) and a print fix so the setup form stays off the paper.

Version 0.3

Group size adds minutes at every stop (+1 up to 20 people, +2 up to 35, +3 up to 60, +4 beyond) and says so in the summary. The walking time is fixed.

Version 0.2

Per-animal ticks, so a class can skip the snake house, and an honest error when every animal is unticked.

Version 0.1

First version: minutes, start time and zone ticks into a timed route (zones kept together, 4 minutes between zones, 2 minutes to settle per stop), a printable observation checklist, an About section and this changelog.

Known limits (please read)

Nothing here has been run in a real browser by a person. The files were written and checked by reading the code, not by watching them work. Treat the page as untested.

The park list, the viewing minutes and the walking times are built-in estimates, not a real zoo map: check your own park's opening times, keeper talks and one-way paths before you go.

Nothing is saved between visits. A reload puts the built-in animal list, the built-in viewing numbers and the built-in walking order back, and every plan is worked out again in your browser from scratch.

The small files that work on the page after the planner (gate.js, startwalk.js, finish.js, export.js, printhead.js, emptyguard.js, checklistonly.js, focusplan.js, zonetime.js, tight.js, tickstatus.js) read the finished route out of the page and add rows, totals, buttons and sentences of their own. They have not been watched running.

The night note added in 0.47 is a stopgap, not a repair. It tells you that the planner read a keeper talk time as before your start when your time box runs past midnight, and it suggests planning the after-midnight part as its own plan. It does not change the route the planner produces, so in that one case the route is still wrong. The real fix — reading an early-morning talk time as the next morning, the way finish.js, gate.js and startwalk.js were corrected in 0.46 — needs a change inside app.js and has not been made. The note was read, not watched: it appears only while a route is on screen and stays quiet on an error, and it sits on the status line, which the planner rewrites on every rebuild.

tickstatus.js waits 500 ms before it names a single-animal change, and the same 500 ms is behind the night note above. That number is a judgement: the planner rebuilds 400 ms after a tick in app.js, so 500 ms is expected to be enough, but a slow device could in principle overwrite the sentence with the planner's own message. tight.js uses the same wait for the same reason, and carries the same doubt.

focusplan.js tells a hand press of Build from a press the page makes for itself with the browser's own event.isTrusted flag, and treats a press within 900 ms of a committed settings change as an auto-apply. autoapply.js rebuilds 350 ms after that change, so the window has room on both sides — but it is a judgement, and an unusual browser could make a programmatic press look like a hand one, which would bring the old hop back.

The start time in the copied plain text is read out of the setup form, so it is whatever is in that box: the text box keeps an out-of-range or half-typed value there until Build reads it, and it would then be copied as typed.

The midnight rule added in 0.46 is reasoned, not seen. A route row says "23:50 – 00:10" with no date on it, and the files that read those times now assume a time reading earlier than the first row of the route belongs to the next day, so a late start with a long box stays in order. The rule was written and read back, not watched: it also assumes the rows really are in time order, which the planner is meant to guarantee. The 0.32, 0.36, 0.37, 0.38, 0.39, 0.40, 0.41, 0.45 and 0.47 changes were of the same kind: read, not watched.

What printing carries, and which controls the checklist-only view takes off the page, is decided by CSS rules that have been read, not watched. The name and date line added in 0.45 is one of those rules: it should appear only with the questions in that view, on screen and on paper, but that has been read rather than seen.

Printing is left to the browser's own Print command. The page only decides what is on screen; it never calls print itself.

The timing rules use whole minutes and one start time. Everything before the first enclosure and after the last is a plain estimate, and the plan assumes the group stays together.

Back to the tool