Agent skill

Qv Devops Daily Update

by tetherto in tetherto/qvac

Compose a daily standup in the team's Slack format (πŸ”¨ Done today / πŸ“… Planned for tomorrow / 🚧 Blockers / risks), aggregating recent PRs, reviews, and CI from tetherto/qvac.

Apache-2.0Auto-check passedProductivity & Automation

Install Qv Devops Daily Update

skills CLI
$ npx skills add tetherto/qvac --skill qv-devops-daily-update -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install tetherto/qvac qv-devops-daily-update --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/tetherto/qvac.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.agents/skills/qv-devops-daily-update .claude/skills/qv-devops-daily-update && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation Β· loads skills from .claude/skills/

Facts

Skill name
qv-devops-daily-update
GitHub stars
683
Token cost
~3k tokens
SKILL.md length
1,419 words
Files
2
Skills in repo
50
Repo updated
First seen
Licence
Apache-2.0

At a glance

Compose a daily standup in the team's Slack format (πŸ”¨ Done today / πŸ“… Planned for tomorrow / 🚧 Blockers / risks), aggregating recent PRs, reviews, and CI from tetherto/qvac.

  • Works in 9 steps: Resolve the lookback window β†’ Resolve the current user β†’ Pull recently-merged PRs (mine) β†’ …
  • Asked for a daily update
  • SKILL.md covers When to use this skill, Prerequisites, Inputs and Safety rules, plus 4 more sections
  • Calls gh and node

What it does

Qv Devops Daily Update is an agent skill from tetherto/qvac. Compose a daily standup in the team's Slack format (πŸ”¨ Done today / πŸ“… Planned for tomorrow / 🚧 Blockers / risks), aggregating recent PRs, reviews, and CI from tetherto/qvac. Use when asked for a daily update, standup, EOD, or invoking /qv-devops-daily-update.

Its SKILL.md is about 3k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files (for example `agents/openai.yaml`).

It sits in Productivity & Automation, covering Meeting notes and agendas. It works with Slack, Asana and GitHub. The repository describes itself as: Open-source local AI SDK - run AI on-device with no cloud, no API keys. Supports GGUF, RAG, image, music, and video generation, speech-to-text, P2P inference, and more… The licence is Apache-2.0.

When your agent uses it

  • Asked for a daily update
  • Invoking /qv-devops-daily-update

Example prompts

  • β€œ/qv-devops-daily-update”

Workflow steps

9 steps, taken from the step headings in SKILL.md.

  1. Resolve the lookback window
  2. Resolve the current user
  3. Pull recently-merged PRs (mine)
  4. Pull my open PRs and reviews owed
  5. Pull recent CI runs (filter to mine)
  6. (Optional) Pull today's Asana tasks
  7. Run a secret-pattern scrub on every assembled string
  8. Assemble the output
  9. Print the result

What it can do on your machine

Read from SKILL.md and the folder at commit f874b3a. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • gh
    • node

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use gh, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Qv Devops Daily Update loads about 3k tokens when it runs. Until then it costs about 71 tokens; SKILL.md has 1,419 words of instructions outside code blocks.

Always Β· name and description, kept in context so the agent knows when to use it
~71
When it runs Β· the whole SKILL.md, loaded when a task matches
~3k

Estimates: characters Γ· 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check β€” not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from tetherto/qvac at commit f874b3a, republished under its Apache-2.0 licence (Β© tetherto). 1,419 words, ~2,978 tokens.

Download SKILL.mdSave it as .claude/skills/qv-devops-daily-update/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.
name
qv-devops-daily-update
description
Compose a daily standup in the team's Slack format (πŸ”¨ Done today / πŸ“… Planned for tomorrow / 🚧 Blockers / risks), aggregating recent PRs, reviews, and CI from tetherto/qvac. Use when asked for a daily update, standup, EOD, or invoking /qv-devops-daily-update.
disable-model-invocation
true

DevOps Daily Update

Composes a standup / EOD update in the team's standard Slack format and writes it to a temp file ready to paste. Sourced from the user's GitHub activity in tetherto/qvac plus optional Asana context.

The skill is read-only with respect to GitHub state and the local working tree. It NEVER posts the message β€” the user copies it manually. The canonical Slack form is documented in Step 8.

When to use this skill

Use when:

  • User asks for a "daily update", "standup", "EOD", or "what did I do yesterday?"
  • User invokes /qv-devops-daily-update
  • User asks to draft a status post for the team channel

Prerequisites

  • gh CLI installed and authenticated (gh auth status)
  • User has access to tetherto/qvac
  • Optional: Asana MCP available β€” surfaces today's assigned tasks (degrades gracefully if not)

