I build reading and publishing platforms — and everything they stand on: the schema, the backend, the reader UI, the deploy pipeline, and the panel the operator actually logs into.
The same product, built properly on three different stacks, because each one earns its place:
- Elixir · Erlang/OTP · Phoenix LiveView — when the product is live: streaming logs, real-time metrics, presence, long-running supervised work.
- PHP · Laravel · WordPress — when it has to land on someone else's hosting today, with an admin panel and an editorial workflow that non-developers can run.
- TypeScript · Next.js — when it has to be fast, SEO-visible and carry a rich editor.
Everything ships bilingual or trilingual (RU / EN / PT-BR), documented, with screenshots in the repo.
| BEAM |
|
| PHP |
|
| Web |
|
| Data |
|
| Infra |
|
Erlang/OTP & Phoenix — what I actually use it for
- Supervision trees instead of retry loops: let the process crash, let its parent restore the invariant.
GenServer,DynamicSupervisor,Task.Supervisor,Registryfor per-server and per-job state.- ETS as a working tool, not a curiosity — ring buffers for live metrics, rate limiting, hot caches.
- LiveView for everything that streams:
journalctltail, deploy logs, CPU/RAM charts, presence. - Oban for background work — queues, retries, uniqueness, cron — backed by Postgres, no Redis.
- OTP introspection in production: schedulers, memory by type, process/port/atom counts, the
supervision tree itself,
:rpcinto a remote console on a live node. - Clustering with
dns_cluster, telemetry pipelines,Banditas the HTTP server. - Shipped as OTP releases under
systemd, with health checks and automatic rollback.
Laravel & WordPress
- Laravel 12 on PHP 8.2+: Eloquent, policies, queues, form requests, a real service layer, Blade + Livewire.
- Filament 3 admin panels;
spatie/laravel-permissionfor roles, permissions and staff scopes. - Money paths done carefully: purchases, subscriptions, donations, payouts and withdrawals on a ledger, not on a balance column.
- Media and formats: Intervention Image, Flysystem to S3, DOCX/EPUB/FB2 import and export.
- WordPress as a platform, not a blog: custom post types, taxonomies,
WP_Querytuning, roles and capabilities, REST endpoints, i18n — and themes that install by upload, with zero npm and no build step.
Next.js & the front end
- Next.js 16 / React 19: App Router, server components, route handlers, streaming, middleware.
- Auth without a vendor:
argon2+iron-session, device/session tracking, e-mail confirmation flows. - Prisma over PostgreSQL,
zodat every boundary, S3 presigned uploads, MaxMind GeoIP for territory rules, TipTap editors, Radix UI + Tailwind design systems. - Readers built for people who read for hours: multiple themes, persisted typography, text-to-speech, glossary popovers, keyboard navigation and no layout shift.
Databases
- PostgreSQL by default: schema design, migrations, composite and partial indexes, full-text search, JSONB where it earns its place, and job queues that live in the database.
- MySQL / MariaDB wherever WordPress lives — including the query plans behind large catalogues.
- SQLite for single-node and demo installs; Redis for cache and sessions when it pays for itself.
- Schemas at real scale: 118 Prisma models on one platform, 89 migrations and 52 Eloquent models on another.
- Three ORMs, one habit — read the generated SQL. Ecto, Eloquent and Prisma each hide a different N+1.
| Project | What it is | Stack |
|---|---|---|
| BEAM Control Panel | Self-hosted control panel for Linux servers with first-class BEAM support: an SSH-reachable fleet, live metrics, an 11-step deploy pipeline with automatic rollback, OTP introspection, clean-Ubuntu provisioning, TOTP + RBAC + full audit trail. | Elixir LiveView Postgres ETS |
| XI Novels / XI Aurora ⭐ | Free GPL WordPress theme that turns a plain install into a light-novel platform: catalogue, full-screen reader with glossary and text-to-speech, EPUB/FB2 export, rankings, front-end author studio, on-site control panel, bulk import. No npm, no build step. RU/EN/PT-BR. | PHP WordPress MySQL |
| Shiori | Reading platform for web novels built on the BEAM — reader, ingest pipeline and translation studio. Design and prototyping phase; source drop in 2027. | Elixir Phoenix Postgres |
| Craftlane | Project-first freelance marketplace: scoped projects, contracts, milestones, secured payments, real-time messaging, reputation earned from delivered work. | Elixir LiveView Postgres |
| ER.IIIBA | Full novel-publishing platform — author studio, chapter reader, forum, reviews, monetisation, moderation. Archived source of a site that ran in production. | Laravel 12 Filament Livewire |
| longhand-blog | A writing blog and the dependency-free static site generator that builds it. Markdown in, static HTML out, published by GitHub Actions on every push. | Node.js Zero deps |
| novel-reader-ui | HTML design kit for serialised fiction: library, series page and a chapter reader with three themes and persisted type settings. | HTML CSS JS |
| Project | Scale | Stack |
|---|---|---|
| Solomonster — the platform in full: translation teams with revenue shares, a ledger for purchases, subscriptions, promo campaigns and payouts, a forum, events and achievements, moderation queues, support desk, GeoIP territory rules and an import pipeline. | 118 database models · 257 API endpoints · 141 pages | Next.js 16 React 19 Prisma Postgres |
| XI Community (Laravel) — the same product with an editorial back office non-developers can run. | 52 models · 89 migrations · 26 Filament resources · 133 Blade views | Laravel 12 Filament 3 Postgres |
| baxi.community — the BEAM rewrite: LiveView front to back, Oban jobs, Floki-based importers, magic-link auth, ETS rate limiting. | Phoenix 1.8 · LiveView 1.2 | Elixir Phoenix Postgres |
| Work-order registry — a Phoenix LiveView app replacing a shared Google Sheets workbook, with the roles and audit trail a spreadsheet never had. | Internal tool, in production use | Elixir LiveView Postgres |
Ship the product, not a layer. Schema, backend, UI, deploy and the operator's panel are one job.
No build step where none is needed. A WordPress theme should install by upload, not by
npm ci.Let Postgres do Postgres things. Queues, search and locks before another moving part.
Supervise, don't retry. If a process can fail, give it a parent that knows what to do about it.
Money goes on a ledger. Never on a balance column.
Bilingual from commit one. RU / EN / PT-BR, not a translation sprint later.
The repo is the documentation. Screenshots, plans, and a README that answers "what does it do".