← Back to Blog
· Joshua

June 2026 — Inertia 3, Security Audit, and a Services Rethink

June was a full month. The entire portfolio got upgraded to Inertia.js 3, Jest got removed everywhere, Graveyard Jokes went through a security audit and a services overhaul, and Noteleks is still moving. Here is what actually happened.

June was a full month. No single dramatic launch — more like a sustained push across every project at once. Here is the honest account of what got done.


Inertia.js 3 — Portfolio-Wide Upgrade

The biggest technical lift of the month was upgrading every project from Inertia.js 2 to Inertia.js 3. That means Studio, Graveyard Jokes, Hollow Press, Lunar Blood, SynthVeil, The Velvet Pulse, and Velvet Radio — all of them.

Inertia 3 changes how the server-side rendering layer works, how page components are resolved, and how the app and SSR entry points are structured. Each project needed its app.tsx and ssr.tsx updated, TypeScript types adjusted for the new ComponentResolver shape, and test assertions revised because Inertia 3 encodes its JSON differently than v2 (using literal & instead of &). None of this was difficult — but doing it seven times, getting it right each time, and making sure CI passed on each is a proper day of work.

Everything is on v3 now and everything is green.


Jest Is Gone

Related to the tooling update: Jest was removed from Studio and Graveyard Jokes and replaced with Vitest. The other projects were already on Vitest from earlier in the year. This completes the migration.

Vitest shares Vite's config, so there is no separate transform pipeline to maintain. Startup is faster. The test commands are consistent across all seven projects now. The Jest-specific config files, the babel bridge, and the type declarations all got deleted. No regressions — all tests pass.


Graveyard Jokes — Services Overhaul

The Graveyard Jokes services page was restructured. Web development and design are now a single combined offering rather than two separate line items — which is how the work actually happens in practice. Social media management was repositioned as an add-on rather than a core service. Pricing was updated to reflect where I actually want to position the studio: accessible to small businesses, not enterprise-priced.

The home page was cleaned up at the same time — SEO and e-commerce references that no longer matched the service focus were removed.

These were not aesthetic changes. The old structure implied a scope that was leading to the wrong client conversations. The new structure is more honest about what the studio does.


Graveyard Jokes — Google Search Console + Shared Auth

Google Search Console is now integrated into the Graveyard Jokes admin. Search performance data — queries, impressions, click-through rates — is visible without leaving the dashboard. It is early days for the data but having it in one place matters for tracking what is actually landing in search.

The auth system was also wired up as a shared database for users and page SEO data across projects. Instead of each project managing its own user table independently, they now read from a central source. This is the kind of infrastructure change that does not look like much from the outside but makes a real difference when you are managing multiple sites.


Graveyard Jokes — Security Audit

The site went into maintenance mode briefly while I rotated all credentials and moved to per-project IAM roles on AWS. The old setup was using shared keys, which is fine until it is not. Now each project has its own scoped key, the old credentials are gone, and the maintenance mode 503 page that went up during the audit has been put away.

A handful of orphaned components — AuthSystemDemoPage.tsx and AuthSystemDemo.jsx — were removed in the same pass. They had been sitting in the codebase unused and were actually blocking builds. Gone now.


CI/CD — Packages Checkout Fix

There was a recurring CI failure across multiple projects related to how the packages monorepo was being checked out in GitHub Actions. The actions/checkout action blocks parent directory traversal, which meant projects that depend on the shared packages/ folder at the workspace root could not reach it during CI runs.

The fix was switching to an explicit git clone step for the packages directory instead of relying on the checkout action. It is a small change but it unblocked a category of CI failure that had been intermittent and annoying. All projects now use the same pattern and CI is consistently clean.


Noteleks — Tests, Spine Update, and Cleanup

Noteleks had a quieter month by design — no new mechanics, just stabilisation. The game config tests were updated to match a world height change (800px) and a player spawn position update. The Spine-Phaser animation library bumped from 4.1.55 to 4.1.56 via Dependabot and got merged. Jest was removed and the test runner now runs on Vitest alongside everything else.

The bigger note on Noteleks: the enemy art pass is still pending. Enemies are functional — they move, they collide, they deal damage — but they are still placeholder rectangles. That is the next visible milestone when I get back into active Noteleks work.


What Is Next

The portfolio is in the best shape it has been all year. CI is consistent, security posture is solid, dependencies are managed automatically via Dependabot, and every project is on current versions of its core libraries.

The next push is about visible output rather than infrastructure: getting Noteleks enemies textured, continuing to build out the Graveyard Jokes client pipeline, and writing more here. The quiet months are behind me.

— Joshua, Graveyard Jokes Studios

Stay in the loop

Get an email when a new post goes up. No spam — just new posts.