Inputs

  • Optional: --since <ISO date | Nd | Nw> β€” defaults to yesterday 00:00 in the user's local timezone. The default 24-hour lookback works for both EOD posts (late evening) and morning standups; extend it for Monday-after-weekend (--since 3d) or post-holiday (--since 1w).
  • Optional: --format slack | markdown β€” defaults to slack. The Slack form is what gets pasted; Markdown is the chat preview form (**bold**, [text](URL)) and is also accepted by Asana rich-text comments.
  • Optional: --no-asana β€” skip the Asana lookup even if the MCP is available.

If the user did not specify, default to yesterday 00:00 / slack.

Safety rules

This skill is read-only. It does NOT:

  • Modify the user's working tree, branch, or any file under ~/.cache/
  • Post to Slack, Asana, or GitHub
  • Write secrets to any output (the assembler runs a regex scrub before file write; see step 7)

The skill MAY write its assembled output to /tmp/devops-daily-update-<YYYY-MM-DD>.txt so the user can pbcopy < <path>. The extension is .txt (not .md) because the canonical form is Slack mrkdwn, not GitHub-flavored Markdown.

Efficiency rules

Total shell calls per run: ≀ 6 (one per data source + one for the timestamp + one to write the temp file). Cache gh api user and reuse via Read for the rest of the session. If a data source errors (e.g., Asana MCP not configured), continue with that section's items missing from the aggregate rather than failing the whole skill β€” the canonical form does not have an "Asana" section, so missing Asana data only thins out the bullet pools, not the layout.

Workflow

1. Resolve the lookback window
bash
SINCE="$(date -u -v-1d -j -f "%Y-%m-%d" "$(date -u +%Y-%m-%d)" +%Y-%m-%dT%H:%M:%SZ 2>/dev/null \
  || date -u -d 'yesterday 00:00' +%Y-%m-%dT%H:%M:%SZ)"
echo "$SINCE"

Parse --since if provided (Nd β†’ N days, Nw β†’ N weeks, ISO date β†’ that date 00:00 UTC).

2. Resolve the current user
bash
gh api user --jq '.login' > /tmp/devops-daily-update-user.txt

Reuse via Read for the rest of the run.

3. Pull recently-merged PRs (mine)
bash
gh search prs \
  --repo tetherto/qvac \
  --author "@me" \
  --merged-at ">=$SINCE" \
  --json number,title,url,closedAt \
  --limit 30 \
  > /tmp/devops-daily-update-merged.json

These feed πŸ”¨ Done today. gh search prs --json does not expose mergedAt, additions, or deletions β€” only closedAt is available, and the --merged-at ">=$SINCE" filter already guarantees the result set is merged-in-window. If size signal is needed for the bullet wording, fetch it per-PR via gh pr view <num> --json additions,deletions (one extra call per PR β€” only do this when the user asks for it).

4. Pull my open PRs and reviews owed
bash
node .agents/skills/_lib/pr-skills/pr-status.mjs --mode my \
  > /tmp/devops-daily-update-my.txt 2> /tmp/devops-daily-update-my.stderr
gh search prs \
  --repo tetherto/qvac \
  --review-requested "@me" \
  --state open \
  --json number,title,url,author,updatedAt \
  --limit 30 \
  > /tmp/devops-daily-update-reviews-owed.json

If pr-status.mjs stderr contains SLACK_VALIDATION_REQUIRED, follow the validation gate in pr-mine's workflow (step 2). Do not present the daily update until the gate clears.

Output routing:

  • Open PRs I authored that received commits since $SINCE (i.e., I pushed work on them today) β†’ πŸ”¨ Done today with the action addressed comments on the PR (when the recent commits follow a review event) or pushed updates on <topic> (otherwise).
  • Open PRs I authored without recent commits β†’ πŸ“… Planned for tomorrow with the action continue / wrap up <topic>.
  • Reviews owed (--review-requested "@me") β†’ πŸ“… Planned for tomorrow as review #<num> β€” <title> by <author>. Cap surfaced reviews at 5 (sorted by updatedAt desc β€” most recent first); if the queue is longer, append a single line (+N more review requests in queue β€” run /qv-devops-pr-status for the full list). A standup with 30 review-bullets is unreadable.
  • Open PRs I authored with mergeable: CONFLICTING β†’ 🚧 Blockers / risks as conflicts on #<num> β€” needs rebase.
  • Open PRs I authored with stale review requests (no review activity in >3 days) β†’ 🚧 Blockers / risks as stale review on #<num> β€” pinged <reviewer> on <date>.
