ParentSync

Your family's WhatsApp and email messages, automatically organized into calendar events

v1.0.2 ยท Desktop App for Linux, Windows & macOS Created by Shahar Bar-Moshe

What is ParentSync?

A desktop app that reads your children's school WhatsApp groups and teacher emails, uses AI to find events, and puts them on your Google Calendar.

Get the App

Click your platform for a direct download from GitHub Releases v1.0.2. Per-platform run instructions later in the deck (Quick Start section).

No account needed. All assets: github.com/ShaharBarMoshe/ParentSync/releases/tag/v1.0.2

How It Works

๐Ÿ’ฌ
WhatsApp & Email
Scans parent groups
and teacher emails
โ†’
๐Ÿค–
AI Parsing
Extracts event details
using LLM
โ†’
๐Ÿ‘
Approval
Optional: approve
via WhatsApp
โ†’
๐Ÿ“…
Google Calendar
Events synced
automatically

Dashboard

Dashboard
Sync status, recent messages, upcoming events, and sync history at a glance

Calendar View

Calendar
Full month/week/day calendar with events color-coded by source (WhatsApp or Email)

Settings & Setup

Connections
Settings - connections
Children & Schedule
Settings - schedule

Dashboard โ€” In Detail

Sync Status (top card)

  • Messages Processed โ€” total messages collected across all recent syncs
  • Events Created โ€” how many calendar events the AI extracted
  • Last Sync โ€” when the last sync happened
  • Duration โ€” how long it took (e.g., 18s)
  • Status badge โ€” green "Success", orange "Partial", or red "Failed"

๐Ÿ’ก Click "Sync Now" to trigger an immediate scan of all your configured WhatsApp groups and email addresses.

Sync History (expandable list)

  • Shows the last 5 syncs with status, time, duration, message count
  • Click any entry to expand โ€” see per-channel breakdown (which child, which group, how many messages)
  • Skipped channels show the reason (e.g., "no new messages")
  • Click "View synced messages" to see exact messages that were collected

Dashboard โ€” Messages & Events

Recent Messages (bottom left)

  • All messages collected from WhatsApp and Gmail
  • Source icon: WhatsApp icon = WhatsApp group, Mail icon = email
  • Click a message to expand and read full content
  • Click "Show more" to load additional messages (20 at a time)

Upcoming Events (bottom right)

  • Events in the next 7 days parsed from messages
  • Coloured pill: ๐ŸŸ  Pending, ๐ŸŸข Approved, ๐Ÿ”ด Rejected
  • Pending events have inline Approve / Reject buttons โ€” same effect as ๐Ÿ‘ / ๐Ÿ˜ข in WhatsApp
  • Checkmark icon = synced to Google Calendar

How to get data flowing

  1. Make sure WhatsApp is connected (Settings โ†’ WhatsApp โ†’ "Connected")
  2. Add at least one child with WhatsApp channels (Settings โ†’ Children)
  3. Set your Gemini API key (Settings โ†’ Gemini AI), or use OpenRouter as alternative
  4. Click "Sync Now" on the Dashboard
  5. Wait 15-30 seconds โ€” messages and events appear

๐Ÿ’ก Refresh button (top-right โ†ป icon) reloads all data on the current page without triggering a new sync.

Getting & Refreshing Data

Automatic Sync

ParentSync automatically scans at the hours you configured in Settings โ†’ Sync Schedule. For example, if you selected 8amโ€“10pm, it scans once per hour during those times.

Manual Sync

Click "Sync Now" on the Dashboard to trigger an immediate scan. Useful after adding a new child or channel.

Refresh Display

The โ†ป refresh button (top-right corner of the nav bar) reloads all data on the current page from the database. It does NOT trigger a new sync โ€” it just refreshes the view.

