Products
-
Education SaaS
Multi-tenant education CRM, in production with a paying customer.
Course management and lead-operations across education tenants; ready to take on additional customers. Stack: PHP 8.4 / Symfony 7.4 LTS / Doctrine 3 / PostgreSQL 16 / Redis 7 backend; Twig + Stimulus + Turbo + Tailwind front-end; Vitest + PHPUnit + Playwright on tests. Hexagonal modular monolith with full CQRS at the UseCase layer, async events via Symfony Messenger, 13 business modules.
-
OMS / backoffice
In progress.
I have just started this custom software project. The screen below is a design preview using made-up fixture data.
How quality gets enforced
Every PR has to pass the enforcement layers below before it can merge; each runs independently in CI. Behind them sit over 11,000 automated tests (PHP and JS unit), green as of 2026-09-12; the Playwright end-to-end suite is excluded from that figure because it does not run in CI.
- PHPStan 2 at level 8 — plus 14 project-specific custom rules:
entity-ID safety, tenant query safety (blocks direct
EntityManager/Connectionaccess outside repositories), and ADR-shape rules for the Action / UseCase / QueryAdapter / Port catalog. The CQRS seam is enforced at this layer. - PHPMD — hexagonal-tuned ruleset for code smells; complements PHPStan on style and maintainability fronts that static analysis doesn't cover.
- Deptrac on two axes — layer purity (Domain → Application → Infrastructure, with vendor imports gated by layer) and a module dependency graph across 13 business modules. The module-graph baseline is shrink-only: an entry can be removed, never added, so a new cross-module dependency fails the build rather than being absorbed.
- Custom Twig/Tailwind lint script — 7 project rules expressing UI
conventions that off-the-shelf linters can't: component-only
<twig:Button>(no raw<button>in pages), semantic-token-only Tailwind (no literal grays), requireddata-componentattributes, no manualdark:variants in components, ADR-tied destructive-action wrapping, and target-naming in confirmation modals. Managed baseline for staged migration with stale-entry detection.
Each layer runs independently; the baseline pattern lets new code raise the bar without requiring full migration of legacy code first.
Personal tools
-
Pipeforge
Claude Code orchestration plugin and PostgreSQL MCP backend.
I built it because I needed to coordinate work across multiple machines and parallel worktrees, and it turned into where I try out context-engineering patterns before they land on production work. Pipeline orchestration with templated commands, agent dispatch, skill-based prompts, and an MCP-backed tool layer over a PostgreSQL state store, plus a curated knowledge base of decisions about Pipeforge itself. Not a product, just infrastructure I use daily.
mini-deliver run, 2026-09-04 — a deliberately reduced slice of the full
/deliver orchestration, for lower-risk work that does not need the whole
gate stack. Seven tasks on ProfitOfExile, each landing with its commit and its review
rounds. It ran unattended and stopped at the merge boundary: commits on local main,
tree clean, nothing pushed.
Side projects
-
ProfitOfExile
Open-source Path of Exile lab-farming tool.
Built solo across Go / SvelteKit / Tauri (Rust) / TimescaleDB: backend, web, desktop overlay. Web continuously deployed; the desktop overlay went from cold start to usable release in ~2 weeks (v0.1.0 on 2026-03-31 → v0.6.x on 2026-04-13), and I've kept developing it since. A single Go backend feeds both the web (zero-install SvelteKit) and the Rust/Tauri desktop with OCR and in-game overlays. One source of truth, two delivery surfaces. Adopted by the broader community after creator coverage.
-
Milisto
Personal mobile PWA shopping companion · not publicly released.
Shopping lists follow shop layout instead of entry order, updates arrive live through Mercure, and recipe ingredients can be added to a selected list with merge confirmation when needed.
-
Pomodoro
Visual sequence timer for cooking and focus sessions.
The countdown uses a fixed 60-minute dial: each minute is six degrees, so 15 minutes fills a quarter-circle. Steps can be arranged into a sequence and shared by URL.
Contributions
-
Anthropic Claude Code tracker
Reproducible finding contributed to an open issue in the official tracker.
I isolated a compact-vs-clear instruction-override asymmetry in SessionStart hook behavior, with a minimal reproduction, the mechanism, and a suggested fix.
-
Open-source contributions
Recurring contributor to community tooling.
veiset/poe-vendor-string(Path of Exile community tool): recurring contributor across map mod filtering (prefix/suffix grouping), trade-search integration (map yield, quality, 8-mod filter, corrupted include/exclude, instant buyout default), and bug fixes.obra/superpowers: I proposed smart question batching, with a measured reduction inAskUserQuestioncalls.