5. Pull recent CI runs (filter to mine)

gh run list does not have an author filter. Approximate the user's runs by scoping to recent PR head branches:

bash
gh run list \
  --repo tetherto/qvac \
  --created ">=$SINCE" \
  --limit 50 \
  --json conclusion,event,headBranch,name,url,workflowName,headSha,displayTitle \
  > /tmp/devops-daily-update-runs.json

Filter client-side: keep runs where headBranch matches one of the user's PRs from steps 3 or 4. Failed runs feed 🚧 Blockers / risks as CI failing on #<num> β€” <workflowName>. In-progress / queued runs are NOT surfaced (too noisy for a daily update).

6. (Optional) Pull today's Asana tasks

If the Asana MCP is available and --no-asana was not passed, call the appropriate tool (read the descriptor first per the agentic-automation rule) to fetch the user's tasks. Filter to:

  • Status = in-progress or due today/tomorrow β†’ feed πŸ“… Planned for tomorrow as <TICKET>: <task title>
  • Status = blocked β†’ feed 🚧 Blockers / risks as <TICKET>: blocked β€” <reason from notes>

Asana tickets in the QVAC project follow the QVAC-\d+ format and slot directly into the bullet shape.

If Asana is unavailable or --no-asana is set, skip this step. The output will rely on GitHub-derived items only.

Show full SKILL.md (595 more words)Show less
7. Run a secret-pattern scrub on every assembled string

Before writing /tmp/devops-daily-update-<YYYY-MM-DD>.txt, run a regex check on every PR title, branch name, run name, Asana task title, and any user-provided extras:

(sk_live_|AIza[0-9A-Za-z\-_]{35}|AKIA[0-9A-Z]{16}|ghp_[A-Za-z0-9]{36}|gho_|github_pat_|xoxb-|-----BEGIN [A-Z ]+ KEY-----)

If any string matches, redact the matching span ([REDACTED]) and add a chat-only note: "Daily update redacted N suspicious tokens β€” review the source PRs/runs manually." Never include the raw matched string anywhere in the output, the chat preview, or the temp file.

8. Assemble the output

Build the message in two forms:

  • Slack form (the canonical, matches the team template), saved to /tmp/devops-daily-update-<YYYY-MM-DD>.txt.
  • Markdown form (for chat preview only), printed in chat.

Each item from steps 3–6 must be normalized to a TICKET: action bullet. Ticket extraction rules:

  1. Extract QVAC-\d+ (or [A-Z]+-\d+) from the PR title; that's the ticket.
  2. If the PR title has no ticket, extract from the head branch name (e.g., feat/QVAC-12345-thing).
  3. If still no ticket, fall back to #<pr-number> as the leading label.
  4. The action is the PR-title subject (the part after prefix[tags]:), past tense for Done today, action-verb-leading for Planned for tomorrow. Drop the prefix[tags]: from the rendered action.
  5. Sub-bullets are added when (a) the user provided extra context for that item, or (b) more than one PR shares the same ticket β€” the parent line is the ticket, sub-bullets are each PR.
Slack form (canonical)
πŸ”¨ *Done today*
- <TICKET-or-#num>: <past-tense action>
- ...
    - <optional sub-bullet>

πŸ“… *Planned for tomorrow*
- <TICKET-or-#num>: <forward-looking action>
- ...

🚧 *Blockers / risks*
- N/A

Empty section β†’ single bullet - N/A (literal). Three sections always rendered, in this order, separated by a single blank line. Bare ticket bullets (- QVAC-13860 with no : and no action) are allowed when the work is self-evident from the ticket title.

Markdown form (chat preview only)
**πŸ”¨ Done today**
- <TICKET-or-#num>: <past-tense action>
- ...

**πŸ“… Planned for tomorrow**
- <TICKET-or-#num>: <forward-looking action>
- ...

**🚧 Blockers / risks**
- N/A

(Same content, GitHub-flavored Markdown rendering for the chat preview only.)

Format-conversion cheatsheet

If the user requested --format markdown, save the Markdown form to the temp file too. Conversion rules between the two forms:

