Skip to main content
Meridian supports two additional issue trackers alongside Jira: GitHub Issues and Linear. Both work the same way under the hood — Meridian fetches your open issues into the local pm_tasks table, uses them as classification targets when it processes each app session, and once classification matches a session to an issue it can also draft a worklog against that issue. You can enable one, the other, or both at the same time. Neither GitHub nor Linear exposes a native time-tracking / worklog API, so on these trackers Meridian records a worklog as a structured comment on the matched issue: a single Markdown line of the form **⏱ Worklog — 1h 30m** · 2026-06-02 09:00, followed by the synthesised narrative of what you did, followed by an HTML-comment machine marker (meridian-worklog v1 …) carrying the exact UTC window and seconds so the entry can be parsed back out later. Worklogs are still gated by approval in the dashboard’s Worklogs view — the same draft → approve → post pipeline as Jira, just with a different final hop. See Review and approve worklogs.

What Meridian does with GitHub Issues

Meridian fetches open issues from your GitHub organisation’s repositories using the GitHub REST API. Each issue is stored in pm_tasks alongside any Jira or Linear issues you’ve configured. When Meridian classifies a coding session — say, an hour in VS Code on a feature branch — it matches that work against your open issues and writes a ticket_links row with the best-matching issue key.

Prerequisites

  • A GitHub account with access to the organisation (or personal) issues you want to track
  • A personal access token (PAT) with write access to issue comments — Meridian needs this to post worklog comments after you approve them

Create a GitHub personal access token

1

Open GitHub Settings

Click your avatar in the top-right corner of GitHub, then choose Settings.
2

Navigate to Developer settings

Scroll to the bottom of the left sidebar and click Developer settings.
3

Generate a new token

Select Personal access tokens → Tokens (classic) or Fine-grained tokens. Click Generate new token.
  • Classic token (simplest) — enable the repo scope. This single scope covers both reading issues and posting worklog comments, on personal and org-owned repos.
  • Fine-grained token — grant Issues: Read and write on every repository Meridian should monitor (read-only is not enough; Meridian needs write access to add the worklog comment when you approve a draft).
4

Copy the token

Copy the token value before navigating away — GitHub only shows it once.

Set environment variables

Open the Meridian env file:
meridian config edit
Add the GitHub block to ~/.meridian/.env:
# ~/.meridian/.env

GITHUB_TOKEN=ghp_your_personal_access_token
GITHUB_ORG=your-org-name   # org slug OR your own username

# Optional: limit to specific repos (comma-separated owner/repo pairs)
# GITHUB_REPOS=your-org/api,your-org/web
GITHUB_ORG is the issue owner Meridian should sync — an organisation slug or your own GitHub username (for personal repos). Meridian fetches open issues assigned to you under that owner. If GITHUB_REPOS is omitted, every repository under the owner that your token can read is included.

Apply and verify

1

Restart the daemon

meridian restart
2

Check the connection

meridian doctor
Look for github: connected in the output. Meridian reports the connection status for every configured integration.
3

Confirm issues were fetched

sqlite3 ~/.meridian/meridian.db \
  "SELECT task_key, title FROM pm_tasks WHERE provider='github' LIMIT 10;"

Filter to specific repositories

Set GITHUB_REPOS to a comma-separated list of owner/repo strings:
GITHUB_REPOS=myorg/api,myorg/web,myorg/infra
Only open issues from those repositories will be pulled into pm_tasks. This is useful when your organisation has many repositories but you only actively work in a subset.

What “posting a worklog” means on GitHub

GitHub has no native time-tracking API, so when you approve a worklog draft Meridian posts it as a comment on the matched issue via POST /repos/{owner}/{repo}/issues/{number}/comments. The comment looks like:
**⏱ Worklog — 1h 30m** · 2026-06-02 09:00

Wired the new worklog provider router and migrated existing rows to default to `jira`. Wrote the comment formatter and idempotency check.

<!-- meridian-worklog v1 window=2026-06-02T09:00:00Z/2026-06-02T10:00:00Z seconds=5400 -->
In your tracker you will see:
  • A new comment on the issue authored by the token’s user, with the time-spent line and the synthesised narrative.
  • The same comment surfaced on any Project (v2) board the issue belongs to — Project cards already show issue comments, so no extra setup is needed.
  • A hidden machine marker on the last line that Meridian (and any other tool) can grep for to reconstruct the exact window and seconds later. Worklogs are idempotent on (task_key, window_start, window_end) — re-running the pipeline never double-posts.
The same repo (classic) or Issues: Read and write (fine-grained) scope you configured above is all that’s needed — no separate Projects scope is required.

Troubleshooting

Check that your token has not expired and has the correct scopes. Classic tokens need the repo scope; fine-grained tokens need Issues: Read and write (read-only will let issues sync but worklog comments will fail with 403). Regenerate the token in GitHub Settings if needed.
Confirm that GITHUB_ORG matches your organisation’s login name exactly (case-sensitive). If GITHUB_REPOS is set, verify each entry uses the full owner/repo format. Your token must have access to at least one repository in the org.
Both GITHUB_TOKEN and GITHUB_ORG are required. Run meridian config edit and confirm neither is commented out.