Skip to content

Development improvements - #16

Merged
kenorb merged 14 commits into
masterfrom
dev
May 31, 2026
Merged

kenorb merged 14 commits into
masterfrom
dev

Conversation

@kenorb

@kenorb kenorb commented May 31, 2026 •

Copy link
Copy Markdown
Owner

Summary by Sourcery

Extend Linux setup playbook with additional apt and eget tools and introduce Proton VPN installation support.

New Features:

  • Add additional apt packages including cifs-utils, hashcat, john, mkisofs, transmission, and vlc to the default install list.
  • Enable optional installation of Proton VPN via a dedicated apt task and release toggle.
  • Extend eget-managed CLI tools with Pearl-related utilities and provide descriptive comments for each package.
  • Add an example NAS credentials file for configuration.

Enhancements:

  • Document new Proton VPN and VPN-related Ansible tags and update the Linux setup README to describe Proton VPN installation in the playbook.

Summary by CodeRabbit

  • New Features

    • Proton VPN installation now available as an optional setup component
    • Extended package library with additional utilities, security tools, and media applications
    • Added NAS credentials configuration support
  • Documentation

    • Updated setup guides with new installation options

@coderabbitai

coderabbitai Bot commented May 31, 2026 •

Copy link
Copy Markdown

Review Change Stack

Caution

Review failed

Pull request was closed or merged during review

📝 Walkthrough

Walkthrough

This PR adds Proton VPN installation capability to the Ansible dotfiles configuration, extends the package management tooling with additional utilities and tools, and introduces a NAS credentials template. The changes are modular: a new Proton VPN task file with conditional wiring, configuration variables, documentation updates, and a separate NAS support template with gitignore entry.

Changes

System Configuration Expansion

Layer / File(s) Summary
Proton VPN installation feature
\.ansible/playbooks/tasks/apt-release-protonvpn.yml, \.ansible/playbooks/setup-linux.yml, \.ansible/README.md
New Proton VPN task file downloads and installs the stable release .deb package and GNOME desktop client; playbook conditionally imports the task when apt.releases.protonvpn is enabled; README documents the new protonvpn tag and adds a "Proton VPN" step to the tasks overview.
Extended package tooling support
\.ansible/variables-example.yml, \.ansible/playbooks/tasks/eget.yml
APT package list grows to include cifs-utils, hashcat, john, mkisofs, transmission, and vlc; protonvpn flag added to the releases section; eget mappings updated with new entries for oyster, pearld, and prlctl tools; all eget package entries now include descriptive inline comments.
NAS credentials template
\.gitignore, \.nas_credentials.example
New example template file defines NAS credential fields (username, password, domain) with placeholder values; .nas_credentials added to gitignore to prevent accidental credential commits.

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

Possibly related PRs

  • kenorb/dotfiles#15: Introduces the eget task and package mapping infrastructure that this PR extends with new oyster, pearld, and prlctl package entries.
  • kenorb/dotfiles#14: Establishes the conditional APT release pattern used here to gate Proton VPN and other optional installations via apt.releases.* configuration flags.
  • kenorb/dotfiles#12: Introduces the core Ansible framework and conditional task import wiring that this PR builds upon for the Proton VPN feature.

Poem

🐰 A VPN hops through the APT tree,
With Proton's keys set freshly free,
New tools arrive—transmission, vlc—
NAS credentials hidden, safe as can be! 🔐

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 inconclusive)

