<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Cameron Yule</title><link>https://cameronyule.com/</link><description>Recent content on Cameron Yule</description><generator>Hugo</generator><language>en-gb</language><lastBuildDate>Thu, 24 Jul 2025 13:46:14 +0100</lastBuildDate><atom:link href="https://cameronyule.com/index.xml" rel="self" type="application/rss+xml"/><item><title>LLMs for Code Reviews</title><link>https://cameronyule.com/2025/07/24/llms-for-code-reviews/</link><pubDate>Thu, 24 Jul 2025 13:46:14 +0100</pubDate><guid>https://cameronyule.com/2025/07/24/llms-for-code-reviews/</guid><description>&lt;p>I&amp;rsquo;ve been using LLMs for software development for a few months now, mostly from the command-line using tools such as &lt;a href="https://aider.chat">Aider&lt;/a>. Lately I&amp;rsquo;ve been investigating asynchronous LLM workflows, and enabled &lt;a href="https://developers.google.com/gemini-code-assist/docs/review-github-code">Gemini Code Assist for GitHub&lt;/a> which reviews pull requests for correctness, efficiency, maintainability and security.&lt;/p>
&lt;p>It&amp;rsquo;s still early days, but I&amp;rsquo;ve been impressed by the quality and usefulness of the review feedback from Gemini, particularly when working as a solo engineer. In a team environment it appears this type of tooling could catch a non-negligible number of issues as a first pass, offering additional quality control on what we&amp;rsquo;re asking our teammates to review.&lt;/p></description></item><item><title>Contributing to Nix</title><link>https://cameronyule.com/2025/07/15/contributing-to-nix/</link><pubDate>Tue, 15 Jul 2025 16:39:32 +0100</pubDate><guid>https://cameronyule.com/2025/07/15/contributing-to-nix/</guid><description>&lt;p>I recently made my &lt;a href="https://github.com/NixOS/nixpkgs/pull/410209">first contribution&lt;/a> to &lt;a href="https://github.com/NixOS/nixpkgs">Nixpkgs&lt;/a>, the package collection for &lt;a href="https://nixos.org">NixOS&lt;/a>, and wanted to document a few notes and learnings from that process. Nix is an ecosystem of tools which together enable reproducible, declarative and reliable systems. It&amp;rsquo;s comprised of a &lt;a href="https://nix.dev/manual/nix/2.28/">package manager&lt;/a> (Nix), a &lt;a href="https://nixos.org/manual/nixpkgs/stable/">packages collection&lt;/a> (Nixpkgs), a &lt;a href="https://nix.dev/manual/nix/2.28/language/index.html">functional language&lt;/a> (Nix expressions), and a &lt;a href="https://nixos.org/manual/nixos/stable/">Linux distribution&lt;/a> built using those tools (NixOS).&lt;/p>
&lt;p>Nix first caught my attention while I was researching the concept of &lt;a href="https://reproducible-builds.org">reproducible builds&lt;/a>, which enables &lt;em>verification&lt;/em> that binaries were created from a specific version of their source. While reproducible builds &lt;a href="https://reproducible-builds.org/docs/why/">offer many benefits&lt;/a>, they&amp;rsquo;re also becoming increasingly important in securing the &lt;a href="https://www.ncsc.gov.uk/collection/supply-chain-security">software supply chain&lt;/a>. Nix on its own does &lt;a href="https://luj.fr/blog/is-nixos-truly-reproducible.html">not guarantee bit-for-bit reproducibility&lt;/a>, but offers the tools to achieve it and reports on the &lt;a href="https://reproducible.nixos.org">reproducibility of NixOS&lt;/a>, which is typically &lt;a href="https://reproducible.nixos.org/nixos-iso-gnome-runtime/">above 99%&lt;/a>.&lt;/p></description></item><item><title>Linting GitHub Actions</title><link>https://cameronyule.com/2025/07/08/linting-github-actions/</link><pubDate>Tue, 08 Jul 2025 14:04:47 +0100</pubDate><guid>https://cameronyule.com/2025/07/08/linting-github-actions/</guid><description>&lt;p>I&amp;rsquo;ve recently started using &lt;a href="https://github.com/features/actions">GitHub Actions&lt;/a> – e.g., this website is &lt;a href="https://github.com/cameronyule/cameronyule.com/blob/023b5c3266dcb7d1d88cdeed0a5b9c16f0690cd8/.github/workflows/hugo.yaml">published automatically&lt;/a> to &lt;a href="https://pages.github.com">GitHub Pages&lt;/a> by an action. While they&amp;rsquo;re convenient, I&amp;rsquo;ve also read many critical articles, notably from a security perspective. A few recent examples:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://www.wiz.io/blog/github-action-tj-actions-changed-files-supply-chain-attack-cve-2025-30066">tj-actions/changed-files supply chain attack&lt;/a>
(&lt;a href="https://web.archive.org/web/20250708140447/https://www.wiz.io/blog/github-action-tj-actions-changed-files-supply-chain-attack-cve-2025-30066" class="archive">archive&lt;/a>)
&lt;/li>
&lt;li>&lt;a href="https://www.stepsecurity.io/blog/grafana-github-actions-security-incident">Grafana Security Incident&lt;/a>
(&lt;a href="https://web.archive.org/web/20250708140447/https://www.stepsecurity.io/blog/grafana-github-actions-security-incident" class="archive">archive&lt;/a>)
&lt;/li>
&lt;li>&lt;a href="https://blog.yossarian.net/2025/06/11/github-actions-policies-dumb-bypass">Bypassing action policies&lt;/a>
(&lt;a href="https://web.archive.org/web/20250708140447/https://blog.yossarian.net/2025/06/11/github-actions-policies-dumb-bypass" class="archive">archive&lt;/a>)
&lt;/li>
&lt;li>&lt;a href="https://blog.pypi.org/posts/2024-12-11-ultralytics-attack-analysis">Supply-chain attack analysis: Ultralytics&lt;/a>
(&lt;a href="https://web.archive.org/web/20250708140447/https://blog.pypi.org/posts/2024-12-11-ultralytics-attack-analysis" class="archive">archive&lt;/a>)
&lt;/li>
&lt;li>&lt;a href="https://adnanthekhan.com/2024/12/21/cacheract-the-monster-in-your-build-cache/">Cacheract: The Monster in your Build Cache&lt;/a>
(&lt;a href="https://web.archive.org/web/20250708140447/https://adnanthekhan.com/2024/12/21/cacheract-the-monster-in-your-build-cache/" class="archive">archive&lt;/a>)
&lt;/li>
&lt;li>&lt;a href="https://www.feldera.com/blog/the-pain-that-is-github-actions#:~:text=A%20security%20nightmare">The Pain That Is Github Actions&lt;/a>
(&lt;a href="https://web.archive.org/web/20250708140447/https://www.feldera.com/blog/the-pain-that-is-github-actions#:~:text=A%20security%20nightmare" class="archive">archive&lt;/a>)
&lt;/li>
&lt;li>&lt;a href="https://www.wiz.io/blog/github-actions-security-guide">How to Harden GitHub Actions: The Unofficial Guide&lt;/a>
(&lt;a href="https://web.archive.org/web/20250708140447/https://www.wiz.io/blog/github-actions-security-guide" class="archive">archive&lt;/a>)
&lt;/li>
&lt;/ul>
&lt;p>There&amp;rsquo;s clearly sharp edges we need to be mindful of when working with actions, so in addition to reading these types of articles, I also looked for tooling which could help. This led me to configure &lt;a href="https://github.com/rhysd/actionlint">actionlint&lt;/a> and &lt;a href="https://github.com/suzuki-shunsuke/pinact">pinact&lt;/a> for my projects which rely on actions.&lt;/p></description></item><item><title>LLM Structured Output</title><link>https://cameronyule.com/2025/07/04/llm-structured-output/</link><pubDate>Fri, 04 Jul 2025 15:15:57 +0100</pubDate><guid>https://cameronyule.com/2025/07/04/llm-structured-output/</guid><description>&lt;p>While integrating an LLM into a &lt;a href="https://github.com/cameronyule/bookmark-organiser">Python application&lt;/a>, I realised that their default response format of unstructured text wasn&amp;rsquo;t always practical. This led me to discover that most current models and tooling support requesting structured output, such as JSON. For example, see &lt;a href="https://ai.google.dev/gemini-api/docs/structured-output">Google Gemini structured output support&lt;/a>.&lt;/p>
&lt;p>The tool I&amp;rsquo;m using for LLM integration — the &lt;a href="https://llm.datasette.io/en/stable/python-api.html">Python API&lt;/a> of Simon Willison&amp;rsquo;s excellent &lt;a href="https://github.com/simonw/llm">llm&lt;/a> library — has support for structured output via &lt;a href="https://llm.datasette.io/en/stable/schemas.html">schemas&lt;/a>, however the &lt;a href="https://github.com/simonw/llm-mlx">llm-mlx&lt;/a> plugin I was using for local model access did not. (&lt;a href="https://github.com/ml-explore/mlx">MLX&lt;/a> is an Apple framework for running models on Apple Silicon, typically giving higher performance.)&lt;/p></description></item><item><title>About Me</title><link>https://cameronyule.com/about/</link><pubDate>Mon, 01 Jan 0001 00:00:00 +0000</pubDate><guid>https://cameronyule.com/about/</guid><description>&lt;p>Testing creating a static page (About.md)&lt;/p></description></item></channel></rss>