This project collects activity from:
- Google Calendar
- Jira
- WakaTime
- GitHub
It builds a daily summary and sends it to Slack.
- Node.js 20+
- npm
- A Slack incoming webhook
- At least one enabled integration with valid credentials
npm installnpm startTo validate the TypeScript project:
npm run typecheckEdit integrations.config.ts:
export const INTEGRATIONS = {
googleCalendar: true,
jira: true,
wakatime: true,
github: true,
};Set any integration to false to skip it.
Create a .env file in the project root. You can start from .env.example.
Example:
SLACK_WEBHOOK_URL=
GOOGLE_CALENDAR_ID=primary
JIRA_BASE_URL=
JIRA_EMAIL=
JIRA_API_TOKEN=
JIRA_ACCOUNT_ID=
JIRA_DISPLAY_NAME=
WAKATIME_API_KEY=
GITHUB_TOKEN=
GITHUB_USERNAME=
GITHUB_REPOS=Used to send the final summary message to Slack.
How to get it:
- Go to https://api.slack.com/apps
- Click
Create New App - Choose
From scratch - Give the app a name and select your Slack workspace
- Open
Incoming Webhooks - Enable
Activate Incoming Webhooks - Click
Add New Webhook to Workspace - Choose the channel where the summary should be posted
- Authorize the app
- Copy the webhook URL
How to set it:
SLACK_WEBHOOK_URL=https://hooks.slack.com/services/...Used to choose which Google Calendar will be queried. This is optional. If omitted, the app uses primary.
How to get it:
- Open Google Calendar
- In the left sidebar, find the calendar you want to use
- Click the
...next to that calendar - Open
Settings and sharing - Scroll to
Integrate calendar - Copy the
Calendar ID
How to set it:
GOOGLE_CALENDAR_ID=primaryOr:
GOOGLE_CALENDAR_ID=your-calendar-id@group.calendar.google.comUsed as the base URL for all Jira API requests.
How to get it:
- Open your Jira site in the browser
- Copy the site root URL
- Remove any page-specific path
Example:
- If your Jira page is
https://your-company.atlassian.net/jira/software/projects/ABC/boards/1 - Then your base URL is
https://your-company.atlassian.net
How to set it:
JIRA_BASE_URL=https://your-company.atlassian.netUsed to authenticate Jira API requests and help identify your comments.
How to get it:
- Use the email address of your Atlassian account
- You can confirm it from your Atlassian profile if needed
How to set it:
JIRA_EMAIL=you@company.comUsed together with JIRA_EMAIL for Jira API authentication.
How to get it:
- Go to https://id.atlassian.com/manage-profile/security/api-tokens
- Click
Create API token - Enter a label like
worklog-bot - Create the token
- Copy the token immediately
How to set it:
JIRA_API_TOKEN=your-jira-api-tokenOptional, but recommended. Helps the bot detect which Jira comments are yours.
How to get it:
- Open Jira
- Open any issue where you have commented
- Open the browser developer tools and inspect Jira API responses, or use the Atlassian profile APIs if your admin allows it
- Look for your Atlassian
accountId
Simpler alternative:
- Leave this blank at first
- Set
JIRA_DISPLAY_NAME - Test the bot
- Only add
JIRA_ACCOUNT_IDlater if comment detection is inconsistent
How to set it:
JIRA_ACCOUNT_ID=your-atlassian-account-idOptional, but recommended. Also helps the bot match your Jira comments.
How to get it:
- Open Jira
- Click your avatar
- Copy your display name exactly as shown
How to set it:
JIRA_DISPLAY_NAME=Your NameUsed to read your coding activity from WakaTime.
How to get it:
- Log in to https://wakatime.com
- Open
Settings - Open
AccountorAPI Key - Copy your API key
How to set it:
WAKATIME_API_KEY=waka_xxxxxxxxxxxxxxxxxUsed to query pull requests, comments, reviews, and commits.
How to get it:
- Log in to GitHub
- Go to
Settings - Open
Developer settings - Open
Personal access tokens - Choose either
Tokens (classic)orFine-grained tokens - Create a token with read access to the repositories you want to inspect
Recommended access:
- Pull requests: read
- Issues: read
- Metadata: read
- Contents: read
How to set it:
GITHUB_TOKEN=github_token_hereUsed to identify your own GitHub activity.
How to get it:
- Open GitHub
- Click your profile picture
- Copy your username from your profile URL or profile header
How to set it:
GITHUB_USERNAME=your-github-usernameComma-separated list of repositories the bot should inspect.
How to get it:
- Open each repository in GitHub
- Copy the
owner/repovalue from the URL - Join multiple repos with commas and no line breaks
Example:
GITHUB_REPOS=owner-one/repo-one,owner-two/repo-twoGoogle Calendar does not use only .env. It also needs:
credentials.jsontoken.json
How to get it:
- Open https://console.cloud.google.com/
- Create or select a Google Cloud project
- Enable the Google Calendar API for that project
- Go to
APIs & Services->Credentials - Click
Create Credentials - Choose
OAuth client ID - If prompted, configure the consent screen first
- Choose
Desktop app - Create the credential
- Download the JSON file
- Save it in the project root as
credentials.json
This file contains the OAuth access and refresh token after authorizing the app.
How to create it:
- Use the
credentials.jsonfile above - Run an OAuth flow once using the same Google account that owns the calendar
- Save the resulting token payload as
token.jsonin the project root
Important:
token.jsonis user-specificcredentials.jsonandtoken.jsonshould not be committed to a public repository
Always required:
SLACK_WEBHOOK_URL
Required only if that integration is enabled:
- Google Calendar:
GOOGLE_CALENDAR_IDis optional, butcredentials.jsonandtoken.jsonare required - Jira:
JIRA_BASE_URL,JIRA_EMAIL,JIRA_API_TOKEN - WakaTime:
WAKATIME_API_KEY - GitHub:
GITHUB_TOKEN,GITHUB_USERNAME
Recommended optional values:
JIRA_ACCOUNT_IDJIRA_DISPLAY_NAMEGITHUB_REPOS
- If
GITHUB_REPOSis empty, GitHub integration will not return repository activity. - If
GOOGLE_CALENDAR_IDis not set, the bot usesprimary. - The app timezone and integration endpoints are defined in app.config.ts.
- The app currently reads meetings, Jira work and comments, WakaTime file activity, and GitHub pull request activity for the current day.
- Do not commit
.env,credentials.json, ortoken.json - Rotate any token immediately if it has been exposed
- Prefer least-privilege GitHub and Jira tokens