New to OpenCode? Start with OpenCode setup, model providers and course budget, then return here for your chosen app.
Stop squinting at six days of activity in one endless spreadsheet column
A behaviour tracker gives you one number per minute for days on end: 8,000 rows for a single larva. Somewhere in there are the answers you care about. When does activity start each day? Does the rhythm keep running when the lights stay off? And where did the recording stop for three hours? Actogram Viewer turns the minute counts and your light schedule into a double-plotted actogram: one row per day, lights and darkness shaded, gaps left blank, activity onsets marked.
You will build it with OpenCode, one request at a time, and check every number yourself. The app runs locally in your browser: one file, no installation, no upload. The recording is synthetic: one zebrafish-larva-style activity trace, three days on a light–dark cycle and then three days in constant darkness, with one 3-hour recording gap. Your own permitted data comes in at Step 18.
The real result: a viewer you own, understand and can extend. You will practise the whole cycle, including two real corrections the recorded build needed.
You will finish with: a local viewer that turns activity.csv and schedule.csv into a double-plotted actogram with onsets —, 0.0, 0.0, 1.0, 2.0, 3.0 (ZT hours) that you can recompute, and a binned table you can export.
First watch the 1:45 result tour. It shows where you are going. The numbered steps below are the lesson: what to click in OpenCode, what to paste, and what must appear before you continue.
Silent, with on-screen explanations. OpenCode scenes are captures from the recorded build; app scenes operate the actual OpenCode-generated app. Captions and highlights were added afterwards. Read the transcript (opens in a new tab) · Download the movie (opens in a new tab).
Use: keep this manual beside OpenCode and your browser. Complete each Success check before continuing. Click any screenshot to enlarge it.
Files: reference kit: working app, four checkpoints, practice CSVs and exact prompts (opens in a new tab). Extract the ZIP first: Windows right-click → Extract All; Mac double-click. Keep it beside your project.
Your personal coach: Step 4 turns your OpenCode session into a one-step-at-a-time guide. For help later, paste the complete coach brief (opens in a new tab) into your project session and tell it your step number.
Five words you will meet. Actogram: a picture of activity over many days, one day per row, so daily patterns line up underneath each other. Zeitgeber time (ZT): hours counted from lights on, which is ZT0 ("Zeitgeber" is German for time-giver: here, the light). LD and DD: a light–dark cycle, and constant darkness. Bin: a block of minutes (here 10, 30 or 60) whose counts are added up. Onset: the moment in a day when activity switches from low to high.
Files for this journey
Download everything at once as the reference kit (ZIP) (opens in a new tab), or single files as you reach the step that needs them. Save each file into your project folder under exactly this name. If a file opens in the browser instead of downloading, press Ctrl+S (Mac: Command+S) to save it.
| File | First used in |
|---|---|
activity.csv (opens in a new tab) | Step 2 · Open your project |
schedule.csv (opens in a new tab) | Step 2 · Open your project |
activity-duplicate.csv (opens in a new tab) | Step 17 · Test two bad files before your own data |
schedule-ll.csv (opens in a new tab) | Step 17 · Test two bad files before your own data |
The kit also contains the finished app, the recorded checkpoints (checkpoints/…) and the exact prompts.
1. Get OpenCode readyLink to step
Do
- Open an ordinary website. Complete your university Wi-Fi sign-in if prompted.
- Install OpenCode Desktop: follow Step 1 of Set up OpenCode in the L1 book Start With OpenCode.
- Open OpenCode. For English labels, use Settings → Preferences → Language → English. In German: Einstellungen → Präferenzen → Sprache → English.
Success: OpenCode opens. Continue to the project; choose the model in Step 3.
If different: installation or Wi-Fi failure → use the seminar recovery card.
2. Open your projectLink to step
Do
- In Finder or File Explorer, create a folder named
actogram-viewerin Documents. - Copy the
datafolder from the extracted reference kit intoactogram-viewer. It holds four CSV files (plain-text tables):activity.csv(opens in a new tab) (the recording),schedule.csv(opens in a new tab) (when the lights were on), and two deliberately faulty files for Step 17. - In OpenCode, click Home → Add project.
- Select your
actogram-viewerfolder. Click Select folder. - Click New session.
Success: the new-session screen shows actogram-viewer below the message box.
If different: another folder name → return Home and add the correct folder. Open the project before choosing a model.
3. Select a working modelLink to step
Do: click the model name below the message box. Select the model assigned for the seminar. Wait until its name appears below the box.
Success: a model name is displayed. The next step checks that it answers.
If different: no working model or access → ask the instructor to confirm the seminar connection. OpenCode preselects the model you used last; in the recording that was a local model (Gemma 3 4B) that was not running, so Space Bunny Free was chosen from the menu. Free availability is not guaranteed.
Agent control: if Plan is visible, select Build before requesting edits. In the recorded interface the agent selector is hidden and Build is the default.
4. Start your OpenCode coachLink to step
Do: copy this block, paste it into OpenCode's message box and click the upward Send arrow.
Be my patient app-building coach. I am a beginner.
We will build Actogram Viewer in this folder, one step at a time.
Use one index.html with inline HTML, CSS and JavaScript,
no packages, server or network calls.
The data folder holds synthetic course data: activity.csv and schedule.csv.
activity.csv has 8,160 rows; read only its first 5 lines.
Explain in at most four short lines: Do, See, Success, If different.
Wait for my result before continuing.
Never claim to see my browser unless you actually inspected it.
Do not create files yet. Reply:
"Ready. Your project is actogram-viewer. Next: load the recording."
Wait: while OpenCode works, Send turns into Stop. Continue only when Stop has disappeared.
Success: OpenCode replies Ready. Your project is actogram-viewer. No file is created yet.
If different: an access or quota error → return to Step 3. Do not reinstall OpenCode to fix a model quota.
5. Load the recording: your first screenLink to step
Before drawing anything, the app must read both files and tell you what is in them. activity.csv (opens in a new tab) has two columns: time (e.g. 2026-05-04 14:00) and counts, the movement counts in that minute. schedule.csv (opens in a new tab) says from when which light condition applied and at what clock times the lights switched.
Do: paste this into the same session and click Send. Wait for Stop to disappear (about three minutes in the recording).
Create only index.html: the first Actogram Viewer screen, inline HTML, CSS and
JavaScript, no packages, server or network. Clean light design, dark teal heading,
system fonts, labelled controls. Two file inputs, read locally with FileReader:
"Activity file (activity.csv)" with columns time,counts (one row per minute)
and "Light schedule (schedule.csv)" with columns start,condition,lights_on,lights_off.
Look at data/schedule.csv and the first 5 lines of data/activity.csv.
Times are plain clock time "YYYY-MM-DD HH:MM": parse them yourself, no time zones.
Check: exact headers; counts a whole number of 0 or more; every time later than
the row before. Otherwise show a visible error naming the line and value, no summary.
When both files are valid, show a summary: minutes recorded, first and last time,
"ZT0 = 09:00 (lights on)" taken from the first LD row, each schedule row in words,
and every recording gap (missing minutes), e.g. "Gap: 2026-05-05 12:00 to 14:59
(180 min, no data)". Expect 8160 minutes, 2026-05-04 14:00 to 2026-05-10 08:59.
Initially show "No recording yet. Choose activity.csv and schedule.csv."
No plot yet. Save index.html, tell me how to open it, then wait.
"Parse them yourself, no time zones" keeps the browser from shifting your clock times, for example at a daylight-saving change.
Success: OpenCode says index.html was saved and tells you to open it.
If different: code appears only in the chat → send "Save that code as index.html in this project. Tell me the saved path." If a permission request appears, allow the file edit only when it names your project.
6. Open the app and check the recordingLink to step
Do
- In Finder or File Explorer, open
actogram-viewerand double-clickindex.html. If a text editor opens instead, right-click → Open With → your browser. - Under Activity file (activity.csv) click Choose File, open the
datafolder, selectactivity.csv(opens in a new tab), click Open. - Under Light schedule (schedule.csv) choose
data/schedule.csv(opens in a new tab) the same way.
Success: the summary shows 8160 minutes, first time 2026-05-04 14:00, last time 2026-05-10 08:59, ZT0 = 09:00 (lights on), and exactly one gap: 2026-05-05 12:00 to 14:59 (180 min, no data).
Check the arithmetic yourself: 14:00 on 4 May to 09:00 on 10 May is 6 days minus 5 hours = 8,340 minutes; minus the 180-minute gap = 8,160.
If different: no gap listed → send "The file has no rows from 2026-05-05 12:00 to 14:59. List that gap in the summary. Fix only that." The recorded build also wrote "dark-dark (DD)"; Step 8's request corrects that wording.
7. Keep your first working versionLink to step
Do: copy the whole actogram-viewer folder beside the original. Name the copy actogram-viewer-01-working. Continue working in the original.
Success: there are two folders. Both contain index.html and data.
If stuck: the kit's checkpoints/05-first-screen/index.html is the recorded working version. Copy it into a new recovery folder; keep your own work.
8. Bin the minutes and align them to Zeitgeber timeLink to step
Minute counts are too noisy to read. The app adds them up in bins, then cuts the timeline into days that start at lights on (ZT0 = 09:00), not at midnight. That way the same moment of the light cycle always sits in the same column. A bin without a single recorded minute has no value: drawing it as zero would look exactly like a resting animal.
Do: send:
The summary shows 8160 minutes and the 180-min gap. One wording fix: write
"light-dark cycle (LD)" and "constant darkness (DD)", not "dark-dark".
Now bin and align.
Add a "Bin size" dropdown: 10, 30 or 60 minutes; default 30.
Zeitgeber time (ZT): ZT0 = lights on (09:00). Day 1 starts at the last ZT0 at or
before the first recording (2026-05-04 09:00); each day runs ZT0 to ZT24.
Per bin: minutes recorded and the sum of counts. A bin with no recorded minute has
NO value: blank, never 0 (before the recording starts and inside the gap).
Draw an actogram in inline SVG using the full page width: one row per day, x axis
"ZT (h)" 0-24, ticks every 6 h, bar height = bin counts, one shared scale for all rows.
Background per bin from schedule.csv: light = pale yellow, dark = grey.
No-data bins: hatched background, no bar. Add a legend and label rows "Day 1 · 05-04".
Below, a "Days" table: Day, Date, Minutes recorded, Total counts. Expect 6 days:
Day 1 2026-05-04 1140 min 10957; Day 2 1260 min 13125; Day 3 1440 min 16329.
Keep the summary and all checks. Save index.html; tell me what to check, then wait.
Wait for Stop to disappear (about six minutes in the recording). Refresh the browser (Ctrl+R, Mac Command+R) and choose both files again: the browser forgets chosen files on every refresh.
Success: a Bin size dropdown shows 30 minutes; six rows, Day 1 · 05-04 to Day 6 · 05-09; the Days table lists Day 1 1140 minutes, total 10957; Day 2 1260, 13125; Day 3 1440, 16329. Day 1 starts with hatched blocks from ZT0 to ZT5 (09:00–14:00, before the recording started), and Day 2 has a hatched block from ZT3 to ZT6: the gap.
If different: the gap shows low bars instead of hatching → send "The gap 2026-05-05 12:00–14:59 is drawn as zero activity. Bins with no recorded minute must have no bar and a hatched background."
9. Look at the plot: find what is wrongLink to step
OpenCode's reply said to check the totals, and they are right. Do not stop there: look at the picture as a biologist.
Do: compare the shading with the schedule. Lights are on from 09:00 (ZT0) to 23:00 (ZT14), then off until 09:00 the next day.
Success: you spot it. On days 1–3 the larva goes quiet at ZT14, but the background stays pale yellow (light) until ZT24. The night is shaded as day. The axis numbers 588, 294 and 0 also collide with the row labels.
A wrong shading is a serious error: it would make a nocturnal animal look diurnal, or hide a response to lights off.
10. Send the correction, then check againLink to step
Do: report what you see, not "it is broken". Send:
I chose activity.csv and schedule.csv. Days 1-3 show ZT14 to ZT24 in pale yellow
(light), but lights are off from 23:00 (ZT14) to 09:00 (ZT0), and the larva is
quiet there. It looks as if every LD bin is shaded light. The shading must follow
each bin's own clock time. Expect on days 1-3: ZT0-14 light, ZT14-24 dark;
everything dark from 2026-05-06 23:00 (DD).
Also the axis numbers 588, 294 and 0 overlap the row labels such as
"Day 2 · 05-05". Move them apart so both are readable.
Change only this. Save index.html; tell me what to check, then wait.
Refresh the browser and choose both files again.
Success: on days 1–3, ZT0–14 is pale yellow and ZT14–24 is grey. From 2026-05-06 23:00 (Day 3, ZT14) everything is grey. The day totals are unchanged.
If different: your build already shaded nights grey → skip the correction.
Keep: copy your project as actogram-viewer-02-working. Recorded recovery file: checkpoints/07-shading-fix/index.html in the kit.
11. Draw the double plotLink to step
Look at days 4–6: the active block starts one hour later each day. In constant darkness there is no light to reset the animal's internal clock, so it runs at its own pace (it free-runs). The synthetic larva was given a 25-hour rhythm; real periods differ between animals and conditions. A drift like this soon crosses the right edge of a 24-hour row and breaks into two pieces. The double plot solves that.
Do: send:
Nights are now grey. Now make it a double-plotted actogram,
using the full window width for the plot (it is squeezed into the text column).
Each row shows 48 h: day n on the left (ZT 0-24) and day n+1 on the right
(ZT 24-48), so the right half of row n is repeated as the left half of row n+1.
Still 6 rows; the right half of row 6 stays empty (there is no day 7).
X axis ticks every 6 h from 0 to 48. Same shading and no-data hatch.
The tall 0-588 axis wrongly suggests one scale across all rows. Remove it and
write once above the plot: "Bar height: 0 to 588 counts per bin, same in every row"
(use the real maximum for the chosen bin size).
Mark every schedule change (each schedule.csv row after the first) with a red
dashed vertical line at that time, wherever it appears in the plot (twice),
labelled "DD from 05-06 23:00". Keep the Days table, bin size and all checks.
Save index.html; tell me what to check, then wait.
The previous plot had one tall axis from 0 to 588 beside all six rows. That suggested a single scale running down the whole plot. In fact every row has its own 0-to-588 bar. The request replaces it with one sentence.
Refresh and choose both files again.
Success: six rows, x axis 0 to 48; the text Bar height: 0 to 588 counts per bin, same in every row; the red dashed DD from 05-06 23:00 line appears twice: row 3 at ZT14 and row 2 at ZT38. The right half of row 6 is empty.
If different: the red line appears only once → send "The schedule change must be marked wherever that time appears: row 3 at ZT14 and row 2 at ZT38." In the recording the plot overhung its white card; Step 13's request tidies that.
12. Read the double plotLink to step
Do
- Look at row 1, right half (ZT 24–48), and row 2, left half (ZT 0–24). They are the same day: 5 May, including the hatched gap.
- Hold the pointer still over the first bar of row 2 for a second. A small tooltip appears.
- Do the same for the bar at ZT 24 in row 1.
- Follow the start of the dark-teal active blocks from row 3 down to row 6.
Success:
- Both tooltips read minutes recorded: 30; sum of counts: 533 (row 1 says ZT 24:00–24:29, row 2 says ZT 00:00–00:29). One bin, drawn twice.
- The gap bins' tooltip says no data.
- From row 3 downward the start of activity moves to the right, one hour per row, as a slanted edge.
- You can say in one sentence why day n+1 is drawn next to day n: so each row shows 48 continuous hours, and a rhythm that crosses the end of a day stays in one piece and can be followed down the page.
If different: no tooltip → your browser may be slow to show it; the numbers come back in the export in Step 14. Say the sentence aloud before you continue. If you cannot, ask your coach: "Explain in three lines why an actogram shows day n and day n+1 on the same row."
13. Mark the activity onsetsLink to step
The app now marks where activity starts each day. The rule is deliberately simple and written down, so you can check it: the threshold is the mean of all recorded bins; an onset is the first bin of a day that reaches the threshold right after a recorded bin below it.
Do: send:
The double plot works. Add a simple activity onset marker per day.
Threshold = mean counts of all recorded bins at the current bin size; show it as
"Onset threshold: 291.72 counts per 30-min bin (mean of recorded bins)".
Onset of a day = start (ZT) of the first bin in that day whose counts are at or
above the threshold AND whose previous bin (in time, may be in the day before) is
recorded and below the threshold. None → "—".
Draw a small black triangle above each onset, in both places that day appears.
Add an "Onset (ZT)" column to the Days table, one decimal.
Expect Day 1 —, Day 2 0.0, Day 3 0.0, Day 4 1.0, Day 5 2.0, Day 6 3.0
for every bin size.
Under the plot, always visible: "Onset marker only. No period estimate."
Layout: the plot now sticks out of its white card on the right; give it its own
full-width card. Put the red "DD from" labels on a white background so they stay
readable over dark bars.
Keep everything else. Save index.html; tell me what to check, then wait.
Refresh, choose both files, scroll to Days.
Success:
| Day | Minutes recorded | Total counts | Onset (ZT) |
|---|---|---|---|
| Day 1 | 1140 | 10957 | — |
| Day 2 | 1260 | 13125 | 0.0 |
| Day 3 | 1440 | 16329 | 0.0 |
| Day 4 | 1440 | 12992 | 1.0 |
| Day 5 | 1440 | 13115 | 2.0 |
| Day 6 | 1440 | 12830 | 3.0 |
Above the plot: Onset threshold: 291.72 counts per 30-min bin. Why is Day 1 "—"? The recording started at ZT5 with the larva already active: the bin before is not recorded, so no switch from low to high was observed. Leaving it blank is honest; guessing ZT5 would be wrong.
Then: choose 60 minutes as bin size. The threshold becomes 583.44, the onsets stay the same. Choose 10 minutes: 97.24, same onsets. Switch back to 30 minutes.
If different: Day 1 shows 5.0 → send "Day 1 must show — : the bin before ZT5 has no recorded minute, so no onset was observed. Fix only that."
Keep: copy the project as actogram-viewer-03-working. Recorded recovery file: checkpoints/09-onsets/index.html.
14. Export the binned tableLink to step
Do: send:
Onsets match: —, 0.0, 0.0, 1.0, 2.0, 3.0. Add an "Export binned CSV" button,
disabled until the plot exists. One row per bin of days 1-6 (also empty bins),
columns in this order: day,date,bin_start,zt_start,zt_end,light,minutes_recorded,counts
bin_start "YYYY-MM-DD HH:MM"; zt_start and zt_end hours with two decimals;
light is "light" or "dark"; counts is EMPTY when minutes_recorded is 0, never 0.
At 30 min expect 288 rows. Filename: actogram-bins-<bin size>min.csv.
Keep everything else. Save index.html; tell me what to check, then wait.
Refresh, choose both files, click Export binned CSV. Open actogram-bins-30min.csv from Downloads in a text editor (a spreadsheet may reformat the dates).
Success: a header and 288 rows (6 days × 48 bins). Find these three lines:
2,2026-05-05,2026-05-05 09:00,0.00,0.50,light,30,533
2,2026-05-05,2026-05-05 12:00,3.00,3.50,light,0,
4,2026-05-07,2026-05-07 10:00,1.00,1.50,dark,30,438
The gap bin ends in a comma: minutes_recorded 0 and an empty count, not 0. Sixteen rows are empty like this: ten before the recording started (ZT0–5 on Day 1) and six in the gap. The Day 4 row is the first bin above the threshold after the lights stayed off: onset ZT 1.0.
If different: gap rows show 0 → send "In the export, counts must be empty when minutes_recorded is 0. Fix only that."
Keep: recorded recovery file checkpoints/10-export/index.html.
15. Make it yoursLink to step
Do: send:
The export has 288 rows and the gap bins are empty.
Change only the visible heading to "My Actogram", and the small line
above it from "Sleep and light data" to "Circadian activity" (the app does not
score sleep). Keep the browser title consistent.
Do not change data, checks, bins, plot, onsets or export.
Save index.html and tell me which lines changed.
OpenCode had put "Sleep and light data" above the heading on its own. Sleep in zebrafish larvae has its own definition (usually one minute or more of inactivity), and this app does not score it, so the label goes.
Success: the heading reads My Actogram, the line above it Circadian activity. OpenCode names three changed lines: browser title, small line, heading. Day 4 still shows onset 1.0.
If different: anything else changed → ask OpenCode to undo that part, or restore index.html from your latest checkpoint.
16. Leave a README and continue in a fresh sessionLink to step
Do: send:
Read index.html, then create README.md with exact instructions for opening and
using this app: the two CSV files and their columns, that times are plain clock
time, one row per minute, how ZT0 is set, how bins and the double plot work, that
missing minutes stay blank (never 0), the onset rule, where data is processed, the
limits (one animal per file, no period estimate, no statistics), and the known checks
at 30 min: 6 rows, gap 2026-05-05 12:00-14:59, onsets —/0.0/0.0/1.0/2.0/3.0.
Record this next task: estimate the free-running period in DD with a periodogram;
the synthetic data were made with 25.0 h. Do not implement it. Do not change
index.html. Tell me which file you created, then wait.
Then click New session (the + beside the session tab). Confirm actogram-viewer is still the project. If the button says New project, click it, select your original actogram-viewer folder and click Select folder. Send:
Read README.md and index.html without editing.
Tell me the app's purpose, how to open it and the recorded next task.
Keep the answer to three bullets.
Success: the new session names the app's purpose, double-clicking index.html, and the periodogram next task, all from your files.
If different: empty project → check the folder. Wrong facts → correct README.md before continuing; it is your memory between sessions.
17. Test two bad files before your own dataLink to step
Real recordings contain surprises. Joining two overlapping exports repeats an hour, and so does a clock that falls back at the end of daylight saving time. And a schedule may contain a condition this app was never built for.
Do
- In the app choose
data/activity-duplicate.csv(opens in a new tab) as activity file anddata/schedule.csvas schedule.
Success: the message names Line 4922 and the repeated time 2026-05-08 02:00; no plot; Export binned CSV is greyed out. The rule from Step 5 caught it.
- Choose
data/activity.csvagain, then choosedata/schedule-ll.csv(opens in a new tab) as schedule. Its second row saysLL: constant light.
The recorded build accepted LL and shaded everything after 05-06 23:00 grey, as if dark. Continue in your fresh session and send:
Before I use my own data I tested data/schedule-ll.csv with activity.csv.
Its second row has condition "LL" (constant light). The app accepted it and
shaded everything after 2026-05-06 23:00 grey, as if dark. Only LD and DD are
supported. For any other condition show a visible error naming the line, e.g.
Schedule file — Line 3: condition "LL" is not supported. Use LD or DD.
Draw no plot and disable export while the error is shown.
Choosing the correct schedule.csv again must bring the plot back.
Change only this. Save index.html; tell me what to check, then wait.
Refresh and choose activity.csv and schedule-ll.csv (opens in a new tab) again.
Success: the message reads Schedule file — Line 3: condition "LL" is not supported. Use LD or DD. No plot is drawn. Choosing data/schedule.csv again brings back six rows and Day 4 onset 1.0.
If different: the plot stays visible beside the error → send "While the schedule error is shown, hide the plot and the Days table. Change only that."
18. Your own data, a colleague, and your next improvementLink to step
Your own data
- Use only data you are allowed to use. Never paste unpublished or personal data into a model without permission. The app itself runs in your browser and sends nothing; OpenCode sees only what you paste into it or ask it to read.
- Make a copy of one recording. Most trackers export many wells side by side: keep the time column and one animal's column, named
time,counts, one row per minute, times asYYYY-MM-DD HH:MM. Write a matchingschedule.csv. Save both as CSV UTF-8. - Choose both files. Pick one bin, add its minutes by hand in the spreadsheet, and compare with the tooltip or the export.
Success: your hand sum matches, every gap you know of is hatched, and the shading matches your light log.
If different: your tracker writes seconds, other column names or NA for dropped minutes → the app refuses the file with a named line. Do not edit values by guesswork. Tell OpenCode the real format, using a made-up example row, and ask for that one adaptation.
A colleague: give a colleague index.html, README.md and the data folder. Ask them to follow README.md alone and tell you the Day 5 onset, and why row 4 shows day 5 on its right half. Success: they report 2.0 and explain the double plot. If they stop, add the missing sentence to README.md.
Your next improvement: save a working checkpoint. The recorded next task is a periodogram: a method that tests many candidate periods and reports which one best fits the rhythm in DD. Write your request with this pattern:
Add [one behaviour] so [my user] can [purpose].
Keep [working features].
I will know it works when [visible result].
Tell me which part will change, implement only this improvement,
then wait for me to try it.
For the periodogram: on days 4–6 of the practice file it must report a period close to 25 h, the value the synthetic data were made with. Afterwards recheck the onsets —, 0.0, 0.0, 1.0, 2.0, 3.0.
If stuck: paste this into your coach chat:
I am on step [number].
I did: [exact action].
I expected: [result from the manual].
I see: [actual text/result, or describe a screenshot].
Give me one next action. Wait for my result.
What this app does not do: it estimates no period and runs no statistics; it does not score sleep; it handles one animal per file; the onset rule is a simple teaching threshold, not a validated detector, and noisy real data can move it; a bin with only some minutes recorded is drawn from those minutes alone (check minutes_recorded in the export); it supports only LD and DD schedules. It is a teaching viewer, not a validated analysis tool.
The method behind these steps
Structure it: two input files, one minute per row, days cut at lights on, and a visible rule for every gap and every bad line. Understand it: add up a bin, read a day twice in the double plot, check an onset before trusting the screen. Choose tools: one offline HTML file, OpenCode as the builder, your own eyes and a text editor as the judge. Build it: one request, one check, one checkpoint at a time, with corrections phrased as observations. Read T01-L01 · From Idea to Working Result: The Four-Quadrant Method.













