EverCV now pulls from Jira, Linear, and Google Calendar
GitHub tells part of the story. It captures the commits you pushed, the PRs you merged, the reviews you left. But a big slice of engineering work — the investigation you drove for three days before writing a single line of code, the migration ticket you owned end-to-end, the on-call incident you closed, the week you spent in back-to-back design reviews — lives in your ticket tracker and your calendar, not in your repo.
EverCV's pipeline now understands this. As of today, Jira, Linear, and Google Calendar are first-class data sources alongside GitHub.
The problem with GitHub-only CVs
A GitHub-only CV is an accurate record of your output, but it's a narrow one. The commits don't capture:
- Architectural decisions that lived in a Jira epic for a month before anyone opened a branch
- Operational work: oncall, incident response, runbooks
- Cross-team projects where you drove alignment and someone else wrote the code
- Refactor tickets that closed with a clean diff but started with weeks of planning
These are the things that actually differentiate senior engineers on a CV. They're also invisible to any tool that only reads git log.
How the Jira adapter works
The Jira adapter talks to Atlassian's REST API v3 using Basic auth — your email plus an API token you generate at id.atlassian.com/manage/api-tokens. No OAuth flow, no app installation. Paste the token into your EverCV profile and you're done.
Under the hood, it runs a JQL query against your instance to find completed tickets assigned to you:
assignee = "you@company.com"
AND statusCategory = "Done"
AND updated >= "2026-06-13"
AND updated <= "2026-06-13"
Add a jira_project key to your profile and it scopes to that project; leave it blank and it searches everything you have access to. The adapter paginates automatically at 100 issues per page, handles Atlassian's millisecond timestamp format, and flattens the Atlassian Document Format (ADF) description — Jira's REST API v3 returns descriptions as a nested node tree, not plain text — into something the CV pipeline can actually read.
How the Linear adapter works
Linear uses a GraphQL API. The adapter sends a single query with a completedAt filter:
query CompletedIssues($filter: IssueFilter!, $after: String) {
issues(filter: $filter, first: 100, after: $after) {
nodes {
identifier
title
description
state { name type }
team { name key }
completedAt
priority
labels { nodes { name } }
url
}
pageInfo { hasNextPage endCursor }
}
}
Auth is a personal API key from linear.app/settings/api — same story as Jira, no OAuth. The filter pins to assignee: { isMe: { eq: true } } and state.type = "completed", so it only surfaces your own closed work. Priority, labels, and team are all extracted and stored in the signal payload — the bucketing system in EverCV's extraction layer already had JIRA_TICKET and LINEAR_TICKET source types waiting for them.
Google Calendar: the context layer
Commits and tickets tell you what shipped. Your calendar tells you the cost.
The Google Calendar adapter connects via OAuth — click "Connect Google Calendar" in your EverCV settings and authorize read-only calendar access. No API token to manage. EverCV exchanges an authorization code for a refresh token, persists it, and silently refreshes the access token before every nightly build so you never have to reconnect.
The adapter skips all-day events, cancelled events, and events you declined. For everything else, it records duration (minutes), attendee count, and event title. The pipeline uses this to surface the context-switching load that doesn't show up anywhere in git or Jira: the week you spent in back-to-back interviews for the team you were building, the month you were oncall and blocked every afternoon, the sprint where half your days were design reviews.
A CV without that context makes a 40-hour feature look identical to a 40-hour feature that happened during a hiring freeze with 6 hours of interviews per day. The calendar adapter fills that gap.
Any combination of sources
The refresh_cv.py runner now assembles signals from whichever sources you've configured. Any combination works — the pipeline merges everything into a single timeline and hands it to the extraction and rollup stages the same way it always has.
- Add GitHub credentials → commits and merged PRs
- Add Jira domain, email, and API token → completed Jira tickets
- Add Linear API key → completed Linear issues
- Connect Google Calendar via OAuth → meeting load and calendar context
The per-day refresh loop picks up each source with error isolation — if one source is temporarily unavailable, the others still complete.
Pricing
Multi-source adapters (Jira, Linear, and Google Calendar) are a Pro tier feature at $39/month. GitHub remains available on the free tier. If you're already on Pro, all three adapters activate the moment you add credentials to your profile — no upgrade, no wait.
Setup
For Jira: add your Atlassian domain, email, and an API token from id.atlassian.com/manage/api-tokens in your EverCV profile settings.
For Linear: add a personal API key from linear.app/settings/api. Optionally specify a team key to scope the results.
For Google Calendar: click "Connect Google Calendar" in settings. You'll authorize read-only access via Google OAuth and EverCV handles token refresh from there.
The next nightly run will pull your full history and fold it into the CV.
The goal has always been a CV that reflects what you actually did, not just what you committed. Tickets and calendar are a big part of what you actually did.