- Group messages - three paste-ready WhatsApp messages for members, every command with a plain-words prompt.
- Owner (WhatsApp) - what only you can do.
- Terminal (on the Mac) - deploy, schedules, indexer, WhatsApp health.
Times the bot shows are IST. Schedule times in Part 3 are the Mac's local time (Singapore). Every way to run these (iPhone over SSH, Mac, GUI, CLI) is in Guide 15. The class schedule setup is in Guide 16.
Part 1 - Group messages
Paste each block as its own WhatsApp message (they are written in WhatsApp formatting).
Pin the first one. The footer with the builder's name is added by the bot's own /help, so it is not repeated here.
Message 1 of 3 - what's due, and finding things
*🤖 TS-03 Tracker Bot — full guide (1/3)*
Start a message with *@bot* or a */command*. Every command also works in plain words, so use whichever is easier.
📅 *What's due*
• /today → due today
_or ask:_ @bot what's due today?
• /tomorrow → due tomorrow
_or ask:_ @bot anything due tomorrow?
• /week → next 7 days
_or ask:_ @bot what's due this week?
• /month → next 30 days
_or ask:_ @bot what's coming up this month?
• /next → the very next deadline
_or ask:_ @bot what's my next deadline?
• /urgent → due within 3 days, most urgent first
_or ask:_ @bot what's urgent right now?
• /overdue → past due and not done yet
_or ask:_ @bot is anything overdue?
• /brief → overdue + today + this week
_or ask:_ @bot give me a quick brief
🔎 *Find*
• /sub GPU Programming → everything for one subject
_or ask:_ @bot show me everything for GPU Programming
• /prof Advanced AI → who teaches it + what's due
_or ask:_ @bot who teaches Advanced AI?
• /subjects → all subjects and professors
_or ask:_ @bot list all subjects with their professors
• /find patent → search titles and notes
_or ask:_ @bot find anything about patent
• /all → every item in the tracker
_or ask:_ @bot show the whole tracker
Message 2 of 3 - plan, prep, layouts, plain-words questions
*🤖 TS-03 Tracker Bot — full guide (2/3)*
🧠 *Plan*
• /plan → 7-day study plan
_or ask:_ @bot make me a study plan for this week
• /load → which weeks are busy
_or ask:_ @bot which week is the busiest?
• /points → highest weightage first
_or ask:_ @bot which items carry the most points?
• /tbd → items with missing info (TBD or blank)
_or ask:_ @bot which items have missing details?
• /remind → a ready-to-forward reminder
_or ask:_ @bot write a reminder I can forward to the group
📚 *Prep for a topic*
• /prep CUDA → basics, core ideas, in-depth, pitfalls, links
• /prep GPU warp divergence
• /prep patents vs copyright
_or ask:_ @bot prepare me on memory coalescing
_or ask:_ @bot explain me intellectual property rights from scratch
GPU and IP Management answers use our course slides and books and name the file they came from. Other subjects get a general guide.
It explains concepts. It will not solve a quiz, exam or assignment question, even if you paste it.
🗓️ *Class schedule*
• /nlp → next NLU / NLP lectures, holidays and exams
• /cv → the Computer Vision part
• /nlp when is the minor exam
_or ask:_ @bot when is the next CV lecture?
_or ask:_ @bot who teaches NLU?
The sheet has no per-lecture topic list. Dates are IST.
🎨 *Layouts* (add at the end)
table · json · yaml
• /week table
• /overdue json
• @bot what's due this month as yaml
• /prep CUDA table (prep supports table and json)
Also works: "in json format", "as a table", "--yaml".
💬 *Or just ask, in any language*
• @bot any GPU Programming quiz coming up?
• @bot what's due before Friday?
• @bot IP ka assignment kaise karna hai?
• /ask <question> → same as @bot <question>
Hinglish in, Hinglish out. Ask in French and it answers in French. "How do I do X" questions get the requirements and steps from the notes, never the finished work.
Message 3 of 3 - about, limits, fair use
*ℹ️ TS-03 Tracker Bot — about & fair use (3/3)*
• /help → the guide (also /menu /start /commands)
• /about → who built me
_or ask:_ @bot who built you?
• /capabilities → what I can and can't change
_or ask:_ @bot can you edit the sheet?
• /whoami → shows your chat id (handy if I seem to ignore you)
Same thing, other names: /builder = /about · /permissions or /dml = /capabilities · /professors = /prof
⚙️ *How to reach me*
Start with @bot or a /command, or tag the bot account. I answer in this group only.
⏱️ *Limits*
• Anything that asks the AI (list commands like /week, and plain questions): 6 per person per hour, 150 per day for the whole group
• /prep: 20 per day for the whole group
• Class schedule questions (/nlp, /cv) count like any other question
• Two messages from you within 10 seconds: the second is ignored, so wait a moment between questions
• /help /about /capabilities /subjects /prof are instant and don't count
📌 *Good to know*
• Answers come from a saved snapshot of the tracker. The footer shows how old it is. Always verify on Google Classroom.
• Class schedule answers come from the course schedule sheet and show how old that copy is.
• Times are IST.
• Members are read-only: I can't change anything in the sheet.
Part 2 - Owner (WhatsApp)
You get everything in Part 1 with no hourly limit. Your slash commands (/week, /sub, /find...) read the live sheet; your plain-words questions use the same snapshot as members.
| Command | What it does | Example |
|---|---|---|
/add <details> |
add an item | /add GPU Quiz-02 on 11-Oct-2026 at 18:00 IST, 10 MCQs |
/done <item> |
mark done | /done Ethics assignment |
/submit <item> |
mark submitted | /submit GPU assignment |
/move <change> |
change a date or time | /move GPU Quiz to 12-Oct-2026 19:00 IST |
/note <item>: <text> |
add a note | /note Innovation assignment: group of 4 finalised |
/check |
audit the sheet, report only | /check |
/refresh |
refresh the snapshot members see | /refresh |
/ask <question> |
free question. For you it reads the live sheet (read only). Members can use /ask too, answered from the snapshot |
/ask which items have no due time? |
/html <name> |
styled report link; <name> is week, brief, today, tomorrow, urgent, month, overdue or all |
/html week (also /week html) |
/stats |
member questions today, people who asked this hour | /stats |
/health |
is the Sheets connection up | /health |
/whoami |
chat id and sender id | /whoami |
Writes are insert and update only. Deleting is always blocked. /prep works for you too, but its daily cap of 20 is shared with the group.
The schedule commands (/nlp, /cv, /nlu, /schedule NLP …) work for you with no hourly limit. Setup is in Guide 16. The optional Jev router (Guide 17) only routes free-text messages. It never decides a command or a write.
The bot posts the deadline brief to the group at 08:00 and 22:00 Singapore time (05:30 and 19:30 IST), scheduled by a Kubernetes CronJob (see Part 3).
Part 3 - Terminal (on the Mac)
Deploy and check
# after editing scripts/ts03-bot (do NOT pass --digest: the CronJob owns the digest now)
./scripts/install-bot.sh whatsapp
# restart without deploying
launchctl kickstart -k gui/$(id -u)/com.ts03.bot.whatsapp
# safety check after every change, must end with the green tick
scripts/ts03-bot selftest
# logs
tail -f ~/Library/Logs/ts03-bot.log
launchctl list | grep ts03
The twice-daily brief (Kubernetes CronJob, namespace waha)
kubectl get cronjob ts03-digest -n waha # schedule 0 8,22 * * *, Asia/Singapore
kubectl get jobs -n waha # one Job per run
grep "digest" ~/Library/Logs/ts03-bot.log | tail # "triggered by scheduler" then "sent" or "FAILED"
# connectivity test, posts nothing
kubectl delete job ts03-ping-test -n waha --ignore-not-found
kubectl apply -f k8s/digest-ping-test.yaml
kubectl logs job/ts03-ping-test -n waha # expect HTTP 200
# fire the brief now (posts to the group!)
kubectl create job --from=cronjob/ts03-digest ts03-digest-manual -n waha
# pause or resume
kubectl patch cronjob ts03-digest -n waha -p '{"spec":{"suspend":true}}'
kubectl patch cronjob ts03-digest -n waha -p '{"spec":{"suspend":false}}'
To go back to launchd instead: kubectl delete cronjob ts03-digest -n waha then ./scripts/install-bot.sh whatsapp --digest 08:00,22:00.
Study material
./scripts/ts03-material-index # every folder in ~/.config/ts03-subject-routes.json
./scripts/ts03-material-index GPU # one folder
cat ~/Library/Logs/ts03-material-index.log
ls -A | grep '^\.tmp_' # should print nothing
python3 -m json.tool ~/.cache/ts03-material/GPU.json | head
The indexer re-runs daily at 05:00 (com.ts03.material-index). It keeps the previous cache if a run returns nothing.
Class schedules (course sheet)
./scripts/ts03-schedule-index NLP --dry-run # fetch and parse, write nothing
./scripts/ts03-schedule-index NLP # refresh the cache now
./scripts/ts03-schedule-index --show NLP # what the bot has cached: lectures, parts, links
./scripts/ts03-schedule-index NLP --cell H22 # one raw cell as Google returns it (smart chips)
cat ~/Library/Logs/ts03-schedule-index.log
launchctl start com.ts03.schedule-index # run the refresh job now (also works over SSH)
nano ~/.config/ts03-schedules.json # subjects, aliases, parts and instructors, no restart needed
The job refreshes every 6 hours (com.ts03.schedule-index). The bot reads the config and the cache on every message. Setup, areas and instructors are in Guide 16.
Jev router
scripts/ts03-bot router-selftest # one live call, finds the working request style
scripts/ts03-bot router-ask NLU assignment due # probabilities and the decision for one message
scripts/ts03-bot router-eval --limit 40 # replay logged messages: same, DIFF or ASK
scripts/ts03-bot router-status # decisions logged, agreement with the rules, failures
nano ~/.config/ts03-router.json # "mode": "off", "shadow" or "on"; read on every message, no restart
Off by default. Setup and the decision rules are in Guide 17.
Docs index
./scripts/ts03-docs-index # rewrite docs/INDEX.md after editing any doc, then commit it
./scripts/ts03-docs-index --check # exit 1 if it is out of date
WhatsApp (WAHA) health
kubectl get pods -n waha
SECRET=$(kubectl get secret waha-secrets -n waha -o jsonpath='{.data.WAHA_API_KEY}' | base64 -d)
curl -s http://localhost:3100/api/sessions/default -H "X-Api-Key: $SECRET" | head -c 200 # "status":"WORKING"
When something is wrong
| Symptom | Check |
|---|---|
| Bot silent | session status above should say WORKING. If WAHA shows a QR, run kubectl rollout restart deployment/waha -n waha, then kubectl logs -n waha deploy/waha -f and scan it |
| Replies never arrive | kubectl logs -n waha deploy/waha --since=10m \| grep -c ENOTFOUND should be 0 |
| Brief didn't post | kubectl get jobs -n waha, then the bot log lines above |
| Brief went to your DM only | grep DIGEST_CHAT ~/.config/ts03-bot.env should be the group id |
/prep ignores the Drive material |
the cache file above should list files |
| "I don't know /x" | /help lists what exists |
gh: bad CPU type in executable |
brew install gh, or publish the release from the browser |
Questions or corrections: [email protected]