MarkdownSlack
**X***X*
*X* (italic)_X_
[text](URL)<URL|text>
# H1 / ## H2not used (use Slack-bold instead)
Plain QVAC-\d+Plain QVAC-\d+ (the workspace's Slack/Asana integration auto-links)
4-space-indented - sub4-space-indented - sub (Slack respects 4-space indent for sub-bullets)

Do NOT pre-link ticket numbers via <URL|TICKET> β€” the workspace's Asana app handles auto-linking. Pre-linking conflicts with that and renders awkwardly.

9. Print the result
  1. Print the Markdown form in a fenced code block in chat for the user to scan.

  2. Print the path to the Slack-form temp file with copy commands:

    bash
    pbcopy < /tmp/devops-daily-update-<YYYY-MM-DD>.txt   # macOS
    xclip -selection clipboard < /tmp/devops-daily-update-<YYYY-MM-DD>.txt   # Linux
  3. Offer: "Edit any line before posting? Tell me which ticket and the new action wording, and I'll regenerate."

Quality Checklist

Before printing the output, verify:

  • Three sections rendered, in order: πŸ”¨ Done today / πŸ“… Planned for tomorrow / 🚧 Blockers / risks
  • Section headings use the exact emoji and the exact section names from the canonical template
  • Empty sections render as a single - N/A bullet (never _(none)_, never empty, never removed)
  • Every bullet leads with TICKET: (or #<pr-num>: only when no ticket could be extracted)
  • No bullet prefixes, no severity tags, no PR-state tags ([needs-review], [ready], etc.) β€” that meta is folded into prose actions
  • Each Done today item is genuinely activity since $SINCE (merged PR, pushed commits, etc. β€” not stale)
  • Each Planned for tomorrow β†’ review item is open and the user is in requestedReviewers
  • Each Blockers / risks β†’ CI failing item is on a PR the user authored or a branch they own
  • No raw secret-shaped strings made it through the scrub
  • Slack form has no Markdown headings, no **bold** (uses *bold*), no GitHub-style links
  • Temp-file path matches the day's local-tz ISO date

References

Β© tetherto, Apache-2.0. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 1 other file in .agents/skills/qv-devops-daily-update of tetherto/qvac.

  • SKILL.md
  • agents/openai.yaml

Open the folder on GitHubat commit f874b3a

Compare with similar skills

Qv Devops Daily Update next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; β€œused in” counts other GitHub owners with a copy.

Qv Devops Daily Update compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Qv Devops Daily Update this skilltetherto/qvac683β€”~3kAutomated safety check: PassApache-2.0
Kill The StandupVarnan-Tech/opendirectory674β€”~1.3kAutomated safety check: NotesMIT
Openloomi Connectorsmelandlabs/openloomi1kβ€”~3.3kAutomated safety check: PassApache-2.0
Granola CI Integrationjeremylongshore/tons-of-skills-marketplace2.8kβ€”~1.9kAutomated safety check: PassMIT
Connect Apps with ComposioComposioHQ/awesome-claude-skills77k3 repos~557Automated safety check: PassNone
Superset Automatesuperset-sh/superset15kβ€”~1.4kAutomated safety check: PassCustom licence

Similar skills

  • Kill The Standup

    Varnan-Tech/opendirectory

    Reads yesterday's Linear issues and GitHub commits for the authenticated user, formats a standup update (done / doing / blockers), and posts it to Slack.

    674 GitHub stars~1.3k tokensUpdated 1 mo ago
    Productivity & AutomationAuto-check: notes
  • Openloomi Connectors

    melandlabs/openloomi

    openloomi Connectors tools - manage the native 7 messaging integrations and pair with the composio skill for the 1000+ apps OAuth layer (Slack, Discord, X, Gmail, Outlook, Google…

    1k GitHub stars~3.3k tokensUpdated 15 days ago
    Productivity & AutomationAuto-check passed
  • Granola CI Integration

    jeremylongshore/tons-of-skills-marketplace

    Build automated pipelines from Granola meeting notes to GitHub Issues, Linear tasks, Slack notifications, and documentation updates using Zapier and GitHub Actions.

    2.8k GitHub stars~1.9k tokensUpdated today
    Productivity & AutomationAuto-check passed
  • Connect Apps with Composio

    ComposioHQ/awesome-claude-skills

    Connects an agent to 1000+ external apps through the Composio Tool Router plugin, so it can actually send emails, create issues and post messages instead of only drafting them.

    77k GitHub starsUsed in 3 repos~557 tokens
    Productivity & AutomationAuto-check passed
  • Superset Automate

    superset-sh/superset

    Turns a recurring chore into a scheduled or event-triggered Superset agent, drafting its prompt, picking a target and trigger, and reviewing the first run.

    15k GitHub stars~1.4k tokensUpdated today
    Productivity & AutomationAuto-check passed
  • Claap Weekly Recap

    Othmane-Khadri/YALC-the-GTM-operating-system

    Turns a week of Claap-recorded sales calls into action items and focus blocks on a Notion Kanban, delivered with a Slack summary.

    317 GitHub stars~5.4k tokensUpdated 1 mo ago
    Productivity & AutomationAuto-check passed

More from tetherto/qvac

All 50 skills in this repo
  • Creates a Solutions page in the QVAC documentation website from a real use case, generalizing the case into reusable guidance and registering the page in the site navigation.

    683 GitHub stars~2.8k tokensUpdated today
    Auto-check passed
  • Qv Docs Update

    tetherto/qvac

    Updates the docs website after a change to the SDK or CLI. An agent skill from tetherto/qvac.

    683 GitHub stars~11k tokensUpdated today
    Auto-check passed
  • Qv Agent Stack Sync

    tetherto/qvac

    Plan and prepare the QVAC agent-stack release cascade across @qvac/inference, @qvac/sdk, @qvac/cli, @qvac/ai-sdk-provider, @qvac/opencode-plugin, and @qvac/openclaw-plugin.

    683 GitHub stars~2k tokensUpdated today
    Auto-check passed
  • Run the deterministic code-quality audit, turn related findings into contextual remediation groups, prepare approval-gated Asana proposals, reconcile recurring runs, or configure twice-monthly…

    683 GitHub stars~1.6k tokensUpdated today
    Auto-check passed
  • Review C++ changes for string parameter and call-site efficiency conventions (std::stringview, std::string&&, const std::string&, const char, and TransparentStringMap lookup).

    683 GitHub stars~702 tokensUpdated today
    Auto-check passed
  • Qv Addon Changelog

    tetherto/qvac

    Generate changelog entries for a target add-on package. An agent skill from tetherto/qvac.

    683 GitHub stars~1.7k tokensUpdated today
    Auto-check passed

Questions about Qv Devops Daily Update

What does Qv Devops Daily Update do?

Compose a daily standup in the team's Slack format (πŸ”¨ Done today / πŸ“… Planned for tomorrow / 🚧 Blockers / risks), aggregating recent PRs, reviews, and CI from tetherto/qvac. Qv Devops Daily Update is an agent skill from tetherto/qvac. Compose a daily standup in the team's Slack format (πŸ”¨ Done today / πŸ“… Planned for tomorrow / 🚧 Blockers / risks), aggregating recent PRs, reviews, and CI from tetherto/qvac.

When should I use Qv Devops Daily Update?

Qv Devops Daily Update fits situations like: asked for a daily update; invoking /qv-devops-daily-update.

How do I install Qv Devops Daily Update in Claude Code?

Run `npx skills add tetherto/qvac --skill qv-devops-daily-update -a claude-code`. Or copy the skill folder (.agents/skills/qv-devops-daily-update in tetherto/qvac) into .claude/skills/qv-devops-daily-update in your project. Claude Code loads it when a task matches its description.

How do I install Qv Devops Daily Update in Codex?

Run `npx skills add tetherto/qvac --skill qv-devops-daily-update -a codex`. Or copy the skill folder (.agents/skills/qv-devops-daily-update in tetherto/qvac) into .agents/skills/qv-devops-daily-update in your project. Codex loads it when a task matches its description.

Can I use Qv Devops Daily Update in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add tetherto/qvac --skill qv-devops-daily-update -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/qv-devops-daily-update, .gemini/skills/qv-devops-daily-update, .github/skills/qv-devops-daily-update and .opencode/skills/qv-devops-daily-update in your project.

What does Qv Devops Daily Update need to run?

Going by SKILL.md and its folder, Qv Devops Daily Update needs the command-line tools its instructions call (gh and node).

Does Qv Devops Daily Update access the network?

SKILL.md contains no URLs. Its commands use gh, which can reach the network depending on how they are called. This is read from the text; nothing was executed.

Is Qv Devops Daily Update safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Qv Devops Daily Update use?

Qv Devops Daily Update is published under the Apache-2.0 licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Qv Devops Daily Update use?

About 3k tokens (SKILL.md is roughly 12k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Qv Devops Daily Update?

Skills that share tags, products or a category with Qv Devops Daily Update: Kill The Standup (Varnan-Tech/opendirectory, 674 stars), Openloomi Connectors (melandlabs/openloomi, 1k stars), Granola CI Integration (jeremylongshore/tons-of-skills-marketplace, 2.8k stars) and Connect Apps with Composio (ComposioHQ/awesome-claude-skills, 77k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Qv Devops Daily Update?

tetherto (a GitHub organization) maintains it in tetherto/qvac, which has 683 GitHub stars. The repository holds 50 skills in this directory. The repository was last updated on October 9, 2026.

Source: tetherto/qvac on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.