morning or evening). One day has at most one entry per type.
The journal read links each day to what the student actually did on it. The API derives that
activity from the planner and the journey on every read. It
never stores a second copy, so a corrected study block corrects the journal too.
The entry
Every field of an entry is optional — each step of the flow is skippable:mood— “Bugün nasıl geçti?”, 1 (worst) to 5 (best).feelings— “Bugün nasıl hissettin?”, the chips. Keys are English (proud,calm); each key has a Turkish label (Gururlu,Sakin). On write, the API accepts the key or the label. An unknown feeling is a 400.summary— the free-text summary, with up to 5 photos.ready— the closing yes/no. Evening: “Yatmaya hazır hissediyor musun?”. Morning: “Güne hazır hissediyor musun?”. “Atla ve kaydet” is a body withoutready, and it reads back asnull.
Save an entry
PUT /api/checkins/:date/:type creates or replaces the entry. There is no create-then-patch
dance: submit the whole flow at the end, and resubmit the same way after an edit. Fields left out
of the body read back as unanswered.
POST /api/media first (see Media), then
send the ids in mediaIds. Media that is not ready is dropped, the chat rule.
DELETE /api/checkins/:date/:type removes the entry. GET /api/checkins/:date/:type reads one
entry, and answers 404 when the day has no entry of that type.
The home screen
GET /api/checkins/today returns everything the home screen opens on:
dayNumber counts from sign-up, first day inclusive — “Gün 44”. week is the checkbox strip:
the last seven days ending today, where done means the day has any completed entry. next is
the first routine still open today, null once both are done.
The agenda times are the expected times of each routine. They are advisory — an entry saved at
any hour still lands on its day and type.
streak.current counts consecutive check-in days. A streak that last touched yesterday is still
alive; it reads 0 once a day has been missed. This streak is check-in-specific. The journey’s
streak is wider — it counts any meaningful activity — and a saved check-in counts toward it too.
The journal
GET /api/checkins?from=2026-08-01&to=2026-08-31 reads a date range. The response carries every
date in the range, empty days included, so the journal renders straight off it:
activity is what the day actually held: completed planner minutes and blocks, and denemeler
taken that day. The API computes it on every read from the planner and the journey.
The default window is the last seven days ending today. The range is capped at 62 days — read a
month at a time. There is no cursor, because a date range is already a bounded read. Both dates
are local Istanbul dates, the planner convention.
Provenance
Each entry carriessource and createdBy. Entries from the guided flow are
source: "manual", createdBy: "student". The values call and chat are reserved for
entries that Lala fills from a conversation — the “LALA’yı ara” path of the design.