Data Freshness Tips

  1. After connecting WhatsApp for the first time, click "Sync Now" to populate initial data
  2. Add all your children's group names before the first sync so all channels are scanned
  3. The Monitor page filters (7d/30d/90d) affect all charts โ€” use 30 days for a good overview
  4. If Dashboard shows old data, click โ†ป refresh โ€” if it still doesn't update, click "Sync Now"

๐Ÿ’ก The app keeps running and syncing even when minimized to the system tray.

How-To Guide

Step-by-step setup for each integration

Setup: Gemini (default AI)

The AI engine that reads messages and extracts calendar events

What is Gemini?

Google's Gemini family of LLMs โ€” fast, cheap, and very good at multilingual extraction. ParentSync uses it to read WhatsApp and email messages and identify dates, events, and details.

๐Ÿ’ก The default model gemini-2.5-flash-lite is fast and cheap โ€” typical extraction costs are negligible. A free tier is available too.

๐Ÿ” Don't want Gemini? OpenRouter is supported as an alternative provider โ€” see next slide.

How to get your API key

  1. Go to aistudio.google.com/apikey
  2. Sign in with your Google account
  3. Click "Create API key"
  4. Copy the key
  5. Paste in ParentSync โ†’ Settings โ†’ Gemini AI โ†’ API Key
  6. Optionally pick a different model in the same section
๐Ÿ“บ Video walkthrough โ€” Gemini API Key in Google AI Studio (YouTube)

Alternative: OpenRouter

One-stop shop for many LLM providers behind a single API key

What is OpenRouter?

A gateway to many AI models (GPT, Claude, Llama, Qwen, etc.) through a single API key. Useful if you already have credits there, or if you want to A/B test models without changing keys.

๐Ÿ’ก Free models are available โ€” typically labelled :free. They have rate limits but cost nothing.

How to get your API key

  1. Go to openrouter.ai/keys
  2. Sign up or log in (Google/GitHub)
  3. Click "Create Key"
  4. Copy the key (starts with sk-or-)
  5. Paste in ParentSync โ†’ Settings โ†’ OpenRouter โ†’ API Key
๐Ÿ“บ Video walkthrough โ€” Get your OpenRouter API Key (YouTube)

You can fill both keys; the active provider is whichever the build is wired to (Gemini by default).

Setup: Google Account

Connect Gmail and Google Calendar to read emails and sync events

What is Google OAuth?

OAuth lets ParentSync access your Gmail and Calendar without storing your Google password. You create a "Client ID" in Google Cloud Console โ€” think of it as a permission slip that tells Google "this app is allowed to access my data."

๐Ÿ’ก You can use separate Google accounts for email scanning and calendar โ€” or the same account for both.

How to set it up

  1. Go to console.cloud.google.com
    Create a project if you don't have one
  2. Enable Gmail API and Calendar API
    APIs & Services โ†’ Enable APIs
  3. Create OAuth consent screen
    Add your email as a Test user
  4. Create OAuth Client ID (Web app)
    Redirect URI: http://localhost:41932/api/auth/google/callback
  5. Copy Client ID and Client Secret into ParentSync Settings

โš  Tip: switch the consent screen to "In production" โ€” Test-mode tokens expire after 7 days.

๐Ÿ“บ Video walkthrough โ€” Create OAuth 2.0 Client ID in Google Console (YouTube)

Connecting Google Accounts

After entering Client ID & Secret

  1. Click "Save Settings"
  2. Click "Sign in with Google" under Email Scanning
  3. Google's consent screen opens in your browser
  4. Select your account and click "Allow"
  5. You're redirected back โ€” status shows Connected
  6. Repeat for Calendar (same or different account)

Troubleshooting

โš ๏ธ "Error 403: access_denied"

Your Google app is in "Testing" mode. Fix: Go to OAuth consent screen โ†’ either add your email as a Test user or click "Publish App".

โš ๏ธ "Failed to exchange authorization code"

The Client Secret may be wrong, or the redirect URI doesn't match. Double-check both in Google Cloud Console and in ParentSync Settings.

Setup: WhatsApp

