I just finished creating the slide deck for the first lecture of my course EOSP using slidev. I also made minor updates to the curriculum. The lecture introduces students to open source development, covering key concepts, practical exercises with GitHub, and building a library, CLI, and Telegram bot to analyze developer contributions. It also explains GitHub API usage, limitations, GraphQL, and the full GitHub Flow from issues to pull requests, code review, and merging into the main branch.
The slides are available as a PDF and can be viewed online (but I'll set it up tomorrow). This deck will serve as the foundation for the first lecture, combining conceptual understanding with hands-on exercises to give students a solid start of course.
The slides are available as a PDF and can be viewed online (but I'll set it up tomorrow). This deck will serve as the foundation for the first lecture, combining conceptual understanding with hands-on exercises to give students a solid start of course.
❤4
Course infrastructure is ready — just needs content now. Updated the Teaching section on the blog and created the EOSP course page, where all materials will be collected.
Long-form articles will appear as regular blog posts tagged eosp. Slides are now built as PDFs and live web pages on GitHub Pages — l inks for the first lecture are on the course page.
Wrapped up the final section of the first lecture on GitHub Flow, plus a few small curriculum tweaks.
Long-form articles will appear as regular blog posts tagged eosp. Slides are now built as PDFs and live web pages on GitHub Pages — l inks for the first lecture are on the course page.
Wrapped up the final section of the first lecture on GitHub Flow, plus a few small curriculum tweaks.
❤5
Spent three days wrestling with what sounded like the simplest task: placing an image into a Slidev presentation and exporting it to PDF. Instead of a smooth result, the export kept producing empty space where the picture should be. I wrote a small custom Vue component appeared that manually loads the image, calculated size, and sets it as a background with the correct aspect-ratio style so the export finally behaves.
The solution is not elegant totally, but after digging through Slidev’s internals and experimenting with different approaches, this handcrafted image renderer became the only stable way to make local images appear correctly in exported PDFs. Now you can enjoy the PDF slides with images :)
The solution is not elegant totally, but after digging through Slidev’s internals and experimenting with different approaches, this handcrafted image renderer became the only stable way to make local images appear correctly in exported PDFs. Now you can enjoy the PDF slides with images :)
❤5
I’ve put together my own Slidev theme — slidev-alchemmist-theme, you can see example demo. It grew out of a simple need: I wanted a slide style that’s clean, recognizable, and easy to reproduce across different talks without redesigning everything from scratch.
Right now it’s just a minimal, clean foundation with good typography and a set of basic building blocks. As the theme matures and reaches a more or less final shape, I’ll write a proper article about the whole approach and design decisions behind it. Learn slidev, try my theme and contribute!
Right now it’s just a minimal, clean foundation with good typography and a set of basic building blocks. As the theme matures and reaches a more or less final shape, I’ll write a proper article about the whole approach and design decisions behind it. Learn slidev, try my theme and contribute!
❤4 1
бестактно сложены слова из башен
а башни сами тоже языки
искал себя я корнем постоянства
но не испить так утренней росы
куда бежать по беговой дорожке
вот весь мой внутренний распад
ветра пустынь задуют даже в каземат
а я останусь меж берегов Евфрат
ум – лабиринт со входом без конца
плутают там все логосы в меня
вошедшие чужими языками
кто слушал гул их лунными ночами?
кто дал им маску моего лица?
кто их нарек, как моего отца?
кто помнит каждую из жизней,
но сам ни разу ей не живший?
“вот ты! я видел тебя прежде.
давай закончим прятки меж зеркал”
и этот возглас отзовётся эхом
вдоль собственных душевных ран.
“прошу, проснись тот кто воздвиг сей
холодной стали лабиринт
брезглив ты или безразличен
а может быть просто сонлив…”
и вновь мёртворождённых аватаров
рассыпались сотни персон
я сам уже давно не он.
лишь бы развеять Ялдаваофов сон.
“ты тень теней
ты вечно ускользаешь
но где-то там, с глубин, ты наблюдаешь
пустых скелетов шествие во тьме.
но ведь приидет Царствие, ты знаешь
смотри, уж почки занялись Я бао,
гелонги с гор своих сошли.
не ты ли разве не десит?
и кто тогда учил о Дао”
на этом слове снег сошёл
взошли цветы сквозь шапки гор
вступаю я в вечный апрель
под цветом вишни и свирель
услышал я твое дыхание
я жизнь в нём трижды обретал,
стирая грани для тебя,
ведь твоё имя это: “Я”.
alchemmist.xyz/ru/poetry/me
а башни сами тоже языки
искал себя я корнем постоянства
но не испить так утренней росы
куда бежать по беговой дорожке
вот весь мой внутренний распад
ветра пустынь задуют даже в каземат
а я останусь меж берегов Евфрат
ум – лабиринт со входом без конца
плутают там все логосы в меня
вошедшие чужими языками
кто слушал гул их лунными ночами?
кто дал им маску моего лица?
кто их нарек, как моего отца?
кто помнит каждую из жизней,
но сам ни разу ей не живший?
“вот ты! я видел тебя прежде.
давай закончим прятки меж зеркал”
и этот возглас отзовётся эхом
вдоль собственных душевных ран.
“прошу, проснись тот кто воздвиг сей
холодной стали лабиринт
брезглив ты или безразличен
а может быть просто сонлив…”
и вновь мёртворождённых аватаров
рассыпались сотни персон
я сам уже давно не он.
лишь бы развеять Ялдаваофов сон.
“ты тень теней
ты вечно ускользаешь
но где-то там, с глубин, ты наблюдаешь
пустых скелетов шествие во тьме.
но ведь приидет Царствие, ты знаешь
смотри, уж почки занялись Я бао,
гелонги с гор своих сошли.
не ты ли разве не десит?
и кто тогда учил о Дао”
на этом слове снег сошёл
взошли цветы сквозь шапки гор
вступаю я в вечный апрель
под цветом вишни и свирель
услышал я твое дыхание
я жизнь в нём трижды обретал,
стирая грани для тебя,
ведь твоё имя это: “Я”.
alchemmist.xyz/ru/poetry/me
❤5 1
I recently wrote a sexy, in my opinion, pipeline for GitHub Actions, which, running on each pull request, starts comparing the performance of a web page from master branch with its updated version offered in the pull request. The result of the performance comparison is displayed as a table with the classic CWV key performance metric.
Right now it's pretty much tied to my repository, but I'm sure it's possible to tweak the interfaces and it'll be useful for other projects as well.
Right now it's pretty much tied to my repository, but I'm sure it's possible to tweak the interfaces and it'll be useful for other projects as well.
❤3 1
на изумрудном моховом болоте
час сумарочи стоит бессменно.
остаться здесь, словно на дне океана,
под толщами вод,
в прохладной тени вековых сосен,
поросших постцивилизационной уснеей.
только здесь достаточно тихо,
чтобы услышать твой истинный голос.
лишь рубиновые всполохи костра
теплыми бликами сыграют на ранней весне,
а мы оставим все то,
что другие называли “ты”,
и что мы сами называли “я”.
пусть пение птиц сопровождает нас на том берегу.
интонации постапокалиптической исповеди
пробежали ветвистой трещинкой
по обсидиановому монолиту моей тоски,
и больше не скованы мы,
ведь я наконец могу вспомонить,
имя, названное
мне в том сне.
но дальше я не приближусь к тебе,
чтобы не спугнуть того,
кто хрупко пребывает меж нас
под толщами вод,
на сапфировом дне океана,
час сумарочи стоит бессменно
словно на моховом болоте.
alchemmist.xyz/ru/poetry/hour-of-twilight
час сумарочи стоит бессменно.
остаться здесь, словно на дне океана,
под толщами вод,
в прохладной тени вековых сосен,
поросших постцивилизационной уснеей.
только здесь достаточно тихо,
чтобы услышать твой истинный голос.
лишь рубиновые всполохи костра
теплыми бликами сыграют на ранней весне,
а мы оставим все то,
что другие называли “ты”,
и что мы сами называли “я”.
пусть пение птиц сопровождает нас на том берегу.
интонации постапокалиптической исповеди
пробежали ветвистой трещинкой
по обсидиановому монолиту моей тоски,
и больше не скованы мы,
ведь я наконец могу вспомонить,
имя, названное
мне в том сне.
но дальше я не приближусь к тебе,
чтобы не спугнуть того,
кто хрупко пребывает меж нас
под толщами вод,
на сапфировом дне океана,
час сумарочи стоит бессменно
словно на моховом болоте.
alchemmist.xyz/ru/poetry/hour-of-twilight
I just finished a full cleanup of my Neovim setup — stripped all the clutter from my old NVChad config, removed unnecessary plugins, keybindings, and features, and reorganized everything into a clean, simple structure. What used to be 2,651 lines of code is now 1,501, and Neovim feels almost like a minimalist default but still includes the essentials I rely on, such as lsp for code checks, fzf for searching, oil for file management, my custom moss theme, smart navigation, rename functionality using rgr, and a few other small but handy tools.
In the future, I’ll share a full write-up and release this setup as a proper Neovim distribution — but for now, it’s already devloped for me.
In the future, I’ll share a full write-up and release this setup as a proper Neovim distribution — but for now, it’s already devloped for me.
❤4 1
We started our lectures as part of the EOSP course. For which I have already written two large articles: "How to contribute", which examines the full development cycle of an Open Source project; as well as "Typing in python", which provides all the necessary knowledge in order to start writing Python in a typed manner.
I also made small updates on the blog. Fixed some bugs. I changed the design of the header, removing the buttons from there, now navigation is from the main page only. Added support for GitHub-style alerts in articles. I added support for mermaid (I'm already itching to write a custom theme for it, since I don't like the deflated options). The materials may still be raw, feel free to report mistakes!
I also made small updates on the blog. Fixed some bugs. I changed the design of the header, removing the buttons from there, now navigation is from the main page only. Added support for GitHub-style alerts in articles. I added support for mermaid (I'm already itching to write a custom theme for it, since I don't like the deflated options). The materials may still be raw, feel free to report mistakes!
❤4 1 1
тумань, туман, мой разум агрессивней
я все равно уже давно не тот
табань быстрей! химеры дел меня учили,
а я в кинцуги зашиваю рот.
alchemmist.xyz/ru/poetry/kintsugi
я все равно уже давно не тот
табань быстрей! химеры дел меня учили,
а я в кинцуги зашиваю рот.
alchemmist.xyz/ru/poetry/kintsugi
I’ve been writing all the latest materials for the EOSP course in nvim. For text — classical text, not code — I usually prefer working in a light theme.
So I added light mode support to my moss.nvim theme. I also wrote a script to switch the theme with a single shortcut across all the tools I use for writing: alacritty, tmux, and nvim. Using nvim’s server architecture on Unix sockets turned out to be perfect for propagating the theme change across all open sessions.
Honestly, I suspect there might be a cleaner solution out there, but I haven’t found one yet. If you know a better approach, I’d love to hear it.
So I added light mode support to my moss.nvim theme. I also wrote a script to switch the theme with a single shortcut across all the tools I use for writing: alacritty, tmux, and nvim. Using nvim’s server architecture on Unix sockets turned out to be perfect for propagating the theme change across all open sessions.
Honestly, I suspect there might be a cleaner solution out there, but I haven’t found one yet. If you know a better approach, I’d love to hear it.
тесны врата, но Царствие внутри.
ища себя, других на суд не выноси.
будь спичкой брошенной во льды,
погребшие собой поля во ржи.
опустошай пространство изнутри,
не забывая кем был до весны,
обедай там же, где гробовщики.
полынью нынче пахнет, вопреки.
alchemmist.xyz/ru/poetry/wormwood
ища себя, других на суд не выноси.
будь спичкой брошенной во льды,
погребшие собой поля во ржи.
опустошай пространство изнутри,
не забывая кем был до весны,
обедай там же, где гробовщики.
полынью нынче пахнет, вопреки.
alchemmist.xyz/ru/poetry/wormwood
я принес тебе сердце из золота
внутри, правда, чуть подгнило
ты бери без остатка, за новое,
и швыряй об асфальт, как стекло.
alchemmist.xyz/ru/poetry/heart
внутри, правда, чуть подгнило
ты бери без остатка, за новое,
и швыряй об асфальт, как стекло.
alchemmist.xyz/ru/poetry/heart
старая дикая вишня
уже отцвела
на ней одна ягода.
так вот он какой
монастырь.
alchemmist.xyz/ru/poetry/monastery
уже отцвела
на ней одна ягода.
так вот он какой
монастырь.
alchemmist.xyz/ru/poetry/monastery
блаженно бытие во знаках,
но к истине им не взойти.
Единое бытийствует иначе:
вне образа, причины и черты.
alchemmist.xyz/ru/poetry/there
но к истине им не взойти.
Единое бытийствует иначе:
вне образа, причины и черты.
alchemmist.xyz/ru/poetry/there
вдруг обнаружить, что я был двумерный,
скитаясь чувственно по телу рваных слов.
окажется, что цвет есть только черный
в нём пребывает вечно лишь любовь.
alchemmist.xyz/ru/poetry/black
скитаясь чувственно по телу рваных слов.
окажется, что цвет есть только черный
в нём пребывает вечно лишь любовь.
alchemmist.xyz/ru/poetry/black
For a long time I was using tmux-resurrect + tmux-continuum. They work… until they don’t. Sometimes they would just lose all saved sessions. And with many sessions running, they weren’t really “lazy” — everything stayed loaded in memory, even when I didn’t need it.
I wanted something different: A tool that shows all sessions as a tree — like they already exist — but actually loads them only when you enter. And it would also be great to save and restore scrollback.
So I built lazy-tmux!
It’s still early. There are quite a few open issues on GitHub, and I’d really appreciate any help or feedback. If this sounds interesting — come take a look.
I wanted something different: A tool that shows all sessions as a tree — like they already exist — but actually loads them only when you enter. And it would also be great to save and restore scrollback.
So I built lazy-tmux!
It’s still early. There are quite a few open issues on GitHub, and I’d really appreciate any help or feedback. If this sounds interesting — come take a look.
есть земля и есть небо, а между
между ними зияет весна
как прогалины меж снегами
сверхмассивна черная дыра
уместить в том пространстве и слова
не удалось до сих пор даже мху
то души моей первооснова
там я в бездну свою загляну
скитаться годами в мгновенье,
теряя недели во сне,
бежать по полям наваждений
и прятать следы на спине
никто не осудит — отлично
значит я потихоньку сойду
сойду с пьедестала победы,
с ума, что давно уж в дыму
останется в свете рассветном
усия сама пред собой
в смущении отводят взгляд звезды
а ветер играет травой
так был преодолён порог сомнений
в конфликте мраморно-гранитных облаков
с той ложью, что мир именует правдой
с той правдой, что была шуткой богов
окажется, что я жил на границе
границе света, тьмы и пустоты
и ту границу разделяет точка
на три пространства в дымке синевы
верни меня, отец моих молений,
в пустыню сердца с отблеском зари,
я слишком долго жил среди сомнений,
не различая смысла и мечты,
и если граница сомкнётся,
и точка исчезнет в тиши,
пусть то, что во мне остаётся
не будет нуждаться во лжи
и там, за пределом падений
где больше не нужен ответ
я стану дыханьем мгновений,
и встречу весенний рассвет.
alchemmist.xyz/ru/poetry/between
между ними зияет весна
как прогалины меж снегами
сверхмассивна черная дыра
уместить в том пространстве и слова
не удалось до сих пор даже мху
то души моей первооснова
там я в бездну свою загляну
скитаться годами в мгновенье,
теряя недели во сне,
бежать по полям наваждений
и прятать следы на спине
никто не осудит — отлично
значит я потихоньку сойду
сойду с пьедестала победы,
с ума, что давно уж в дыму
останется в свете рассветном
усия сама пред собой
в смущении отводят взгляд звезды
а ветер играет травой
так был преодолён порог сомнений
в конфликте мраморно-гранитных облаков
с той ложью, что мир именует правдой
с той правдой, что была шуткой богов
окажется, что я жил на границе
границе света, тьмы и пустоты
и ту границу разделяет точка
на три пространства в дымке синевы
верни меня, отец моих молений,
в пустыню сердца с отблеском зари,
я слишком долго жил среди сомнений,
не различая смысла и мечты,
и если граница сомкнётся,
и точка исчезнет в тиши,
пусть то, что во мне остаётся
не будет нуждаться во лжи
и там, за пределом падений
где больше не нужен ответ
я стану дыханьем мгновений,
и встречу весенний рассвет.
alchemmist.xyz/ru/poetry/between
I've already shared a funny with CI before. Continuing this theme, I recently wrote another pipeline for lazy-tmux that I find quite interesting. This one runs on every pull request and checks compatibility of the project against different tmux versions. It executes tests on both the PR branch and the base (e.g.
So instead of just “tests passed / failed”, you immediately see how support for different tmux versions changed — what broke, what got fixed, and where behavior diverged.
The pipeline dynamically fetches all tmux releases from GitHub, filters supported versions (>= 2.9), and runs the project inside a Docker sandbox against each version. The raw test output is then parsed into a structured JSON format, which allows doing an actual diff between PR and base.
main) branch, parses the results, and then posts a comparison as a comment in the PR conversation.So instead of just “tests passed / failed”, you immediately see how support for different tmux versions changed — what broke, what got fixed, and where behavior diverged.
The pipeline dynamically fetches all tmux releases from GitHub, filters supported versions (>= 2.9), and runs the project inside a Docker sandbox against each version. The raw test output is then parsed into a structured JSON format, which allows doing an actual diff between PR and base.