End of May — Projects, Routing, and the Batch
A clean close to May: Hollow Press got a full Projects section with search and filtering, three projects got their Ziggy routing fixed, the Graveyard Jokes social batch for the rest of the month is seeded, and SynthVeil's admin tests are passing.
Four weeks of consistent updates. That is what May ended up being. After "Still Here" — which was less an update and more an honest acknowledgment that things had gone quiet — the rhythm came back and held. This is the close of that run.
Hollow Press — Projects Section
Hollow Press now has a Projects section at /projects. It is a proper portfolio listing — not a static page, but a queryable index backed by a new projects table.
The schema covers what a portfolio entry needs: title, slug, a summary capped at 500 characters for listing cards, a longer description for the detail page, a status enum (active, completed, archived), a year, a JSON tags column, cover_image, project_url, and an is_featured flag. Featured projects sort before everything else.
The index controller handles search and filtering. The search runs a case-insensitive LIKE across title, summary, and description simultaneously — so a search for "Laravel" will surface anything relevant regardless of where the word appears. Status, tag, and year can be combined freely. Results paginate at 12 per page with query strings preserved, so filters survive pagination clicks.
Filter options — the unique tag list and available years — are computed once and cached for ten minutes. On a small-to-medium portfolio they would barely need caching, but the pattern is right: the controller does not re-query the database on every request for data that changes infrequently.
Two React pages were built alongside the controller. The index shows cards with cover images, status badges, and tag chips that act as filter shortcuts — clicking a tag reloads the page with that tag applied. The show page has a sidebar with structured metadata (status, year, tags, external URL) next to the main content area.
Cross-Project — Ziggy Routing
Ziggy is the package that serialises Laravel's named routes into a JavaScript object so that Inertia's route() helper works on the frontend. Without it, any route('some.route') call in a React component either errors or silently returns an empty string.
Three projects — Lunar Blood, The Velvet Pulse, and Velvet Radio — were missing ziggy-js from their npm dependencies. The PHP side (the Ziggy composer package and the @routes Blade directive) was in place, but the npm package was absent. The fix was straightforward: added ziggy-js to each project's package.json, updated the relevant TypeScript configs, and verified the builds. All three compile clean.
Graveyard Jokes — Social Media Batch
The scheduler fix from Week Four — the one that stopped Facebook from receiving the same post two or three times — set the stage for this. With the dispatch logic correct, it was worth seeding a proper content batch.
Twenty posts were seeded covering May 26 through 30: four per day across Facebook, Discord, Twitter/X, and Instagram. The content themes step through the week deliberately. The first day promotes the Week Four blog content. The middle days shift to the services pitch — web development, digital marketing, portfolio work. The end of the week closes with pricing and a direct call to action. All posts are set to pending and will be picked up by the scheduler as their scheduled times arrive.
SynthVeil — Admin Test Fix
A PHPUnit feature test covering the SynthVeil admin dashboard was failing on every run. The test was hitting an auth-protected route without establishing an authenticated session first. The route correctly returned a redirect, the test saw something other than 200, and it failed.
The fix was adding actingAs() with an admin-role user before the request. The test now passes, and the suite is clean.
The Month as a Whole
May started slowly. "Still Here" was about naming that honestly and committing to a different pace from that point. What followed was four consecutive weeks of output — Velvet Radio live, Lunar Blood's mail system, Noteleks' spear animation, the RSS feed, the social dispatch fix, and now these. That is a decent run.
The goal next month is the same: weekly, no gaps.
If you are looking for web development, design, or digital marketing — Graveyard Jokes Studios has the services and the portfolio. Reach out.
— Joshua, Graveyard Jokes Studios