Connect your WhatsApp to scan parent group messages

How it works

ParentSync connects to WhatsApp Web โ€” the same way you'd use WhatsApp on your computer. It runs its own browser in the background to read messages from the groups you specify.

๐Ÿ’ก Your WhatsApp session persists across app restarts. You only need to scan the QR code once. If the session expires, you'll be prompted to re-scan.

๐Ÿ“ฑ Your phone must stay connected to the internet for WhatsApp Web to work (WhatsApp requirement).

How to connect

  1. Open ParentSync โ†’ Settings
  2. Click "Connect WhatsApp"
  3. A QR code appears in the app
  4. On your phone:
    WhatsApp โ†’ Settings โ†’ Linked Devices โ†’ Link a Device
  5. Scan the QR code with your phone camera
  6. Status changes to "Connected"

Then go to Children in Settings, add a child, and type the exact WhatsApp group name.

Under the Hood

Desktop Shell
Electron (single executable)
Frontend
React + TypeScript
Backend
NestJS (REST API, embedded)
Database
SQLite (local, no server)
AI
Gemini (default) ยท OpenRouter swap-in
WhatsApp
whatsapp-web.js (Chromium)

All data stored locally on your machine. No cloud servers, no accounts to create. Just download, configure, and run.

Run on macOS ๐ŸŽ

โฌ‡๏ธ Download โ€” Apple Silicon ParentSync-1.0.2-arm64.dmg โฌ‡๏ธ Download โ€” Intel ParentSync-1.0.2.dmg

Step by step

  1. Click the right download above (M-series Mac โ†’ Apple Silicon; older Intel Mac โ†’ Intel)
  2. Double-click the .dmg in your Downloads folder
  3. Drag the ParentSync icon into the Applications folder
  4. Open Applications and double-click ParentSync
  5. First time only: macOS says "Apple cannot check it for malicious software."
    Right-click the icon โ†’ Open โ†’ Open in the dialog

What you'll see

  • The app window opens โ€” click Settings (top bar) to start configuring
  • An icon appears in your menu bar (top right) โ€” right-click for Sync Now / Quit
  • Closing the window keeps it running; quit fully from the menu bar

๐Ÿ“ฆ The build is unsigned (no Apple Developer certificate). The right-click โ†’ Open dance is only needed the first time.

Run on Windows ๐ŸชŸ

โฌ‡๏ธ Download Installer ParentSync-Setup-1.0.2.exe

Step by step

  1. Click the download button above
  2. Double-click the installer in your Downloads folder
  3. Windows SmartScreen says "Windows protected your PC."
    Click "More info" โ†’ "Run anyway"
  4. Click through the installer (Next โ†’ Install โ†’ Finish)
  5. The app launches automatically and adds itself to the Start menu

What you'll see

  • A desktop shortcut and a Start-menu entry are created
  • An icon appears in the system tray (bottom right) โ€” right-click for Sync Now / Quit
  • Closing the window minimizes to the tray; right-click โ†’ Quit to exit fully
  • Auto-starts on login by default

๐Ÿ“ฆ The installer is unsigned (no Authenticode certificate). The SmartScreen "Run anyway" is only needed the first time.

Run on Linux ๐Ÿง

โฌ‡๏ธ AppImage (any distro) ParentSync-1.0.2.AppImage โฌ‡๏ธ .deb (Debian/Ubuntu) parentsync_1.0.2_amd64.deb

AppImage (any distro)

  1. Click the AppImage download above
  2. Files need to be marked runnable first. Two ways:
    Mouse: Right-click โ†’ Properties โ†’ Permissions โ†’ check "Allow executing as a program".
    Terminal: chmod +x ParentSync-1.0.2.AppImage
  3. Double-click it (or ./ParentSync-1.0.2.AppImage)

Debian / Ubuntu: .deb

  1. Click the .deb download above
  2. Double-click โ†’ opens in Software Center โ†’ Install
  3. Or terminal: sudo dpkg -i parentsync_1.0.2_amd64.deb
  4. Launch from your application menu

