Never miss a Pilke DaisyFamily message again.
DaisyNotice watches your Pilke inbox and pushes new messages to Telegram, WeChat Work, or email — with Finnish → English translation built in.
Pilke has no real-time push and no multi-user alerts. DaisyNotice fills that gap for you and your family.
- 🔄 Auto polling — Playwright logs in and checks for new messages on a schedule
- 🧠 Smart dedupe — timestamp-based tracking, no spam from the same message
- 📢 Multi-channel — Telegram / WeChat Work / email, pick any combination
- 🇬🇧 Finnish → English — Finnish-only messages are translated automatically
- 📎 Attachments — downloads and forwards files when available
- ☁️ Zero server needed — run on GitHub Actions for free, or locally on Node.js 20+
No VPS. No Docker. Fork once, add secrets, done.
Fork → your GitHub account.
In your fork: Settings → Actions → General → Allow all actions.
Then open Actions and enable workflows if GitHub asks.
Settings → Secrets and variables → Actions → New repository secret
| Secret | Required | Description |
|---|---|---|
PILKE_USERNAME |
✅ | Pilke login username |
PILKE_PASSWORD |
✅ | Pilke login password |
NOTIFICATION_CHANNELS |
✅ | e.g. telegram, email, telegram,email, or all |
TELEGRAM_BOT_TOKEN |
if using Telegram | From @BotFather |
TELEGRAM_CHAT_ID |
if using Telegram | Your chat / group id |
WECHAT_WEBHOOK_URL |
if using WeChat | WeChat Work bot webhook |
EMAIL_WEBHOOK_URL |
if using email on Actions | Google Apps Script Web App URL |
EMAIL_WEBHOOK_TOKEN |
if using email on Actions | Same token as in the GAS script |
EMAIL_FROM |
if using email | From address |
EMAIL_TO |
if using email | Recipients, comma-separated |
On GitHub Actions, prefer the email webhook path. Hosted runners often block SMTP ports.
- Actions → DaisyNotice Poll → Run workflow
- Enable
send_test_notificationto verify Telegram / email / WeChat - Run again without the test flag to do the first real poll
(first run marks existing messages as seen and sends a setup confirmation) - After that, the workflow runs on the schedule in
.github/workflows/poll.yml(default: daily at 12:00 UTC)
git clone https://github.com/rootSunc/DaisyNotice.git
cd DaisyNotice
npm install
npx playwright install chromium
cp .env.example .envEdit .env with at least:
PILKE_USERNAME=your-username
PILKE_PASSWORD=your-password
NOTIFICATION_CHANNELS=telegram
TELEGRAM_BOT_TOKEN=...
TELEGRAM_CHAT_ID=...Then:
npm run notify-test # verify notification channels
npm run poll # one-shot check
npm start # keep polling (default every 8 hours)If auto-login fails, run npm run auth once in a visible browser, then retry.
Requires Node.js 20+.
NOTIFICATION_CHANNELS=telegram,email| Value | Channels |
|---|---|
telegram |
Telegram Bot |
wechat |
WeChat Work webhook |
email |
Email (webhook or SMTP) |
both |
Telegram + WeChat |
all |
Telegram + WeChat + email |
- Sign in to Google Apps Script with the sender Gmail account
- Paste
docs/google-apps-script-email-webhook.gs - Replace
TOKENwith a long random string - Deploy as Web App: Execute as: Me, Who has access: Anyone
- Save the Web App URL + token as secrets:
EMAIL_WEBHOOK_URL=https://script.google.com/macros/s/.../exec
EMAIL_WEBHOOK_TOKEN=your-long-random-token
EMAIL_FROM=notice@example.com
EMAIL_TO=person1@example.com,person2@example.comEMAIL_SMTP_HOST=smtp.example.com
EMAIL_SMTP_PORT=465
EMAIL_SMTP_SECURE=true
EMAIL_SMTP_USER=notice@example.com
EMAIL_SMTP_PASS=your-app-password
EMAIL_FROM=notice@example.com
EMAIL_TO=person1@example.com,person2@example.comWhen a message looks Finnish-only, DaisyNotice appends an English translation to the title and body before sending the notification.
- Mixed Finnish / English messages are left as-is
- Uses Google’s public translate endpoint (unofficial; may rate-limit or change)
- No API key required
- Failures are non-fatal — you still get the original Finnish text
| Command | What it does |
|---|---|
npm run notify-test |
Send a test notification (no Pilke login) |
npm run poll |
Check once for new messages |
npm start |
Poll forever on POLL_INTERVAL_HOURS (default 8) |
npm run notify-all [N] |
Resend latest N messages (or all) |
npm run auth |
Interactive browser login, save data/session.json |
npm run check-notification-config |
Validate selected channel env vars |
First poll / Actions run: marks current inbox as seen and sends a setup confirmation. Later runs only notify on newer messages.
| Variable | Default | Notes |
|---|---|---|
POLL_INTERVAL_HOURS |
8 |
Local npm start interval |
INITIAL_SYNC_MODE |
mark-seen |
First run: mark existing as seen |
MESSAGES_URL |
empty | Direct inbox URL if auto-nav fails |
DEBUG_CAPTURE |
0 |
Set 1 to save HTML/screenshots under data/debug/ |
MESSAGE_*_SELECTOR |
empty | Override CSS selectors if Pilke UI changes |
See .env.example for the full list.
For personal learning and research only. Automating access to Pilke may violate its Terms of Service. You assume all risk.