Back to skills
SKILL.md
Manage
ASecurityManage an installed Parent Recap: check how it's running, troubleshoot "no Brief arrived / summary failed / calendar not written / WhatsApp group missing", change Kid details, move up a grade, switch groups, connect a Source skipped in setup (MyClub, Wilma), add recipients, change someone's language, turn Weekend Picks on or off, turn a WhatsApp group's digest (a few lines on its other talk) on or off, turn pilot feedback (⭐ / ❌ links) on or off, turn the AI filter (placeholders for other peo...
- 4 stars
- 0 votes
- 0 copies
- 1 view
- Added October 9, 2026
Works with
Security analysis
100/100npx -y skills add kinlace/parent-recap --skill manage --agent claude-codeAre you the author of Manage?
Add the live security badge to your README. It updates with every re-scan.
[](https://www.skillsdirectory.com/skills/kinlace-manage)---
name: manage
description: Manage an installed Parent Recap: check how it's running, troubleshoot "no Brief arrived / summary failed / calendar not written / WhatsApp group missing", change Kid details, move up a grade, switch groups, connect a Source skipped in setup (MyClub, Wilma), add recipients, change someone's language, turn Weekend Picks on or off, turn a WhatsApp group's digest (a few lines on its other talk) on or off, turn pilot feedback (⭐ / ❌ links) on or off, turn the AI filter (placeholders for other people's names, phone numbers, email addresses and links, and sensitive messages held back) off or on, re-authorize Gmail / Claude / Codex / Google Calendar / Wilma, enter a new Gateway Key, switch between Claude, ChatGPT and Parent Recap's gateway, send the Brief from their own Gmail or from Parent Recap's address again, upgrade to a new version or uninstall ("uninstall Parent Recap", 「卸载 Parent Recap」). Use when the user mentions Parent Recap, FamilyBrief, Family Brief or 家庭日报 having a problem or needing a settings change, or repeats a line from their Brief such as "Parent Recap can't read WhatsApp", "FamilyBrief can't read WhatsApp", "check Parent Recap", "check FamilyBrief", 「Parent Recap 读不了 WhatsApp」, 「检查 FamilyBrief」 or "tarkista Parent Recap".
---
# Parent Recap management
**Reply in the language the user writes in**, not the language of this skill: English if they write English, Chinese if they write Chinese, and switch if they switch. That never changes the language their Brief comes in; only an explicit request does (see "Change someone's language" below). In Chinese, call the Brief 日报 and Weekend Picks 周末活动推荐; in Finnish, kooste and viikonlopun vinkit; in English or any other language, say Brief and Weekend Picks. Commands, config keys and file paths stay as written.
`FB=~/ParentRecap/app/.venv/bin/parent-recap`, `PY=~/ParentRecap/app/.venv/bin/python`. **PLUGIN** is the plugin root folder, two levels above this skill's folder (it contains `install.sh`); if unsure, run `ls -d ~/.claude/plugins/cache/*/parent-recap/*/ | sort -V | tail -1`; for an install from the release zip, with the install line (`get.sh`) or with `get.sh --codex`, `~/ParentRecap/plugin` is also the plugin root.
If `~/.family/config.yaml` doesn't exist, Parent Recap hasn't been set up yet: use `/parent-recap:setup` instead, unless the user wants to uninstall (see "Uninstall" below), which also cleans up a setup that never got that far.
## Rules (same as setup)
- Secrets (passwords, App Passwords, tokens, Gateway Keys, MyClub calendar links) never go in the chat: the `$FB setup` commands below ask for each in a macOS dialog, check it and store it, and never print it. In Codex, run them outside the sandbox (Codex asks for approval)
- The config holds the MyClub links: don't open or print the whole file. View it with `grep -vE 'myclub_ical_url|myclub\.fi/' ~/.family/config.yaml`, which leaves out a Kid's several links too, and make changes with commands that don't print the file
- Don't print mail or chat text: diagnose with `$FB doctor` and the last few lines of the logs; don't run `$FB collect`
- Back up before changing the config: `cp ~/.family/config.yaml ~/.family/config.yaml.bak-$(date +%Y%m%d%H%M)`
- Commands that need `sudo`: only show them, and let the user run them
- Never search the family's folders or read their files to find something (a file they were sent, a password, a link): not with `find`, `ls` or `grep`, and not by opening a file to see what's inside. Ask the user where it is, or offer the alternative that needs nothing (such as staying with the `.ics` attachment). Parent Recap's own files and the checks in this skill (the plugin folder, `~/.family`, the logs) are fine
## When the user repeats a line from the Brief
When a Source can't be read, the Brief tells the user what to say to you. Briefs sent before the rename say Parent Recap, newer ones Parent Recap: treat both names the same way, in every language.
| The user says (any of these forms) | What it means and what to do |
| -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| "Parent Recap can't read <Source>", "Parent Recap can't read <Source>", 「Parent Recap 读不了 <Source>」, 「Parent Recap 读不了 <Source>」, "Parent Recap ei pysty lukemaan lähdettä <Source>", "Parent Recap ei pysty lukemaan lähdettä <Source>" | The scheduled job was denied permission to read that Source. Run `$FB doctor` and do what that Source's line says |
| "check Parent Recap", "check Parent Recap", 「检查 Parent Recap」, 「检查 Parent Recap」, "tarkista Parent Recap", "tarkista Parent Recap" | A Source failed for some other reason, such as no network or a timeout. Go through "Check the status first" below and the last lines of `~/ParentRecap/logs/run-stderr.log` |
| "re-authorize <Source>", 「重新授权 <Source>」, "valtuuta <Source> uudelleen" | That Source's sign-in stopped working: re-authorize it as in "Common tasks" below (Gmail sign-in, Google Calendar authorization or Wilma) |
## Check the status first
```bash
$FB doctor
$FB schedule status
```
`doctor` shows ✅ / ⚠️ / ❌ for each item, with what to do.
For symptoms and fixes, look up the symptom in the table in `PLUGIN/docs/troubleshooting.md`.
## Common tasks
| What the user wants | How |
| ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| Move up a grade / change class | Follow "New school year" in `PLUGIN/docs/config.md`: change grade and class_name |
| Add or change a Kid's MyClub calendar | Run `$FB setup myclub --kid "<Kid's name>"` (the name as under `kids:`). It opens MyClub and a macOS dialog: the user copies the Kid's calendar subscription link ("MyClub" in `PLUGIN/docs/sources.md`) and pastes it there; the command downloads it once and saves it in place of the Kid's links. A Kid in several clubs has a link from each club: for another club's, add `--another`, which keeps the links they have. Don't let the user paste the link in the chat, and don't write it into the config yourself |
| Mail from a school or club isn't in the Brief | Find its sender domain with `$FB discover gmail-senders` and add it to `gmail.allowlist_domains` |
| Add or remove a recipient | Change `email.to` (Brief) or `email.weekend_to` (Weekend Picks). Ask a new person's language: a plain address reads `summary_language`, anyone else is `{address: ..., language: <code>}` ("Recipients in their own language" in `PLUGIN/docs/config.md`), then run `$FB language <code>` for it. If the change moves who is first in `email.to`, say that the Brief is then written in the new first Recipient's language, and Google Calendar events and the archive follow it. The `$FB doctor` run after the change binds a new address to the Gateway Key, and the server emails it a link to confirm: tell the user the new person opens it (it may be in Junk) and presses Confirm, or gets no Brief |
| Change someone's language ("from now on send my Brief in English") | Only on an explicit request (see the top of this file). If more than one parent uses this Mac, confirm whose address "my" is. Set that entry in `email.to` (and `email.weekend_to`, if they're there) to `{address: ..., language: <code>}`, or back to a plain address if the new language is `summary_language`, then run `$FB language <code>`. If it's the first entry in `email.to`, say that the Brief is then written in that language, and Google Calendar events and the archive follow it |
| Change the Brief time | Change `schedule.daily_hour` / `daily_minute`, run `$FB schedule install` (macOS asks for the Mac password to move the wake-up). It warns that the old wake schedule would be replaced: say it's the one for the old time and, once the user agrees, run `$FB schedule install --replace-wake`. Give the user the `sudo pmset` command if it prints one |
| Turn Weekend Picks on or off | Setup doesn't ask about them, so they start off. Weekend Picks only cover Helsinki, Espoo and Vantaa, and Kauniainen families get them too: before turning them on, ask which city the Household lives in, and if it has no Weekend Picks regions in "City presets" in `PLUGIN/docs/config.md`, say why they'd get nothing near them. Ask what each Kid likes and what the parents want them to try, write it into `weekend_events.kid_preferences` and `parent_preferences`, set `regions` to that city's regions and `enabled: true`. They go to the Brief's Recipients, each in their language, unless the user names other addresses for `email.weekend_to`. Then run `$FB schedule install`, and `$FB weekend-events --dry-run` once to show a preview. To turn them off, set `enabled: false` and run `$FB schedule install` |
| Turn on pilot feedback (⭐ / ❌ links) | Pilot families only. First tell the user every point the parents must know from the "Pilot feedback" section of `PLUGIN/docs/config.md`, and change the config only once they agree. Then run `$FB setup save <<< '{"feedback": {"enabled": true}}'`: it writes the rest from the pilot form the program ships, with a `household_label` it makes itself (the team only sees a pseudonym made from it). If it says this version has no pilot form, pilot feedback isn't available yet |
| Turn off pilot feedback | Set `feedback.enabled` to `false` |
| Turn the AI filter off or on ("send my messages to the AI as they are") | First tell the user what it does, from "What the AI sees" in `PLUGIN/docs/config.md`: while it's on, the AI gets the Kids as Kid A, Kid B and placeholders in place of other people's names, phone numbers, email addresses and links, never the Gmail message links or the Wilma student number, and the Brief still shows the real ones. Messages that look sensitive (health, special support, bullying, child welfare) never reach the AI, unless they were sent to everyone, such as Wilma announcements, and the Brief lists them to read where they came from. Turned off, the AI gets the messages as they are, sensitive ones included. To show what it catches in their own messages, run `$FB ai-filter-report` (see the next row). Change the config only once they agree: set `ai_filter.enabled` to `false`, or back to `true` to turn it on. If they want only the Kids' names to reach the AI, set `ai_filter.mask_kids` to `false` instead. It takes effect from the next Brief |
| Check what the AI filter catches ("does the filter work?", "how many names does it hide?", "which messages does it hold back?") | Run `$FB ai-filter-report`. It reads the archive on the Mac and runs the evening Brief's filter on each evening's messages. It prints counts only: messages held back by category, the names, phone numbers, email addresses and links that become placeholders, and an estimate of names it likely missed. It prints no message text, names or links and makes no network call, so show its output to the user as it is. With the AI filter off, it says what the filter would do. With no archive yet, it says so: the evening Brief adds one evening at a time. To see which messages it holds back, run `$FB ai-filter-report --held-back` yourself. After the same counts, it writes each held-back message with its date, Source, category, the word that matched, sender, subject or chat, and the text around the word to `held-back-list.txt` in the archive folder, opens that file in TextEdit on the Mac, and prints only how many it listed and the file's path. Tell the user the list is open in TextEdit, so they can see which words hold back routine notices, such as a teacher's message to every guardian in the class about a talk on bullying. The file holds the messages' own text: never read, print, search or copy it, and don't ask them to paste it into the chat. If the output says TextEdit couldn't be opened, give them the file's path to open on the Mac themselves |
| Switch from ics attachments to writing Google Calendar automatically | Follow "Switch to Google Calendar" below |
| Google Calendar authorization expired | Run `$PY ~/ParentRecap/app/scripts/setup_google_calendar.py` again in Terminal. New events from while it was expired are already attached to the Brief as .ics, and re-authorizing won't write them twice. If it expires every 7 days with their own app, the app is still in "Testing": publish it following step 4 of "Creating your own Google app" in `sources.md` |
| Gmail sign-in fails | Run `$FB setup gmail`. Before it, tell the user what setup tells them ("Gmail" in `PLUGIN/skills/setup/SKILL.md`): they never give their Google password, they create a new App Password named Parent Recap on the page it opens, and paste the 16 letters into the dialog. It tests the sign-in and replaces the old one in the Keychain |
| Claude summary fails (Credit / 403) | Run `$FB setup claude`: the user clicks Authorize on Claude's page, copies the token the Terminal window shows into the dialog, then presses Enter in that window. It makes a test call before storing it |
| Codex summary fails (Codex is ❌ in doctor) | The user signs in to Codex again with their ChatGPT account: in the Codex or ChatGPT app, or with `codex login` for a `~/.local/bin/codex` the setup page installed; then runs `$FB doctor` |
| Gateway summary fails, or a new Gateway Key (AI gateway or Gateway Key is ❌ or ⚠️ in doctor) | ⚠️ "used up today's budget": nothing to do, the key works again tomorrow. ❌ "doesn't know this Gateway Key": it was mistyped, or the maintainers turned it off. Once the user has the key from the maintainers, run `$FB setup gateway`: they paste it into the dialog, and it makes a test call before replacing the stored one. ❌ "no answer": check the Mac is online, then run `$FB doctor` again |
| Brief sending is ❌ or ⚠️ in doctor ("not confirmed yet" or "no Gateway Key"), or no Brief arrived after an update | Unless they send it from their own Gmail (next row), every Brief is sent from Parent Recap's own address with a Gateway Key (ADR 0032). With Claude or ChatGPT as the AI, `doctor` gets a key for sending by itself and the server emails each Recipient a link to confirm (ADR 0033); the Brief goes only to addresses that confirmed. "not confirmed yet": each address it names opens the email from `brief@parentrecap.com` (it may be in Junk), opens the link and presses Confirm; `$FB setup confirm --resend` sends it again, `$FB setup confirm` says who has. "no Gateway Key … couldn't make one": run `$FB setup confirm` again later. With the gateway as the AI, or if the team sent a key, run `$FB setup gateway`: they paste it into the dialog, and with Claude or ChatGPT as the AI it is tested for sending only, without sending anything. Then run `$FB doctor`. The Brief that didn't go out comes the next evening |
| Send the Brief from their own Gmail, or from Parent Recap's address again ("don't send my Brief through your server", 「从我的 Gmail 发日报」, "Lähetä kooste omasta Gmailistani") | An advanced setting, only on the user's request (ADR 0034). Offered only with Claude or ChatGPT as the AI and Gmail connected with an App Password (`gmail.username`); with the gateway as the AI, say it isn't offered, since the messages already go through the gateway to be written. First tell the user what changes, from "Delivering" in `PLUGIN/SECURITY.md`: the Brief, the first Brief and Weekend Picks come from their own Gmail address and stay in its Sent folder, nothing passes through Parent Recap's server, replies reach them, nobody confirms anything, and if Google stops accepting the App Password both reading Gmail and sending the Brief stop. Once they agree, run `$FB setup sending gmail`: it checks that Gmail takes the App Password, sending nothing, before switching. `rejected` or `no-password`: run `$FB setup gmail` first, then again. To go back, run `$FB setup sending gateway`; when its `next` says someone hasn't confirmed, follow the row above. Then run `$FB doctor`: Brief sending says which way the Brief goes, and with Gmail a ❌ there is about the App Password (`$FB setup gmail`) |
| Switch between Claude, ChatGPT and Parent Recap's gateway | The gateway is only for invited Households with a Gateway Key from the maintainers. Before switching to it, tell the user what "Parent Recap's gateway" in `PLUGIN/docs/sources.md` says passes through it, and go on only once they agree. Authorize the new AI following the "AI login" section of `PLUGIN/docs/sources.md` (for the gateway, `$FB setup gateway`), then change `llm.backend` (`claude`, `codex` or `gateway`) and run `$FB doctor`. Switching away from the gateway stops its model calls from the next Brief on; the Gateway Key stays in the Keychain, since it still sends the Brief, so switching back needs no new key |
| Wilma not signed in | Run `$FB setup wilma --timeout 540 --language <summary_language>`: the user signs in again in the Terminal window it opens |
| Test the scheduled job itself | `$FB schedule run-now` (`--weekend` for Weekend Picks); see "Testing the scheduled job" in `PLUGIN/docs/troubleshooting.md`. It really sends the Brief |
| Send one Brief by hand | `$FB bg run --lookback-hours 48` (really sends email). Add `--dry-run` to only preview. Allow it 15 minutes (or run it in the background); don't retry while it's going |
| Upgrade to a new plugin version | Follow the "Upgrading" section of `troubleshooting.md` |
| Connect a Source skipped in setup ("add MyClub", "add Wilma") | Follow that Source's sub-flow under "2. Connect" in `PLUGIN/skills/setup/SKILL.md`: say why it's needed, run its `$FB setup` command, act on its result. Then add what it found to the config, as in "4. Check" there: for Wilma, `wilma.enabled: true`, and any Kid it lists that isn't in the config yet. Run `$FB doctor`, and if they want to see it working, `$FB bg run --dry-run --lookback-hours 72` |
| Add WhatsApp ("add WhatsApp") | WhatsApp is read as a Linked Device, paired on the setup page: run `$FB setup page`, choose the way back to Connect on Finish, open WhatsApp from the list and scan the QR code in WhatsApp on the phone (Settings (on an iPhone: You) → Linked devices → Link a device). The groups are then picked on Check |
| Pair WhatsApp again ("pair WhatsApp again", 「重新关联 WhatsApp」, "linkitä WhatsApp uudelleen"; WhatsApp is ❌ "needs a new pairing" in doctor) | WhatsApp ended the link, or the groups were picked before WhatsApp was read as a Linked Device. Run `$FB setup page`: it opens at the WhatsApp step with a QR code, which the user scans in WhatsApp on the phone (Settings (on an iPhone: You) → Linked devices → Link a device). The picked groups stay picked: the page names them, with "Change the groups" to pick them again on Check, and "Continue" back to where it was. Run `$FB doctor` afterwards: its WhatsApp line names the picked groups |
| Change the WhatsApp groups read ("which WhatsApp groups are read", "change WhatsApp groups") | Run `$FB setup page`; Finish lists the picked groups by name, and "Change the groups" takes the user to Check to pick them again, then on through the first Brief to Finish |
| Turn a WhatsApp group's digest on or off ("summarize what the class group talks about", 「总结一下群里在聊什么」, "tiivistä ryhmän keskustelu") | Off for every group by default. With it on, the Brief also sums up in a few lines what that group talked about beyond the Kids' items, in the Brief's language: no message-by-message translation, nothing repeated from the Kids' items, no other parent or child named, and nothing for a group with no messages; it goes through the AI filter like everything else ("WhatsApp group digests" in `PLUGIN/docs/config.md`). Ask which group, find it in `whatsapp.chats` (by name, as `$FB doctor` lists them), and set `digest: true` on it, or remove `digest` to turn it off. Leave the group's other fields as they are. It takes effect from the next Brief. Or run `$FB setup page`; "Change the groups" on Finish leads to Check, where the option sits under each ticked group |
| Turn WhatsApp off ("turn WhatsApp off", 「关闭 WhatsApp」, "poista WhatsApp käytöstä") | Run `$FB setup page`; on Finish the user clicks "Turn WhatsApp off". It removes the always-running job, the pairing and the messages kept, keeping the picked groups for later. Tell them to remove "Parent Recap" under Settings (on an iPhone: You) → Linked devices in WhatsApp on the phone if it's still listed |
| Uninstall ("uninstall Parent Recap", 「卸载 Parent Recap」, "poista Parent Recap") | Follow "Uninstall" below |
After changing the config, run `$FB doctor` once and confirm there's no ❌.
## Switch to Google Calendar
Setup always starts with the `.ics` attachment; this is how a family turns Google Calendar on. It needs a Google app file (the JSON of a Desktop OAuth client), which the plugin doesn't include: pilot families get it from the Parent Recap team, and everyone else creates their own by following "Creating your own Google app" in `PLUGIN/docs/sources.md`.
1. If `~/.family/calendar_credentials.json` is missing, ask the user where the file is, for example `~/Downloads/xxx.json` (dragging the file onto a Terminal window types its path there, to copy). Ask only for the path: the file contains a secret, so the user doesn't paste its contents and you don't open it. If they don't have it, they stay with ics until they do.
2. Copy it with the command in step 1 of google mode under "Calendar" in `sources.md`, with their path, in quotes, in place of `downloaded-file.json`.
3. Set `google_calendar.mode: google`. The partner's Gmail can go in `google_calendar.invite_attendees`.
4. Run `bash "PLUGIN/install.sh"` (in Codex, outside the sandbox). With the config in google mode, it installs Google's packages, which only Google Calendar needs and a default install leaves out. If it stops with "couldn't install its Python packages", do what it says and don't go on to step 5.
5. Have the user run `$PY ~/ParentRecap/app/scripts/setup_google_calendar.py` in Terminal. When the browser says "Google hasn't verified this app", they click Advanced → Go to (app name) → Allow. Then run `$FB doctor` to check the authorization.
## Uninstall
For a family that stops using Parent Recap, or a maintainer who wants to run setup again on the same Mac. In Codex, run these commands outside the sandbox (Codex asks for approval).
1. Run `$FB uninstall`. It removes nothing yet: it lists everything setup created on this Mac. If `$FB` doesn't exist, the program is already gone; follow the "Uninstalling" section of `PLUGIN/docs/troubleshooting.md` instead.
2. If it ends with ❌ Stopped, it found something in Parent Recap's places that isn't this install's, such as an older install's scheduled job. Tell the user what it says, in their language, and stop there. Don't remove anything by hand.
3. Otherwise show the user the list in their language. Ask with AskUserQuestion whether to keep the archive of past Briefs (keep first), then whether to remove everything listed. Say first that macOS may ask them to allow deleting each Keychain item, and asks for their Mac password to cancel the wake schedule.
4. Only once they confirm, run `$FB uninstall --confirm --keep-archive`, or `--remove-archive` if they chose to remove it. For any ❌ line, help them do what it says, then run `$FB uninstall` again.
5. Tell them every point under "What uninstall leaves to you" in its output, in their language. When it says to remove the plugin in Claude Code (setup didn't install it), that last step is theirs: they type `/plugin uninstall parent-recap@kinlace` and `/plugin marketplace remove kinlace`.
## Check the version
```bash
cat ~/ParentRecap/app/VERSION; grep '"version"' "PLUGIN/.claude-plugin/plugin.json"
```
If the two version numbers differ, the plugin has been updated but the program hasn't caught up. Run `install.sh` again as described in "Upgrading".
Attribution
Related skills
View all in ai-agents →Comments
Loading comments…
Newsletter
Get the weekly list of safe new skills, and the ones we pulled.