Auto-start on login (optional)

Clone the repo and run npm run install:local โ€” registers the AppImage as a systemd user service.

Platform Support & Building From Source

PlatformFormatHow to Run
Linux.AppImage (portable)chmod +x, double-click or run from terminal
Linux.deb (Debian/Ubuntu)dpkg -i, run from app menu
Windows.exe (NSIS installer)Double-click installer
macOS.dmgDrag to Applications
# Build it yourself (any platform)
git clone https://github.com/ShaharBarMoshe/ParentSync.git
cd ParentSync && ./setup.sh
npm run package:linux # or :mac / :win

Built with Electron | All data stored locally | Private use

Uninstalling ๐Ÿ—‘๏ธ

An in-app Settings โ†’ Danger Zone โ†’ Uninstall ParentSync button is planned (Phase 19) โ€” until then, here's the manual cleanup per platform. Add --purge / the data-removal step to also wipe your database, OAuth tokens, WhatsApp session, and logs.

๐Ÿง Linux

# 1. systemd autostart
systemctl --user stop parentsync.service
systemctl --user disable parentsync.service
rm -f ~/.config/systemd/user/parentsync.service

# 2. binary + versions
rm -f ~/.local/bin/ParentSync.AppImage
rm -rf ~/.local/share/parentsync
rm -f ~/.local/share/applications/parentsync.desktop

# 3. (.deb only)
sudo apt remove parentsync

# 4. data โ€” IRREVERSIBLE
rm -rf ~/.config/parentsync

๐ŸŽ macOS

# 1. Quit ParentSync (menu bar)
# 2. Drag /Applications/ParentSync.app to Trash

# 3. data โ€” IRREVERSIBLE
rm -rf "$HOME/Library/Application Support/ParentSync"
rm -rf "$HOME/Library/Logs/ParentSync"
rm -rf "$HOME/Library/Caches/com.parentsync.app"
rm -f "$HOME/Library/Preferences/com.parentsync.app.plist"
rm -f "$HOME/Library/LaunchAgents/com.parentsync.app.plist"

๐ŸชŸ Windows

# 1. Settings โ†’ Apps โ†’ ParentSync โ†’ Uninstall
# (Handles binary, Start menu, registry)

# 2. data โ€” IRREVERSIBLE (PowerShell)
Remove-Item -Recurse -Force "$env:APPDATA\ParentSync"
Remove-Item -Recurse -Force "$env:LOCALAPPDATA\ParentSync"
Remove-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run" "ParentSync"

๐Ÿ“ฑ After removing user data, open WhatsApp on your phone โ†’ Settings โ†’ Linked Devices and remove the ParentSync entry to fully unlink.

Event Reminders

ParentSync sends a WhatsApp reminder ~24 hours before an event begins, but only for events that have settled in the system long enough to be trusted.

See docs/EVENT-REMINDERS.md for the full specification.

You're in control of the AI ๐ŸŽ›๏ธ

The AI never gets the last word โ€” you do, in two complementary ways. The prompt sets the rules; your reactions tune the edge cases. Both feed into the same LLM call, and changes take effect on the next sync.

1. Edit the rules
Settings โ€” AI Extraction Prompt

Settings โ†’ AI Extraction Prompt. The whole system prompt is a textarea. Add an example, change wording, or hit Reset to default. Effective on the next sync.

2. React to the results
Settings โ€” Learned Exclusions

๐Ÿ‘ / ๐Ÿ˜ข in WhatsApp โ€” or the inline buttons on the Dashboard. Every ๐Ÿ˜ข captures the source as a Learned Exclusion (most recent 50 appended to the prompt). Take back a reaction to undo.

The parse cache keys include a hash of the prompt + exclusions โ€” so feedback closes on the next sync, not 24 h later.

In-App Approval

