
The site you are on.
I wanted one place for who I am, what I’ve built and what I’m thinking about, without a CMS I’d have to babysit. So the content lives where I already write: Anytype. This page, like every page on the site, is an Anytype object.
The idea
Pezhvak means echo. The site is built around that: a console-style interface where everything answers you back. The mark sends out its echo arcs when you arrive and with every UI sound, the avatar reacts to what you do, and the backgrounds follow your cursor, your scrolling and the tilt of your phone.

How it publishes
There is no admin panel. Writing happens in Anytype, on any of my devices, and publishing is one checkbox.
- I write a Post in Anytype and pick its Section: Projects, Businesses, Gallery or the Digital garden.
- Ticking Publish makes it a candidate. A sync job running on my own Kubernetes cluster reads the space through Anytype’s API every few minutes.
- Each published object becomes a Markdown file with its properties as frontmatter. Covers, icons, images and attachments are downloaded next to it, and the result is committed to the repo through the GitLab API.
- The commit triggers a pipeline that builds the site with Bun and Astro and rolls out a new nginx image. A minute or two later it is live.
Unticking Publish takes a page down the same way. The sync carries callouts (with their colour and icon), code blocks, tables, Mermaid diagrams, and Anytype’s own cover and icon, so a note looks like itself on the site.

Driven by the keyboard
The interface reads like a terminal. Sections are numbered tabs, the breadcrumb is a shell prompt (~/ pezhvak / garden), and nearly everything has a key: / searches, H goes home, Q and E switch shelves, Enter starts reading, Esc steps back. Search is a command palette over every page on the site, and it hides a few commands of its own: try sudo moves.

The avatar
The home page has a 3D version of me in a VR headset, built with three.js. I adjusted the model by hand in Blender: the nose and chin are my own sculpt, and the earrings are placed where mine are. He follows your cursor (or your phone’s tilt), looks down when you scroll toward the shelves, and has a small repertoire: a wave, a nod, a shrug, a bow, a namaste after you’ve read About, a dance. Lighting reveals are picked at random each visit and end in eye contact.
Backgrounds
One of four backgrounds is picked per visit: dots, echo contours, signal lines and ink. Each reacts to keyboard focus, scrolling and phone tilt, rising into a hill or peak under whatever you’re looking at.

Built for phones too
On a phone the shelves become cards, the menu turns into a section pill with a sheet, and the avatar sits above the intro.

Under the hood
- Astro, fully static. Pages, the share card, the RSS feed, the sitemap, the favicons and the iOS icon are all generated at build time.
- three.js for the avatar and the scene; plain TypeScript for everything else, with no UI framework.
- Anytype’s JSON API for content, through a zero-dependency sync script that runs on Bun or Node.
- GitLab CI and a Kubernetes cluster for builds and hosting, behind Cloudflare. Every push to the main branch goes live, including the content commits the sync makes.
- Details: a custom cursor that wraps whatever you can click, UI sounds, a reading-progress bar, an outline beside long entries, highlighted code with a copy button, a full-screen diagram viewer with zoom and pan, and SEO basics (JSON-LD, sitemap, share images).

