Skip to content
Journai
Go back

Automated weekly Shopify dev changelog with open-source LLM

Keeping up with Shopify’s technical updates is critical for me as a developer. But I kept forgetting to check the changelog regularly, which meant missing out on relevant new features or fixes. I needed a lightweight, automated way to get this information delivered directly to my inbox on a weekly basis.

The resulting email

Here are the main constraints and requirements shaping my approach:

To solve this, I built a straightforward workflow in n8n that pulls the Shopify developer changelog page, extracts the last 7 calendar days’ entries, formats them into an HTML email, and sends it to me via Gmail. The workflow leverages the open-source GPT-OSS 20B model through OpenRouter for parsing and JSON extraction.

Thumbnail of n8n workflow showing nodes for scheduled trigger, HTTP request, prompt building, LLM call, JSON parsing, email formatting and sending

Why I used a weekly schedule trigger

I wanted to keep this automated and hands-free. Setting a schedule node in n8n to trigger every 7 days ensured the workflow runs exactly once per week, on the same weekday. This fits the natural cadence of typical Shopify platform updates and aligns well with my own review habits.

Key attributes of the schedule trigger:

Fetching the raw changelog HTML

For data acquisition, I used the n8n HTTP Request node to fetch the full changelog page HTML from https://shopify.dev/changelog. This proved straightforward since the dev changelog is publicly accessible and HTML structured.

Critical design points:

Constructing a precise extraction prompt

Here I employed a Code node to build a detailed prompt for the LLM. The prompt instructs the model to extract changelog entries published within the strictly defined last 7 calendar days (including today). Date boundaries are calculated according to the current date, not intervals in hours, avoiding edge cases.

This custom prompt:

Crafting this prompt required thinking through potential ambiguities in “last 7 days” phrasing and ensuring deterministic, reliable extraction.

Here is the prompt I used:

Extract the Shopify developer changelog entries from the provided webpage and return them as a JSON array.

## Current date

The current date is: {{CURRENT_DATE}}

## Date filtering

Include **only changelog entries published within the last 7 calendar days, inclusive of today**.

Calculate the date range as follows:

* start_date = {{CURRENT_DATE}} minus 6 calendar days
* end_date = {{CURRENT_DATE}}
* Include entries where start_date <= entry_date <= end_date
* Do not include entries older than start_date
* Do not include entries dated in the future

Do not interpret "last 7 days" as an approximate duration such as 168 hours. Use the calendar dates shown on the changelog.

## Output format

Return **only valid JSON**. Do not include Markdown, code fences, explanations, comments, or any text before or after the JSON.

The output must be a JSON array. Each changelog entry must have exactly these four fields:

[
  {
    "date": "YYYY-MM-DD",
    "title": "Changelog title",
    "link": "https://shopify.dev/...",
    "surface": "The surface of the changelog line"
  }
]

### Field requirements

* date: The publication date of the changelog, normalized to YYYY-MM-DD.
* title: The exact changelog title as displayed on the Shopify changelog page.
* link: The URL linking to the detailed changelog entry. Use the actual link from the webpage; do not construct or guess URLs.
* link: Always include the https://shopify.dev domain before the actual relative changelog path

## Extraction rules

1. Inspect all available changelog entries on the page, not just the first few.
2. Filter entries by the date range calculated above.
3. Include every entry that falls within the range.
4. Exclude every entry outside the range.
5. Preserve the changelog's displayed titles exactly.
6. Use the detail-page URL associated with each entry.
7. Keep summaries concise, preferably 1–2 sentences.
8. Do not merge multiple changelog entries into one object.
9. Do not invent missing information.
10. If there are no entries in the 7-day range, return an empty array: \`[]\`.
11. Sort the resulting entries by date descending, newest first.
12. Ensure the final response is valid, parseable JSON.

The provided webpage content is: 
{{WEBPAGE_CONTENT}}

Using the open-source GPT-OSS model via OpenRouter

Instead of a proprietary large language model, I chose the open-source GPT-OSS 20B model. OpenRouter serves as a gateway to this LLM, providing an API-compatible interface.

My rationale:

Integrating OpenRouter with n8n’s LLM Chain node made this use seamless.

Converting the LLM JSON output into actionable data

The LLM outputs a JSON string representing an array of changelog entries. To turn this into usable workflow data, I added a Code node that parses the JSON and maps each entry into individual n8n items.

This step:

Formatting the HTML email content

I opted to create a fully-built HTML email body for better readability and presentation. A Code node generates a table of changelog entries, formatting dates, titles, and surfaces with inline CSS and semantic HTML structure.

Considerations included:

This step takes the structured JSON and turns it into a professional weekly changelog digest.

Sending the email via Gmail node

Finally, I connected the workflow output to an n8n Gmail node that delivers the email to my address. Integrating with Gmail OAuth2 is straightforward in n8n and ensures secure sending.

I can also trigger the workflow manually for testing or immediate updates if needed.

Balancing simplicity and flexibility

This workflow may seem over-engineered just to fetch and email a changelog page. But using the LLM to parse HTML and extract precise updates based on calendar dates proved more reliable than brittle XPath or regex scraping. Also, by the way, the purpose of this journal is to learn and this was a good exercise!

This small automation saves me the mental overhead of remembering to check weekly updates. It also served as a good n8n practice project to blend scheduling, API calls, LLM-driven data extraction, and formatted email construction.

Looking back, this project reinforced that good automation balances simplicity in flow design with the right abstractions for tasks like natural language-based HTML parsing. It also reminds me that even modest automations can provide consistent value when thoughtfully designed around real user habits and constraints.


Share this post:

Next Post
Hugging Face pipelines powering moderation of customer reviews