Dashboard with approval pills + Approve/Reject buttons
Each upcoming event shows its status as a pill โ€” ๐ŸŸ  Pending, ๐ŸŸข Approved, ๐Ÿ”ด Rejected. Pending events have inline Approve / Reject buttons. Same effect as ๐Ÿ‘ / ๐Ÿ˜ข in WhatsApp; reactions are reversible too โ€” take back a ๐Ÿ‘ to unsync from Google, take back a ๐Ÿ˜ข to clear the learned exclusion.

Duplicate Suppression

One real-world WhatsApp message can describe the same gathering from multiple angles โ€” a birthday is also a "meetup," a class trip is also a "ceremony." The LLM used to extract them as separate events at the same date+time. Now:

๐Ÿ’ก The check pairs with the negative-feedback loop: even if a duplicate slips through, one ๐Ÿ˜ข reaction puts it in the learned-exclusions pool so it's gone for good.

Monitor & Analytics

Monitor
Messages scanned, events created, sync success rate, and channel activity charts

Monitor โ€” Summary Cards

Six cards at the top give you a quick health check. Use the Period dropdown (7/30/90 days) and Child filter to narrow the view.

๐Ÿ’ฌ Messages Scanned

Total WhatsApp + email messages collected. Green trend arrow shows change vs. previous period.

๐Ÿ“… Events Created

How many calendar events the AI extracted from messages. Trend arrow compares to previous period.

โฑ Avg Sync Duration

Average time per sync cycle (scanning + parsing). Under 30s is normal.

โœ… Sync Success Rate

Percentage of syncs that completed without errors. Green โ‰ฅ80%, orange โ‰ฅ50%, red below 50%.

๐Ÿ“Š Most Active Channel

The WhatsApp group or email source that generated the most messages in this period.

๐Ÿ”„ Last Sync

Timestamp and status badge of the most recent sync. Tells you when data was last refreshed.

Monitor โ€” Charts & Graphs

๐Ÿ“ˆ Messages Over Time

Line chart with two lines:
โ— Green = WhatsApp messages
โ— Red = Email messages
X-axis: dates, Y-axis: message count. Shows daily volume trends โ€” helps spot when groups are most active.

๐Ÿ“Š Events Per Channel

Horizontal bar chart showing event count by WhatsApp group name. Each channel gets a different purple shade. Hover to see percentage of total. Identifies which groups generate the most calendar events.

๐Ÿ“‰ Sync History

Combo chart โ€” bars + line overlay.
Bars: message count per sync (green = success, orange = partial, red = failed)
Line: sync duration in seconds (right axis)
Spot slow syncs or recurring failures at a glance.

๐Ÿ—“ Channel Activity Heatmap

Grid with channels as rows, dates as columns. Cell color intensity = message count. Darker purple = more messages. Hover any cell for exact count. Reveals which days and channels are busiest.

Common Errors & Solutions

โš ๏ธ "Sync failed"

WhatsApp may be disconnected, or the LLM API key is missing/expired. Check Settings โ†’ WhatsApp status and Gemini / OpenRouter API key.

โš ๏ธ "0 Events Created" after sync

The AI didn't find any events in the messages. This is normal if messages are just chat. Only messages with dates/times get parsed into events.

โš ๏ธ "Google OAuth not configured"

You haven't entered the Google Client ID and Secret yet. Go to Settings โ†’ Google OAuth and follow the setup steps (slide 17).

โš ๏ธ "WhatsApp is not connected"

Session expired. Go to Settings โ†’ click "Connect WhatsApp" โ†’ scan QR code again with your phone.

โš ๏ธ "Failed to load dashboard data"

Backend may still be starting. Wait a few seconds and click the refresh button (โ†ป top-right). If it persists, restart the app.

โš ๏ธ Events not appearing on Google Calendar

Check: 1) Google Calendar account is connected (Settings), 2) If using approval channel, react ๐Ÿ‘ to approve the event in WhatsApp.