---
title: 'A Grav 2 theme: when "it works" isn''t enough'
url: 'https://www.ondrejsramek.cz/en/blog/theme-pro-grav-2-dil-2'
markdown: 'https://www.ondrejsramek.cz/en/blog/theme-pro-grav-2-dil-2.md'
lang: en
date: '2026-10-14'
description: 'How a Grav 2 theme that ran on a live site became a package you can version and check. What troubled us, what worked, and why review and automated checks moved us towards a better result.'
taxonomy:
  tag:
    - Grav
    - 'Quark 2'
    - theme
    - Claude
    - AI
    - review
    - CI
    - security
  '':
    - ''
  archives_year:
    - '2026'
---

# A Grav 2 theme: when "it works" isn't enough

**The theme was running on the site and looked finished. Then it turned out that "it works" and "it's right" are two different things.**

In the [previous part](https://www.ondrejsramek.cz/en/blog/theme-pro-grav-2) I stopped at a deployed theme. But it was still just a folder inside the site's repository. No versions, no build, no checks. Every change meant copying files by hand and hoping nothing broke.

![The Terapie domovem theme, version 1.0.47, in the Grav Admin](https://www.ondrejsramek.cz/user/pages/05.blog/theme-pro-grav-2-dil-2/theme-balicek-grav-admin.webp "The finished package in the Admin: version, description and settings.")

## From a pile of files to a package

The theme got its own repository, versions and an automated build. The finished package installs with a single command, and deploying no longer risks overwriting something my wife uploaded in the Admin. That part was quick and boring. What came next was the interesting bit.

## A review that slowed us down and made it better

I had marked the report as finished without anyone going through it. Only a separate review found things my own tests never caught: a page that could be crashed with a single bad URL, personal data left in the default settings, and Czech links hardcoded in the code. Nothing dramatic, but exactly what would pop up first on someone else's site.

While at it, we removed my wife's branding from the package so it never reaches strangers. That included rewriting the Git history and deleting the old releases. We deliberately left these irreversible steps to a human rather than trying to automate them.

## Checks that have to be able to fail

Today the theme is guarded by automation: templates, code, secrets across the whole history, and dependencies. I verified every check by deliberately introducing an error and watching whether CI failed. One test, it turned out, was passing without testing what I thought it did. And the nicest surprise: even a tool pinned to a specific version, which looks safe, had known vulnerabilities.

## An Admin that speaks your language

Forms in the administration now switch to the language of the logged-in user, and colours are set in configuration, not in code. Small things, but they turn it into something you could hand over to someone else.

## What follows from it

- **A review can't be replaced by tests I wrote myself.** Someone who asks different questions helps.
- **A test that never failed tells you nothing.** A good check has to be able to fail.
- **Verify where a human will see it.** Only the real Admin gave me certainty that the translations work.

It wasn't straightforward and we got stuck several times. But the result is a theme you can rely on more than on a folder of files, and above all a way of working that moves us towards a better output.

 [ Previous Post](https://www.ondrejsramek.cz/en/blog/plugin-pro-chatgpt-myucto) 

#### Other Related Posts:

 [ ![A ChatGPT Plugin](https://www.ondrejsramek.cz/user/pages/05.blog/plugin-pro-chatgpt-myucto/01_skill-fakturace.webp) ](https://www.ondrejsramek.cz/en/blog/plugin-pro-chatgpt-myucto) [  myucto  ](https://www.ondrejsramek.cz/en/blog/tag:myucto#blog_list) [  invoicing  ](https://www.ondrejsramek.cz/en/blog/tag:invoicing#blog_list) [  ChatGPT  ](https://www.ondrejsramek.cz/en/blog/tag:ChatGPT#blog_list) [  MCP  ](https://www.ondrejsramek.cz/en/blog/tag:MCP#blog_list) [  OAuth  ](https://www.ondrejsramek.cz/en/blog/tag:OAuth#blog_list) [  AI  ](https://www.ondrejsramek.cz/en/blog/tag:AI#blog_list) [  plugin  ](https://www.ondrejsramek.cz/en/blog/tag:plugin#blog_list) [  automation  ](https://www.ondrejsramek.cz/en/blog/tag:automation#blog_list) 

###  A ChatGPT Plugin 

[A ChatGPT Plugin](https://www.ondrejsramek.cz/en/blog/plugin-pro-chatgpt-myucto)

# A ChatGPT Plugin: Connecting MyÚčto and Invoicing

"Prepare an invoice for my client's consultation, due in seven days, and show it to me before you issue it."

That's exactly how I picture invoicing in 2026. I type one sentence, ChatGPT finds the client, reaches for the right tools and prepares t...

 7th Oct 2026 

 [ ![Ancestors in Parish Registers](https://www.ondrejsramek.cz/user/pages/05.blog/predci-v-matrikach/01_matrika-pokrtenych.webp) ](https://www.ondrejsramek.cz/en/blog/predci-v-matrikach) [  genealogy  ](https://www.ondrejsramek.cz/en/blog/tag:genealogy#blog_list) [  parish registers  ](https://www.ondrejsramek.cz/en/blog/tag:parish%20registers#blog_list) [  family tree  ](https://www.ondrejsramek.cz/en/blog/tag:family%20tree#blog_list) [  ancestors  ](https://www.ondrejsramek.cz/en/blog/tag:ancestors#blog_list) [  paleography  ](https://www.ondrejsramek.cz/en/blog/tag:paleography#blog_list) [  ChatGPT  ](https://www.ondrejsramek.cz/en/blog/tag:ChatGPT#blog_list) [  AI  ](https://www.ondrejsramek.cz/en/blog/tag:AI#blog_list) [  verification  ](https://www.ondrejsramek.cz/en/blog/tag:verification#blog_list) 

###  Ancestors in Parish Registers 

[Ancestors in Parish Registers](https://www.ondrejsramek.cz/en/blog/predci-v-matrikach)

# How to Trace Your Ancestors in Parish Registers with GPT

Searching parish registers is a peculiar discipline. At first you think all it takes is finding the right book, flipping to the right year and reading a name. Then you open your first 19th-century Protestant register and discover you can't e...

 3rd Oct 2026 

- [Intro](https://www.ondrejsramek.cz/en)
- [Projects](https://www.ondrejsramek.cz/en/projects)
- [Portfolio](https://www.ondrejsramek.cz/en/portfolio)
- [Pricing](https://www.ondrejsramek.cz/en/pricing)
- [Blog](https://www.ondrejsramek.cz/en/blog)
- English 

    - [Čeština](https://www.ondrejsramek.cz/cs/blog/theme-pro-grav-2-dil-2)

---

## Navigation

- Parent: [Blog](https://www.ondrejsramek.cz/en/blog.md)
- Next: [A ChatGPT Plugin](https://www.ondrejsramek.cz/en/blog/plugin-pro-chatgpt-myucto.md)