Check name Status Explanation Resolution
Title check ❓ Inconclusive The title 'Development improvements' is vague and generic, using non-descriptive language that fails to convey the specific nature or primary focus of the changeset. Use a more specific title that highlights the main change, such as 'Add Proton VPN support and expand Linux automation' or 'Extend Linux setup with VPN, packages, and tooling'.
✅ Passed checks (4 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Docstring Coverage ✅ Passed No functions found in the changed files to evaluate docstring coverage. Skipping docstring coverage check.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch dev

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@sourcery-ai

sourcery-ai Bot commented May 31, 2026 •

Copy link
Copy Markdown
Contributor

Reviewer's Guide

Extends the Linux Ansible setup by enriching apt and eget package sets (including Pearl tooling), adding an optional Proton VPN APT repo + desktop client flow behind tags/variables, and introducing an example NAS credentials file, with documentation updated for the new tags and behavior.

File-Level Changes

Change Details Files
Expand default apt packages and releases to cover SMB/CIFS, security, media, and Proton VPN.
  • Add cifs-utils, hashcat, john, mkisofs, transmission, vlc and related utilities to the apt.install list with inline comments where useful
  • Enable an apt.releases.protonvpn flag in the example variables file alongside existing Brave and VS Code toggles
.ansible/variables-example.yml
Clarify and extend eget-managed binaries, especially for Pearl tooling, and wire in custom fetch options.
  • Annotate each existing eget package with a brief descriptive comment for maintainability
  • Add Pearl-related binaries (oyster, pearld, prlctl) to the eget_packages list
  • Define custom eget options for jq, oyster, pearld, prlctl, pandoc, rg, tealdeer, and vale keyed by package name, including architecture-specific selection and tag filters
.ansible/variables-example.yml
.ansible/playbooks/tasks/eget.yml
Add optional Proton VPN install flow controlled via variables/tags and document new VPN-related behavior.
  • Create a dedicated Proton VPN tasks file that downloads the Proton VPN stable-release .deb, installs the repo, and then installs the proton-vpn-gnome-desktop package with cache update
  • Import the Proton VPN tasks into the main setup-linux play, gated on apt.releases.protonvpn and tagged with apt, protonvpn, and vpn
  • Document the new protonvpn and vpn tags in the Ansible README and extend the setup-linux overview with a Proton VPN step
.ansible/playbooks/tasks/apt-release-protonvpn.yml
.ansible/playbooks/setup-linux.yml
.ansible/README.md
Introduce an example NAS credentials file for SMB/CIFS usage and ignore real credentials in Git.
  • Add a .nas_credentials.example placeholder file to demonstrate expected NAS credential structure
  • Ignore user-specific NAS credentials (and possibly other related artifacts) via .gitignore updates
.nas_credentials.example
.gitignore

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@github-actions github-actions Bot added the check-error Workflow reported errors label May 31, 2026
@kenorb

kenorb commented May 31, 2026

Copy link
Copy Markdown
Owner Author

/co Fix pre-commit formatting issues, nothing else.

@opencode-agent

Copy link
Copy Markdown
Contributor

Fixed pre-commit formatting issues by adding a missing newline at the end of .ansible/playbooks/tasks/apt-release-protonvpn.yml. Verified that all pre-commit checks (yamllint, Ansible-lint, etc.) now pass.

New%20session%20-%202026-05-31T22%3A38%3A02.028Z
opencode session  |  github run

@github-actions github-actions Bot removed the check-error Workflow reported errors label May 31, 2026
@kenorb
kenorb marked this pull request as ready for review May 31, 2026 22:40
@kenorb
kenorb merged commit 684d939 into master May 31, 2026
7 of 8 checks passed
@kenorb
kenorb deleted the dev branch May 31, 2026 22:42

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey - I've found 4 issues, and left some high level feedback:

  • The when condition for importing apt-release-protonvpn.yml is awkward and likely incorrect ((apt.releases.protonvpn | default(false)) if apt.releases is defined else false); consider simplifying to something like when: apt.releases is defined and (apt.releases.protonvpn | default(false) | bool) for clarity and correctness.
  • The Proton VPN repository .deb URL is pinned to a specific version (1.0.8) and path; consider parameterizing the version or building the URL from variables so it can be updated in one place rather than being hard-coded in the task.
  • The repeated --tag pearl-wallet-v1.0.0 -a .tar.gz --file ... --to ... pearl-research-labs/pearl arguments for the pearl-related eget packages could be consolidated via a shared variable or template to avoid duplication and make future updates less error-prone.
Prompt for AI Agents
Please address the comments from this code review:

## Overall Comments
- The `when` condition for importing `apt-release-protonvpn.yml` is awkward and likely incorrect (`(apt.releases.protonvpn | default(false)) if apt.releases is defined else false`); consider simplifying to something like `when: apt.releases is defined and (apt.releases.protonvpn | default(false) | bool)` for clarity and correctness.
- The Proton VPN repository `.deb` URL is pinned to a specific version (`1.0.8`) and path; consider parameterizing the version or building the URL from variables so it can be updated in one place rather than being hard-coded in the task.
- The repeated `--tag pearl-wallet-v1.0.0 -a .tar.gz --file ... --to ... pearl-research-labs/pearl` arguments for the pearl-related `eget` packages could be consolidated via a shared variable or template to avoid duplication and make future updates less error-prone.

## Individual Comments

### Comment 1
<location path=".ansible/playbooks/setup-linux.yml" line_range="48-52" />
<code_context>
       become: true
       tags: [apt, brave]

+    - name: Import Proton VPN installation tasks
+      ansible.builtin.import_tasks: tasks/apt-release-protonvpn.yml
+      when: (apt.releases.protonvpn | default(false)) if apt.releases is defined else false
+      become: true
+      tags: [apt, protonvpn, vpn]
</code_context>
<issue_to_address>
**suggestion:** Simplify the `when` expression to avoid the ternary and potential edge cases when `apt.releases` is missing or falsy.

The current `when` clause uses a Jinja ternary:

```yaml
(apt.releases.protonvpn | default(false)) if apt.releases is defined else false
```

A clearer and more idiomatic alternative is:

```yaml
when: apt.releases is defined and (apt.releases.protonvpn | default(false))
```

This relies on short-circuiting, keeps the logic in standard `when` form, and is easier to read and maintain.

```suggestion
    - name: Import Proton VPN installation tasks
      ansible.builtin.import_tasks: tasks/apt-release-protonvpn.yml
      when: apt.releases is defined and (apt.releases.protonvpn | default(false))
      become: true
      tags: [apt, protonvpn, vpn]
```
</issue_to_address>

### Comment 2
<location path=".ansible/playbooks/tasks/apt-release-protonvpn.yml" line_range="2-5" />
<code_context>
+---
+- name: Download Proton VPN stable release package
+  ansible.builtin.get_url:
+    url: https://repo.protonvpn.com/debian/dists/stable/main/binary-all/protonvpn-stable-release_1.0.8_all.deb
+    dest: /tmp/protonvpn-stable-release_1.0.8_all.deb
+    mode: '0644'
+
</code_context>
<issue_to_address>
**suggestion:** Consider parameterizing the Proton VPN release version and download path for maintainability.

Both the URL and `dest` hard-code `1.0.8`, so each new release will require updating this task in multiple places. Defining a variable such as `protonvpn_release_version: '1.0.8'` and reusing it in both fields would simplify upgrades and reduce mistakes. You could also consider making the download directory configurable to stay consistent with other APT bootstrap tasks.
</issue_to_address>

### Comment 3
<location path=".ansible/playbooks/tasks/eget.yml" line_range="86-89" />
<code_context>
       jq: >-
         -a {{ 'linux64' if eget_arch == 'x86_64' else 'linux-arm64' if eget_arch == 'arm64' else 'linux-arm' }}
         jqlang/jq
+      oyster: "--tag pearl-wallet-v1.0.0 -a .tar.gz --file oyster --to oyster pearl-research-labs/pearl"
       pandoc: "-a linux-{{ 'amd64' if eget_arch == 'x86_64' else 'arm64' }}.tar.gz jgm/pandoc"
+      pearld: "--tag pearl-wallet-v1.0.0 -a .tar.gz --file pearld --to pearld pearl-research-labs/pearl"
+      prlctl: "--tag pearl-wallet-v1.0.0 -a .tar.gz --file prlctl --to prlctl pearl-research-labs/pearl"
       rg: "-a {{ eget_plain_arch }}-unknown-linux-musl.tar.gz BurntSushi/ripgrep"
       tealdeer: "-a tealdeer-linux-{{ eget_arch }}-musl -a ^sha256 dbrgn/tealdeer"
</code_context>
<issue_to_address>
**suggestion:** Avoid repeating the Pearl wallet version string across multiple eget entries.

`oyster`, `pearld`, and `prlctl` all hardcode `--tag pearl-wallet-v1.0.0`, duplicating the version and increasing maintenance overhead. Please define a single variable (e.g. `pearl_wallet_version`) and interpolate it into these entries to keep the Pearl tooling version consistent and easier to update.

Suggested implementation:

```
      oyster: "--tag {{ pearl_wallet_version }} -a .tar.gz --file oyster --to oyster pearl-research-labs/pearl"

```

```
      pearld: "--tag {{ pearl_wallet_version }} -a .tar.gz --file pearld --to pearld pearl-research-labs/pearl"

```

```
      prlctl: "--tag {{ pearl_wallet_version }} -a .tar.gz --file prlctl --to prlctl pearl-research-labs/pearl"

```

Define `pearl_wallet_version` once in an appropriate variables scope so it’s available to this task, for example:
- In the same play under `vars:`:
  `pearl_wallet_version: pearl-wallet-v1.0.0`
- Or in a group/host var file used by this play.

Ensure the variable name matches exactly (`pearl_wallet_version`) and that Jinja2 interpolation is enabled for this YAML section (which is standard for Ansible task files).
</issue_to_address>

### Comment 4
<location path=".ansible/README.md" line_range="41" />
<code_context>
 | `nvidia` | Handles NVIDIA/CUDA related installations. |
+| `protonvpn` | Installs Proton VPN app from the official Proton APT repository. |
 | `upgrade` | Performs `apt upgrade` and updates `eget` packages. |
+| `vpn` | Runs VPN related tasks. |
 | `vscode` | Installs Visual Studio Code. |

</code_context>
<issue_to_address>
**nitpick (typo):** Consider hyphenating “VPN related” to “VPN-related”.

In this row, update the description to “Runs VPN-related tasks.” to match standard hyphenation and keep the table wording consistent.

```suggestion
| `vpn` | Runs VPN-related tasks. |
```
</issue_to_address>

Sourcery is free for open source - if you like our reviews please consider sharing them ✨
Help me be more useful! Please click 👍 or 👎 on each comment and I'll use the feedback to improve your reviews.

Comment on lines +48 to +52
- name: Import Proton VPN installation tasks
ansible.builtin.import_tasks: tasks/apt-release-protonvpn.yml
when: (apt.releases.protonvpn | default(false)) if apt.releases is defined else false
become: true
tags: [apt, protonvpn, vpn]

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion: Simplify the when expression to avoid the ternary and potential edge cases when apt.releases is missing or falsy.

The current when clause uses a Jinja ternary:

(apt.releases.protonvpn | default(false)) if apt.releases is defined else false

A clearer and more idiomatic alternative is:

when: apt.releases is defined and (apt.releases.protonvpn | default(false))

This relies on short-circuiting, keeps the logic in standard when form, and is easier to read and maintain.

Suggested change
- name: Import Proton VPN installation tasks
ansible.builtin.import_tasks: tasks/apt-release-protonvpn.yml
when: (apt.releases.protonvpn | default(false)) if apt.releases is defined else false
become: true
tags: [apt, protonvpn, vpn]
- name: Import Proton VPN installation tasks
ansible.builtin.import_tasks: tasks/apt-release-protonvpn.yml
when: apt.releases is defined and (apt.releases.protonvpn | default(false))
become: true
tags: [apt, protonvpn, vpn]

Comment on lines +2 to +5
- name: Download Proton VPN stable release package
ansible.builtin.get_url:
url: https://repo.protonvpn.com/debian/dists/stable/main/binary-all/protonvpn-stable-release_1.0.8_all.deb
dest: /tmp/protonvpn-stable-release_1.0.8_all.deb

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion: Consider parameterizing the Proton VPN release version and download path for maintainability.

Both the URL and dest hard-code 1.0.8, so each new release will require updating this task in multiple places. Defining a variable such as protonvpn_release_version: '1.0.8' and reusing it in both fields would simplify upgrades and reduce mistakes. You could also consider making the download directory configurable to stay consistent with other APT bootstrap tasks.

Comment on lines +86 to +89
oyster: "--tag pearl-wallet-v1.0.0 -a .tar.gz --file oyster --to oyster pearl-research-labs/pearl"
pandoc: "-a linux-{{ 'amd64' if eget_arch == 'x86_64' else 'arm64' }}.tar.gz jgm/pandoc"
pearld: "--tag pearl-wallet-v1.0.0 -a .tar.gz --file pearld --to pearld pearl-research-labs/pearl"
prlctl: "--tag pearl-wallet-v1.0.0 -a .tar.gz --file prlctl --to prlctl pearl-research-labs/pearl"

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

suggestion: Avoid repeating the Pearl wallet version string across multiple eget entries.

oyster, pearld, and prlctl all hardcode --tag pearl-wallet-v1.0.0, duplicating the version and increasing maintenance overhead. Please define a single variable (e.g. pearl_wallet_version) and interpolate it into these entries to keep the Pearl tooling version consistent and easier to update.

Suggested implementation:

      oyster: "--tag {{ pearl_wallet_version }} -a .tar.gz --file oyster --to oyster pearl-research-labs/pearl"

      pearld: "--tag {{ pearl_wallet_version }} -a .tar.gz --file pearld --to pearld pearl-research-labs/pearl"

      prlctl: "--tag {{ pearl_wallet_version }} -a .tar.gz --file prlctl --to prlctl pearl-research-labs/pearl"

Define pearl_wallet_version once in an appropriate variables scope so it’s available to this task, for example:

  • In the same play under vars::
    pearl_wallet_version: pearl-wallet-v1.0.0
  • Or in a group/host var file used by this play.

Ensure the variable name matches exactly (pearl_wallet_version) and that Jinja2 interpolation is enabled for this YAML section (which is standard for Ansible task files).

Comment thread .ansible/README.md
| `nvidia` | Handles NVIDIA/CUDA related installations. |
| `protonvpn` | Installs Proton VPN app from the official Proton APT repository. |
| `upgrade` | Performs `apt upgrade` and updates `eget` packages. |
| `vpn` | Runs VPN related tasks. |

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

nitpick (typo): Consider hyphenating “VPN related” to “VPN-related”.

In this row, update the description to “Runs VPN-related tasks.” to match standard hyphenation and keep the table wording consistent.

Suggested change
| `vpn` | Runs VPN related tasks. |
| `vpn` | Runs VPN-related tasks. |

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant