Skip to content
Upgraded my blog with assigning an issue to Github Copilot
Albert-Jan Schot
Albert-Jan Schot

· 4 min read

Post

Upgraded my blog with assigning an issue to Github Copilot

Sometimes you run into a small improvement you’ve been putting off for too long 🤷. For me that was adding proper JSON‑LD metadata to this blog. With all the AI hype happening it felt like the right time. Search engines understand your content better, and it keeps things tidy under the hood. And with access GitHub Copilot agent I figured that would be a fun little experiment!

Why JSON‑LD in the first place

If you look at modern blogs, most of them ship extra structured data. There is all kinds of schema.org types you can use to describe your content to improve SEO and rich results in search engines or social media platforms. Reading up on it is pretty straightforward, but I did not want to do it all by hand. And since I use Hugo as a static site generator, I wanted to automate it. Since JSON-LD allows you to embed structured data in a script tag, it’s easy to add it to your templates, and Hugo makes that easy with its templating system. Using the structure I am able to dynamically generate the JSON-LD based on the frontmatter of each post, and provide additional details to either blogs or events I write about.

Writing an Issue

I started by writing a clear GitHub Issue. Nothing fancy. Just the steps a developer would need:

  • Make a partial.
  • Output a JSON‑LD script tag.
  • Fill it with the usual metadata: title, date, author, image, description, URL.
  • And if it’s an event, nest an Event object under mainEntity.

So far, nothing special. Just work you could do by hand, use ChatGPT or any other AI tool for. But I wanted to see how Copilot would handle it. Finishing the issue, it looked like this:

# Add JSON-LD structured data support using BlogPosting schema with optional nested Event metadata

## Description

To improve SEO and semantic metadata on the site, we should add JSON-LD structured data to all blog posts using the `BlogPosting` schema. If a blog post includes event-related metadata (e.g. date, location), it should also include a nested `Event` schema inside the JSON-LD object.

This will help search engines better understand the content and support enhanced search features like rich snippets or event listings.

---

## Requirements

- [ ] Create a new partial template: `themes/caspar-two/layouts/partials/jsonld.html`
- [ ] Output a `<script type="application/ld+json">` block with dynamic fields populated from frontmatter
- [ ] Use `"@type": "BlogPosting"` as the top-level schema
- [ ] Include the following fields in the JSON-LD object (dynamically populated):
  - `headline`: from `.Title`
  - `author.name`: from `.Params.author` or a default fallback
  - `datePublished`: from `.Date`
  - `image`: from `.Params.image` (optional)
  - `url`: from `.Permalink`
  - `description`: from `.Description`
 - [ ] If `.type` is defined and equal to event, nest an `"Event"` object under `"mainEntity"` with the following fields:
  - `eventTitle`
  - `eventDate`
  - `endDate`
  - `eventLocation` (as a `Place` with address string)
  - `eventStatus`

---

## Example frontmatter


title: "Join Our Low-Code Hackathon in Utrecht"
date: 2025-07-01
author: "Jane Doe"
featuredImage: "/images/hackathon-banner.jpg"
summary: "Join our full-day hackathon focused on building solutions with low-code tools."
event:
  eventTitle: "Low-Code Hackathon"
  eventDate: "2025-07-10T09:00"
  eventLocation: "Utrecht Tech Hub, Utrecht, Netherlands"
  eventStatus: "https://schema.org/EventScheduled"

Assigning the Issue to Copilot

With the issue created I assigned it, Copilot reacted and spun up its own little plan. It looked at the repo, created a branch, and started suggesting the changes. There is nothing fancy about it. Just like when you work with any other developer. You give them a clear task..

Tweaking the Result

Roughly 20 minutes later Copilot’s output was almost right. Some fields didn’t match how I expected it to show up, it did pick up correct fields but missed two others. And a single naming choices felt off. So either I had to tweak the issue or the code. I opted for the latter, pulled in the branch, and made a few small changes. In total it took me maybe 10 minutes to get it perfect.

Lessons learned

And that’s the nice part: upgrading the blog was almost an afterthought. The real fun was seeing how far you can push this new workflow. Wrapping it up, this whole thing felt like a small but fun experiment for my blog. The nice part was that it was a pretty closed set of actions. You can check it, play with it a bit, and see what happens. Copilot’s output was good enough to work with, but not perfect and I didn’t expect it to be.

In the end, it saved me just that bit of extra time. The JSON‑LD schemas were still new to me, and I don’t write Hugo templates every day either. So it helps when there’s already a base to start from. And once that was in place, it turned into a simple F5 routine: refresh, see what happens, tweak two fields, and done.

Albert-Jan Schot

Albert-Jan Schot

CTO, Microsoft MVP & FastTrack Recognized Solution Architect

I am Albert-Jan Schot, CTO at Blis Digital, Microsoft MVP, and FastTrack Recognized Solution Architect focused on Microsoft 365, Azure, and AI agents. I help teams turn complex Microsoft Cloud challenges into practical architecture decisions and shipped outcomes.

Copilot Studio Microsoft 365 Agent Flows

Zuid Holland, Netherlands

Related Posts