<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://aleksandr.vin/feed.xml" rel="self" type="application/atom+xml" /><link href="https://aleksandr.vin/" rel="alternate" type="text/html" /><updated>2026-09-24T21:07:08+00:00</updated><id>https://aleksandr.vin/feed.xml</id><title type="html">Aleksandr Vinokurov</title><subtitle>Memos</subtitle><author><name>Aleksandr Vinokurov</name></author><entry><title type="html">Birds nest live streaming</title><link href="https://aleksandr.vin/2026/09/24/birds.html" rel="alternate" type="text/html" title="Birds nest live streaming" /><published>2026-09-24T00:00:00+00:00</published><updated>2026-09-24T00:00:00+00:00</updated><id>https://aleksandr.vin/2026/09/24/birds</id><content type="html" xml:base="https://aleksandr.vin/2026/09/24/birds.html"><![CDATA[<p>At the beginning of June, I heard hard flaps right beside my open window. First impression was that
a hawk caught a pigeon on the roof and is eating it (I had that experience last year).</p>

<p>Then during the weekend I saw a pigeon flying into the green ivy on the wall between neightbour’s and mine
windows. I thought it could be a nest there. And next Monday I decided to hack a nest streaming project.</p>

<h2 id="gopro-on-a-stick">GoPro on a stick</h2>

<p>Consulted with a LLM, I decided not to proceed with raspberry pi and different pi-cameras, but use my GoPro,
which runs GoPro Labs. Starting with a scouting, I’ve managed to find a pigeon sitting on a nest just
by using GoPro on a stick and bending out of the open window. Next I collected verbal agreement from my
neighbours, that they are ok with me pointing camera close to their window. And started the development.</p>

<p>I was using <a href="https://oh-my-claudecode.dev">oh-my-claudecode aka OMC</a> for some of the projects already,
so there was no reason not to use it here too. GoPro can stream live to a custom <code class="language-plaintext highlighter-rouge">rtmp://</code> URL. The first design
was to run a MediaMTX media server in k8s, stream to it from GoPro and put a static web page with WebRTC/HLS
video player, sourcing from it.</p>

<p>After some test runs with Quick app (GoPro original mobile app), I’ve made
a QR code that automates GoPro: starts live stream to pre-configured RTMP server, using pre-configured
WiFi settings, keeps the stream for 1hr, then stops it, waits 2 seconds, and repeats the automation.</p>

<p>I decided to show that QR code (it does not contain streaming url and wifi info) on https://birds.aleksandr.vin
when the stream is offline, so I can point camera to it and start live stream.</p>

<p>It’s recommended to remove battery from the camera when streaming for long time. I’ve
played with streaming bitrate settings but didn’t come to the point of configuring a boot-script automation,
so that camera can kick live streaming after power failure (I learned about that a day later).</p>

<p>Another problem was the radio signal between camera and home router: it sits on the ground floor in the center
of the house, and camera is on the 1st floor on the wall outside of the window. Signal was very unstable and was
lost too often, so I brought a WiFi bridge and put it close to the window.</p>

<p>Finally I started the live streaming with a QR code, then bolted a gopro-on-a-stick to the wall while live streaming.
The pigeon flew away: it appeared to be very close to the nest, around 20-30 cm. There were one egg visible in the nest.</p>

<p>Whole rigging was a real-life PoC.</p>

<div class="embed-container">
  <iframe src="https://aleksandr.vin/videoplayer/embed.html#https://aleksandrvin-pub.s3.eu-central-003.backblazeb2.com/gopro-on-a-stick-pigeon.mp4" width="500" height="" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen="">
  </iframe>
</div>

<h2 id="recordings">Recordings</h2>

<p>The bird came back in an hour. I was very glad that she did. I shared the link with friends. When the camera
lost the wifi signal and was not picking it up (till the end of the streaming hour), they asked if it is over,
and if I am recording it to review later.</p>

<p>So next day I added automated recordings of 10 min chunks, which were uploaded to backblaze bucket and were accessible
from a generated list on html page. And in the morning, while taking a train, I reviewed them and found a second egg become
visible in the nest!</p>

<p><img src="/img/photo_2026-09-24 21.13.19.jpeg" alt="image and a link to recording" width="100%" /></p>

<h2 id="more-networking">More networking</h2>

<p>The camera was dropping the stream. It could be because the wifi bridge was struggling to keep the radio between
camera and home router. I’ve relocated a wired wifi repeater on the 2nd floor to be just over the bridge (which was on 1st floor).
Now the route was:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>GoPro )))((( wifi bridge )))((( wifi repeater &lt;===&gt; home router
</code></pre></div></div>

<p>It became a bit more stable since then.</p>

<h2 id="analyzer--telegram">Analyzer + telegram</h2>

<p>When stream was live, it was recorded by a special pod and stored in bucket. I kept an iPad by my monitor,
where the stream was played. But I wanted to get notified on interesting events, as most of the time the pigeon
sat without movement. Next mod was an analyzer pod with some OpenCV computations at 1 fps. You can select
region of interest aka ROI for the bird movements and presence and a separate one for eggs. Then a 5 second span
was analyzed for meaningful movement of edges. That produced a ‘movement’ event. Bird’s ‘present’ and ‘gone’ events
were produced by presence of edges in the ROI. Events were published into a new telegram group and to OTEL.</p>

<p>It appeared more fun to see when analyzer was emitting events, as most of the time they were just noise.</p>

<p>Later I switched to the color-based detection: bird is detected by grey volume, while green, brown (nest) and
blue sky sparks were cut off. It improved detection a lot. Later I added a darkness gate: so detections are paused
if the amount of color on the frame is too small. And a chain logic: eggs are not detected if bird is present and
movement is not checked if bird is not present.</p>

<h2 id="grafana">Grafana</h2>

<p>Next was building of Grafana dashboard. I’ve used their MCP server to give claude code (or codex) access to my
Grafana, and got a pretty decent dashboard (after my review iterations).</p>

<p><img src="/img/birds-grafana-1.png" alt="grafana dashboard top" />
<img src="/img/birds-grafana-2.png" alt="grafana dashboard top" /></p>

<h2 id="local-monitoring">Local monitoring</h2>

<p>At some point I decided to rig a poor-man monitoring of the network devices: ARP pings and ICMP pings to the
camera, bridge, repeater and stream status. Added a systemd service on home raspberry pi, which pinged all
devices and published OTEL metrics as status and RTT to device.</p>

<h2 id="youtube-live">Youtube live</h2>

<p>HTML 5 video player was probably too simple to handle the fragile video stream, it was stuck sometime and not
restarting the reconnected video stream. I decided to try re-streaming my stream to youtube. Added another pod,
which used <code class="language-plaintext highlighter-rouge">ffmpeg</code> to copy the stream as-is.</p>

<p>This is one of the recorded live streams of that time (7h long):
<a href="https://www.youtube.com/live/mHFozIH_e4A">https://www.youtube.com/live/mHFozIH_e4A</a>.</p>

<h2 id="recovery-attempts">Recovery attempts</h2>

<p>Somewhere around that time I saw a pattern: at some point, during a day, camera disconnects, and at the end of
stream hour it will appear back but with 10-100x longer RTTs, like it is struggling with something. At this
point it can run for full hour with such long RTTs, but if you turn off the bridge and turn it on in 5 seconds,
camera got all fixed and is live and fast again. So I put the bridge into a smart plug and tried turning it off
and on again via Philips Hue, based on the telemetry from local monitoring, gating attempts – you can see the attemps on
screenshot with grafana on <em>Bridge Recovery</em> panel.</p>

<h2 id="more-youtube-fackery">More Youtube fackery</h2>

<p>While playing with youtube, I registered an app to be able to add comments and update the description. That allows you to
create a chapters of the video, once the live stream is ended and video is saved, users can skip to a chapter, which
we automatically created based on the events produced by analyzer.</p>

<p>Another fun thing was adding an overlay with a fancy star for youtube stream, which was automatically added when a bird
was appearing in the frame. This overlay and commenting proof-of-concept demo (with emission of a test event) you can see
in this video I submitted to Youtube for app registration:</p>

<div class="embed-container">
  <iframe frameborder="0" scrolling="no" marginheight="0" marginwidth="0" width="788.54" height="443" type="text/html" src="https://www.youtube.com/embed/QClCh8PB4dk?autoplay=0&amp;fs=1&amp;iv_load_policy=1&amp;showinfo=1&amp;rel=0&amp;cc_load_policy=1&amp;start=0&amp;end=0">
  </iframe>
</div>

<p>With this description:</p>

<blockquote>
  <p>The liveChatMessages.insert call is made automatically when the computer-vision system detects events (test even emitted in demo video). The call currently returns 404 because this endpoint is gated behind YouTube API verification — this is the verification catch-22. The implementation is complete and correct; it just requires approval to become functional.</p>
</blockquote>

<h2 id="storm-nights-and-hard-landings">Storm nights and hard landings</h2>

<p>Somewhere around end of June / beginning of July, it was a storm during the night and the nest, eggs, birds and gopro was ok.</p>

<div class="embed-container">
  <iframe src="https://aleksandr.vin/videoplayer/embed.html#https://aleksandrvin-pub.s3.eu-central-003.backblazeb2.com/birds/birds-2026-06-19_20-49-53.mp4" width="500" height="" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen="">
  </iframe>
</div>

<p>But in two days, pigeon landed on the camera (I was really waiting for that moment to happen) and twisted it up.</p>

<div class="embed-container">
  <iframe src="https://aleksandr.vin/videoplayer/embed.html#https://aleksandrvin-pub.s3.eu-central-003.backblazeb2.com/birds/birds-2026-06-22_09-48-58.mp4" width="500" height="" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen="">
  </iframe>
</div>

<p>I used that as an excuse to add the bootable automation, so camera will boot on power cycle and autostart the main automation.</p>

<h2 id="being-a-birdwatcher-with-a-tech">Being a birdwatcher with a tech</h2>

<p>One day I decided to add phone widgets (to both Android and iPhone) which will show a snapshot of the stream at 1fps frequency: done.</p>

<p>Another day, when I was driving in the car, I decided that I want to “see my pigeon” on the CarPlay screen while driving. That
showed me two new worlds:</p>

<ol>
  <li>
    <p>Android Auto – a nasty mess of constant everyday updates: you need to install that app on you phone and it will be updated almost
every day, to support all different Android installations that are in a wild life. If you have a GrapheneOS and allowed that app to
be on your phone, that “everyday-an-update” moto will drive you nuts. And on some days your app would work and you will see a 4fps
live stream of your nest on the full screen in your car. And on some random days it will just stop working, maybe because a new update
to Android Auto… while still working in emulator.</p>
  </li>
  <li>
    <p>CarPlay – a thing that I was able to see only in the simulator, as <em>you need an official Apple entitlement</em> if you want to
sideload your debug app to a real (your personal) car, and using a navigation template (the one that can use the most of the screen)
to show a “map” which is a snapshot of my nest at any low fps, was not having a chance for such ‘entitlement’.</p>
  </li>
</ol>

<h2 id="focus-on-recorded-material">Focus on recorded material</h2>

<p>After some time I collected quite a list of 10 min chunks, so I upgraded the listing page: added recordings player, added live player,
heatmap, added chapters editing and hashtags: <a href="https://birds.aleksandr.vin/recordings?t=89#birds-2026-07-20_04-31-05.mp4">https://birds.aleksandr.vin/recordings</a>
– so heatmap can highlight recordings with chapters (red color) and you can skip directly
to the time of the fun moment (chapters are listed beneath the heatmap).</p>

<p><img src="/img/Screenshot 2026-09-24 at 22.48.22.png" alt="grafana dashboard top" width="50%" /></p>

<p>If you find a fun moment too – send the link to me – link has a timestamp, if you didn’t notice, so if you refresh/bookmark/share it, it will start playinf from the same moment ;)</p>

<p>Here is an example of the link: <a href="https://birds.aleksandr.vin/recordings?t=28#birds-2026-07-20_04-21-36.mp4">https://birds.aleksandr.vin/recordings?t=28#birds-2026-07-20_04-21-36.mp4</a>
– the chicks are walking like on a broadway there.</p>

<h2 id="continuous-fun">Continuous fun</h2>

<p>Maybe I forgot something while was I writing this long story here (it took me some evenings and attempts to go up to this point).
I’ll update the story if I find out that what I forgot is worth being mentioned here, once I remember it. But here is one more thing
that I decided to build for fun: a macos screensaver <a href="https://birds.aleksandr.vin/screensaver">https://birds.aleksandr.vin/screensaver</a> – another fun project, which ended up streaming my pigeon nest on a mac, when I was not around – that one for the lulz!</p>

<h2 id="learnings">Learnings</h2>

<ol>
  <li>Pigeons wildlife, incubation periods eggs amount, pigeon milk, learning to fly, etc.</li>
  <li>gopro streaming stability</li>
  <li>Youtube broadcasting</li>
  <li>CarPlay, Android Auto</li>
  <li>And tons of OMC…</li>
</ol>

<h2 id="future-plans-once-chicks-are-out-of-the-nest-maybe-ill-do-them-one-day">Future plans, <del>once chicks are out of the nest</del> maybe I’ll do them one day</h2>

<p>I am thinkg of packaging a system as an ad-hoc live streaming with your gopro on labs: you install labs on your gopro, point it to
one QR code, that teaches her the wifi, then to another QR code and you’re live, here and now.</p>]]></content><author><name>Aleksandr Vinokurov</name></author><category term="fun," /><category term="birds," /><category term="nests," /><category term="live," /><category term="streaming," /><category term="wildlife," /><category term="pigeons," /><category term="chicks," /><category term="claude," /><category term="youtube" /><summary type="html"><![CDATA[At the beginning of June, I heard hard flaps right beside my open window. First impression was that a hawk caught a pigeon on the roof and is eating it (I had that experience last year).]]></summary></entry><entry><title type="html">GUE, DIR, George Irvine, Rob Palmer, 100m on air… wait, WHAT?</title><link href="https://aleksandr.vin/2026/09/14/george-irvine-and-rob-palmer.html" rel="alternate" type="text/html" title="GUE, DIR, George Irvine, Rob Palmer, 100m on air… wait, WHAT?" /><published>2026-09-14T00:00:00+00:00</published><updated>2026-09-14T00:00:00+00:00</updated><id>https://aleksandr.vin/2026/09/14/george-irvine-and-rob-palmer</id><content type="html" xml:base="https://aleksandr.vin/2026/09/14/george-irvine-and-rob-palmer.html"><![CDATA[<p>It was last nights before my first GUE course… I already finished the online theory part and was checking
tabs that I’ve opened while going through the GUE history block. The one was about the founders: George
Irvine and Jarrod Jablonski – cave divers of Woodville Karst Plain Project (WKPP).</p>

<p>So I started with a search for their names, and quickly discovered one long read <a href="https://web.archive.org/web/20260206030101/https://www.tdisdi.com/iti/fear-and-loathing-on-the-internet/"><em>Fear and Loathing
on the Internet</em></a>, which is an interesting post to read. While reading it I came over this sentance:</p>

<blockquote>
  <p>Then on May 5th, my good friend Rob Palmer was killed in an unexplained accident in the Red Sea.</p>
</blockquote>

<p>And I don’t remember why, but I decided to search for that *Rob Palmer – the name I never met before – and what I’ve
found blew my mind. The long read I’ve found is <a href="http://web.archive.org/web/20260217111305/https://divernet.com/scuba-news/get-it-wrong-and-youre-dead/"><em>Get It Wrong And You’re Dead</em></a>
published Divernet on March 24, 1999 at 5:16 pm. <strong>That one worth reading in full!</strong> I’ll quote a joke from the kicker:</p>

<blockquote>
  <p>Cave divers used to tell a joke about some of their number who died and went to Heaven. St Peter met them at the Pearly Gates and asked what they wanted to find in their perfect Heaven. A wonderful cave system that no one had been in before, they replied.</p>

  <p>Soon they were swimming through a magnificent cave. Suddenly, a diver on a big black Aqua-Zepp scooter roared up from behind them, hooked on to their line and shot off ahead into the system.</p>

  <p>The cave divers went back to St Peter to complain that they were not the first into the cave.</p>

  <p>“Who was that guy with the big black Aqua-Zepp?” they asked. “Was it God?” “No,” replied St Peter. “That’s Rob Palmer. He only thinks he’s God.”</p>
</blockquote>

<p>The ones I was surprized (to say the least) of – I’ll quote here too, feel free to read that post yourself:</p>

<blockquote>
  <p>Tim and Rob each went in armed with a twinset of air and a sling-tank of nitrox 50 for decompression.</p>

  <p>…</p>

  <p>I took a casual look at Rob’s computer. At first I thought it read “12m”. A chill ran through me when I realised I had
misread “120m”!</p>

  <p>… dive with a PO2 of more than 2.7 bar, when he had always advocated an absolute maximum of 1.6 bar.</p>

  <p>…</p>

  <p>When he expressed the mind-boggling opinion that a PO2 of 3 bar was “safe”, he did so in private.</p>

  <p>…</p>

  <p>The scene was a typical deep-water reef in the Giftun Islands. It was Jane who, during the descent, decided
to stop at 70m.
Tim and Jean-Michel say they stopped at 107m, … Rob was last seen below the others, apparently waving
them to continue on down.</p>

  <p>… within days of Rob’s death, Mila went diving with me and chose to ignore our pre-dive chosen depth limit.
I parted company with him at 65m and he surfaced a good time after me with 120m logged on his computer.</p>
</blockquote>]]></content><author><name>Aleksandr Vinokurov</name></author><category term="dives," /><category term="history," /><category term="gue," /><category term="dir," /><category term="air," /><category term="wtf" /><summary type="html"><![CDATA[It was last nights before my first GUE course… I already finished the online theory part and was checking tabs that I’ve opened while going through the GUE history block. The one was about the founders: George Irvine and Jarrod Jablonski – cave divers of Woodville Karst Plain Project (WKPP).]]></summary></entry><entry><title type="html">Jam’n on Friday 13</title><link href="https://aleksandr.vin/2026/03/15/jamn-on-friday-13.html" rel="alternate" type="text/html" title="Jam’n on Friday 13" /><published>2026-03-15T00:00:00+00:00</published><updated>2026-03-15T00:00:00+00:00</updated><id>https://aleksandr.vin/2026/03/15/jamn-on-friday-13</id><content type="html" xml:base="https://aleksandr.vin/2026/03/15/jamn-on-friday-13.html"><![CDATA[<p>Some time ago my colleague and I got an idea to jam together. He plays guitar and we tried first via Teams, and Zoom and it was fun,
but hardly working: mostly due to me not hearing him when I was starting to play (I tried playing keys that week). So that Thursday
I wanted to go next day to. his place and try that IRL, but Julio was flying to Barcelona that upcoming Friday so we decided to
postpone it.</p>

<p>And last Friday, the 13th, we executed that idea. He played bass guitar, I played tenor sax, and we recorded jam session on gopro.</p>

<p>A little bit EQ in DaVinchi Resolve</p>

<p><img src="/img/jamn-on-friday-13-EQ.png" alt="EQ in DaVinchi Resolve" /></p>

<p>and here we go on <a href="https://vinokurov.bandcamp.com/album/jamn-on-friday-13">bandcamp</a>:</p>

<div class="embed-container">
  <iframe style="border: 0; width: 350px; height: 588px;" src="https://bandcamp.com/EmbeddedPlayer/album=1480014699/size=large/bgcol=333333/linkcol=4ec5ec/transparent=true/" seamless="">
    <a href="https://vinokurov.bandcamp.com/album/jamn-on-friday-13">Jam&#39;n on Friday 13 by Julián Ros, Sandro Vin</a>
  </iframe>
</div>

<p>It was a lot of fun and I already want to do it again!!!</p>]]></content><author><name>Aleksandr Vinokurov</name></author><category term="music," /><category term="jaming," /><category term="jams," /><category term="sax," /><category term="bassguitar," /><category term="friday," /><category term="fun" /><summary type="html"><![CDATA[Some time ago my colleague and I got an idea to jam together. He plays guitar and we tried first via Teams, and Zoom and it was fun, but hardly working: mostly due to me not hearing him when I was starting to play (I tried playing keys that week). So that Thursday I wanted to go next day to. his place and try that IRL, but Julio was flying to Barcelona that upcoming Friday so we decided to postpone it.]]></summary></entry><entry><title type="html">Online support is dead</title><link href="https://aleksandr.vin/2025/12/06/online-support-is-dead.html" rel="alternate" type="text/html" title="Online support is dead" /><published>2025-12-06T00:00:00+00:00</published><updated>2025-12-06T00:00:00+00:00</updated><id>https://aleksandr.vin/2025/12/06/online-support-is-dead</id><content type="html" xml:base="https://aleksandr.vin/2025/12/06/online-support-is-dead.html"><![CDATA[<p>From my experience there is no such thing as Online Support anymore. Support phone, where
you can actually call and get answered by support. Support email, where you can actually
send your support question. Contact support form, where you can actually write your question
and a mean to contact you back. All this is diying or already dead.</p>

<p>All means of reaching the actual help is covered/buffered/greased/hidden and poisined. You will
see links or buttons that “suddenly” do not work.</p>

<p><img src="/img/Support-link-is-a-lie.png" alt="support is a lie" /></p>

<p>FAQs that you need to steer through to find out an answer how to contact their support (which will
just open another door in that labyrinth). FAQ generated by “AI” to “help you” – another layer of
dust and bullshit to distract you. Chat with “support” is just another blanket to bump
you off the actuall support (if it even exist for that company). It will be a “smart” “AI” bot
that will rip your soul asking stupid forms and answering obvious things. Like my recent experience,
when PostNL app messages you “Your post is delivered to you and is in your brievenbus!” – I was at
home the whole day and at the moment of the message too, nothing was actually delivered and nothing
is in my door’s post-hole. You check that post’s track-n-trace and it says “Delivered 10 min ago and
post in your door” – quite stupid. You go to the PostNL “support” and end up in chat with “AI” bot.
You ask for help as a post was not delivered to you, he asks for a track-n-trace id, and then replies
to you like nothing happened: “Delivered 10 min ago and post in your door”. And then it’s a scenario
of a phsyco movie: you talk to a dumb asshole, who holds your fate in his hands and nothing moves to
resolution.</p>

<p>Support via ServiceNow tickets – “nice one”: you click on “Create a ticket” then you are on a page
saying that first you’ll be tried to help by their “AI” – which is a dumb search over their dumb
collection of beuracratic instructions… and it finds nothing about your problem. Fuck yes, because
I know what is the problem (need to reset a cache in Nexus repository proxy but I lack permissions
and is trying to find someone who can do that) but I need to go through “AI” help first. After “AI”
surrended I am able to fill in “more details” and a “link to the problematic page” (which does not
pass the validation due to presence of fragments in the link, Merry X-mass) and then… good luck
to find that small button “submit” (which was initially on the page and was just non-valid until)
you pass that torture with “AI”. Ah, forgot to mention – the snowflakes animation on that “support”
page was amazing :sarcasm:.</p>

<p>I believe I can easily find more examples of “support” bullshit we are diving deeper with every day.</p>]]></content><author><name>Aleksandr Vinokurov</name></author><category term="online," /><category term="support," /><category term="blame," /><category term="business" /><summary type="html"><![CDATA[From my experience there is no such thing as Online Support anymore. Support phone, where you can actually call and get answered by support. Support email, where you can actually send your support question. Contact support form, where you can actually write your question and a mean to contact you back. All this is diying or already dead.]]></summary></entry><entry><title type="html">Utrecht Universiteit, open dag</title><link href="https://aleksandr.vin/2025/11/22/utrecht-universiteit.html" rel="alternate" type="text/html" title="Utrecht Universiteit, open dag" /><published>2025-11-22T00:00:00+00:00</published><updated>2025-11-22T00:00:00+00:00</updated><id>https://aleksandr.vin/2025/11/22/utrecht-universiteit</id><content type="html" xml:base="https://aleksandr.vin/2025/11/22/utrecht-universiteit.html"><![CDATA[<p>I’m in Utrecht today. Kid is checking the university during open dag. She is on the <em>arts geschiedenis</em>,
where the auditorium is not so big, so parents are asked to wait outside. I got coffee — nice tip, noted
by O in the morning, to bring your own cup — and now sitting in the corner with my macbook and doing
some chores around the homelab. VPN is on, working and … I hear two dutch girls chatting in the other
side of the room. They are not aware of me sitting silently downstairs. I don’t follow what they are
talking about, I just suddenly realize that I enjoy their voice and the language. And I realise that this
is one of the things I like here, in the Netherlands: dutch girls speaking. I’m so fond of this
enlightment, that I decided to write it down here. And I like Utrecht, it’s different to Amsterdam and it
is full of students. The correlion is playing non-stop today. I wish I can be a student here.</p>

<div class="embed-container">
  <iframe src="https://aleksandr.vin/videoplayer/embed.html#https://aleksandrvin-pub.s3.eu-central-003.backblazeb2.com/IMG_2667.MOV" width="500" height="890" frameborder="0" webkitallowfullscreen="" mozallowfullscreen="" allowfullscreen="">
  </iframe>
</div>]]></content><author><name>Aleksandr Vinokurov</name></author><category term="nl," /><category term="dutch," /><category term="culture," /><category term="utrech" /><summary type="html"><![CDATA[I’m in Utrecht today. Kid is checking the university during open dag. She is on the arts geschiedenis, where the auditorium is not so big, so parents are asked to wait outside. I got coffee — nice tip, noted by O in the morning, to bring your own cup — and now sitting in the corner with my macbook and doing some chores around the homelab. VPN is on, working and … I hear two dutch girls chatting in the other side of the room. They are not aware of me sitting silently downstairs. I don’t follow what they are talking about, I just suddenly realize that I enjoy their voice and the language. And I realise that this is one of the things I like here, in the Netherlands: dutch girls speaking. I’m so fond of this enlightment, that I decided to write it down here. And I like Utrecht, it’s different to Amsterdam and it is full of students. The correlion is playing non-stop today. I wish I can be a student here.]]></summary></entry><entry><title type="html">NL courses</title><link href="https://aleksandr.vin/2025/11/06/nt2.html" rel="alternate" type="text/html" title="NL courses" /><published>2025-11-06T00:00:00+00:00</published><updated>2025-11-06T00:00:00+00:00</updated><id>https://aleksandr.vin/2025/11/06/nt2</id><content type="html" xml:base="https://aleksandr.vin/2025/11/06/nt2.html"><![CDATA[<p>https://www.nt2chat.nl</p>

<p>https://woordenlijst.org</p>

<p>https://nt2taalmenu.nl/nt2-b1-grammatica-menuverledentijd/</p>

<p>https://thedutchonlineacademy.com</p>]]></content><author><name>Aleksandr Vinokurov</name></author><category term="courses," /><category term="dutch," /><category term="links" /><summary type="html"><![CDATA[https://www.nt2chat.nl]]></summary></entry><entry><title type="html">Building investment plan</title><link href="https://aleksandr.vin/2025/10/31/building-investment-plan.html" rel="alternate" type="text/html" title="Building investment plan" /><published>2025-10-31T00:00:00+00:00</published><updated>2025-10-31T00:00:00+00:00</updated><id>https://aleksandr.vin/2025/10/31/building-investment-plan</id><content type="html" xml:base="https://aleksandr.vin/2025/10/31/building-investment-plan.html"><![CDATA[<pre>

[Texcret start]: #

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

[Texcret end]: #

</pre>]]></content><author><name>Aleksandr Vinokurov</name></author><category term="investment," /><category term="plans," /><category term="learning" /><summary type="html"><![CDATA[[Texcret start]: # [Texcret end]: #]]></summary></entry><entry><title type="html">Nights</title><link href="https://aleksandr.vin/2025/10/30/nights.html" rel="alternate" type="text/html" title="Nights" /><published>2025-10-30T00:00:00+00:00</published><updated>2025-10-30T00:00:00+00:00</updated><id>https://aleksandr.vin/2025/10/30/nights</id><content type="html" xml:base="https://aleksandr.vin/2025/10/30/nights.html"><![CDATA[<pre>

[Texcret start]: #

WUtMQjIAgnpg/MiCRlo8saxBAAMtLS0AAV45dFkKeVVJRkSLpGttm0v6WOLhC5RCthDSE04AMILm
QJC9IIgJm01jarXtEKVb0z6Kw2g904bE2X+CwsZcrUV7P5VPLd4NL2mjCk+kM13WIyfk1toVaSvH
pu7ZEw+wjGq8USl6d+URHVFW4pMqXavYnLHqorwrV0HccNupLFvIMsdOx0zTVhLjNbYnQpIQlwIV
ZZlEIbT3AweM22Esdyy3zXU32VA/VNE5+eTLKGdBQ36fQPMEKgYy1d75cphCGqn8DPIEtOTN0z0o
+oRGKOzdERUeCjIGF0RPG8OpsIQiv0Af9eq2EzXh5v8TIdk8thm8RhFhbzYgiQwx8k882Vss202q
UxXkactwAOuaeS/LJdgJlyMe9uijBHC031VGZX0KPeLEwVNrylrn5ts38CpzNIeVlnwcZlBLPFOK
Q/F2TFNwVoDMQqNGnn64Qg1fJtSARStgCHr+tH3bh8aeQMtpsnqvL4phOhjlViVAX0yMDqPFSHRY
O1aADz5x9JAaP6smM4MjA0hblCj46LVCri3Eg3IpQ4PiZ2GAQWNkjXHNvZt7QLZ4Oj24fQm5FTdD
WimDZHR7jt8NfjlUpWy30fnd7msD89r0GETRrU6vAP/rgfBRlsGTcrJyYG6S7lwnOdPx81s8RR2D
JtaIRTjk+vxTD+nbdlUUrp35jsmBoKG5IV1CR5joDizuPyRww4NFzWs4bF6wjW0/vxRT95kBtHDI
8vhvBsWa6foRhHPcJwU49+PF1MTz9nhNnHbx8IWc+OHgtFaNmIJLE7/yC7nO6BEyGHojKPDZHd4M
YKfyw49GWVx2Mh5EmWEFrYn//eNV7tjC5d7wx2TmDrVKrbgAl3VlVLVvzP/b1iflruB9iO8n3dT3
yHJ4KaRuB+qXbU2FXy0odfwZhWmuJ3SjNF2pj9EXG/Tfjv+VcnYU6s3HMgsHgjiF5X+wN8H9E2Q8
kRQMyM5Y3KF/B2Kq7mrIHYA9DJg5S+RxgwGLtA81rdX5kXSZ65i9L7M0SB/k51dKxZ8SRQ08PNlG
6PkwegO2dNiOfPmmzj6Qz1O4ILx5H0EQftPpeIuBsl8EorI3GkNCrcyCx2TqBLhhtd3h48EOMfFC
NV5te2h7ppaQvBcmAl3hDIEZk0LfJMYzBdHyY2ZlcgOazn+CjQMy2YO6Hc2NXXcNQz6kLIW//YXI
chOoEEMP2kCpqcKE+oxJEpZKUibwqk0hlJ/QGMU+LoeX/sLmHLJlQIS7DJX/9vnq6AYoqEAyxpdH
ws0Gt7sdmjb9waQ+A4RXhZKu0BTDJf7+IH3d7w4y8yftnv1rU06dZsArjsCfaHu25O6ioUB9p0Ke
fvV05rMlFioXta/SA6B2uOlKtdbXk5NL4JaBOJsFIdi51xJXTfwQPKEWQHkyCxCpmdJ6EI5EzzfG
Z4FbR1NtLk9jF7xUX6eLgh3WjknwMlP1jz6bySbGe0MP2+5tkNY8o0p+1kLygBEzovsQjBGvz/aN
oD2yfOEmpw792u4hjucqpUwaRxin7pe/pMIriERvXNMIgbi04Y5hZ6+Axl/+pM6Iz+uF5qhgZAxs
XzlqwoaRUwbhtQHDW7RW3+8fE6cXZ6p35t2gpzHKwLi+9np+4H03h6/r+m/rFC30kbfWZGzK/OA9
Y9foI5E=

[Texcret end]: #

</pre>]]></content><author><name>Aleksandr Vinokurov</name></author><category term="night" /><category term="thoughts" /><summary type="html"><![CDATA[[Texcret start]: # [Texcret end]: #]]></summary></entry><entry><title type="html">Texcrets</title><link href="https://aleksandr.vin/2025/10/28/texcrets.html" rel="alternate" type="text/html" title="Texcrets" /><published>2025-10-28T00:00:00+00:00</published><updated>2025-10-28T00:00:00+00:00</updated><id>https://aleksandr.vin/2025/10/28/texcrets</id><content type="html" xml:base="https://aleksandr.vin/2025/10/28/texcrets.html"><![CDATA[<p>What I wanted for so long is now here: client-side encryption on a web page with Yubikey (or platform passkey, or password):
and I called that <strong>Texcrets</strong>!</p>

<p>TL;DR; I can write posts here with blocks like:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>{ % texcret %}
This text must be hidden from public eyes (read encrypted).
{ % endtexcret %}
</code></pre></div></div>

<p><em>(I put extra space in tag opennings to go under the radar with the example above).</em></p>

<p>And they are <em>texcreted</em> into blocks like this at pre-commit via a <em>texcret</em> cli:</p>

<p>WUtMQjIAWoR+A+pe1UDbfMDaAAMtLS0AAeeq6Csra2XDS9x+sKSkQpZACVKqCLx6ngbV9BYAMC83eSK29gi7IOBJ2ryrO1UXZskCpjyCG7i/SL7wYA7+MkHTmz+NwrRdQjFM/d6XPqNIBJywYy2/fbElDne0RGqguuZsEXnFmwPfn3uw63j/UahX3+dGIuWIwFWj6W1Foz+5aJx3xnoK6KQ0qFfdZpCcC/wJILEuYzMpk1HN</p>

<p>Which I can temporarily decrypt (in-page without any network communication)
magically by performing the following click pattern on it: <em>dblclick - click - dblclick</em>.</p>

<p>Check the <a href="https://aleksandr.vin/texcret/demo.html">demo</a> or github <a href="https://github.com/aleksandr-vin/texcret">repo</a>.</p>]]></content><author><name>Aleksandr Vinokurov</name></author><category term="poc" /><category term="secrets" /><category term="texcrets" /><category term="crypto" /><category term="client-side-encryption" /><summary type="html"><![CDATA[What I wanted for so long is now here: client-side encryption on a web page with Yubikey (or platform passkey, or password): and I called that Texcrets!]]></summary></entry><entry><title type="html">A token in life</title><link href="https://aleksandr.vin/2025/10/13/a-token-in-life.html" rel="alternate" type="text/html" title="A token in life" /><published>2025-10-13T00:00:00+00:00</published><updated>2025-10-13T00:00:00+00:00</updated><id>https://aleksandr.vin/2025/10/13/a-token-in-life</id><content type="html" xml:base="https://aleksandr.vin/2025/10/13/a-token-in-life.html"><![CDATA[<p>What’s it for you in your life?</p>

<p>Since beginning of August I got locked on a mechanical wrist watch. As a message of disgrace towards the smartwatches, smartphones and third-party apps running on my computers.</p>

<p>How so? Being a computer geek all my life I am loosing fate in them. But thinking deeper over that, I think
better would be to say I’m loosing fate in people programming them. Not excluding myself.</p>

<p>I would not brag over the LLMs and all the “AI” things happenning in recent years. Talking in general about
computer programms that are here to help people: are they?</p>

<p>You can say — “If it does the job, it’s good enough”. I disagree: <em>consumerism</em> is already leaving piles of
crap at places of the “least concerned”. Places where beneficiars are not living. Places where their sellers
are not living. Places where those who are living, will get that crap and nothing more.</p>

<p>So apps are everywhere now in our lives. And they are mostly crap. Name it.</p>

<p>Spotify — now playing, while I’m
typing it. Just a few seconds ago it skipped a song midair like nothing happened. It’s discovery playlists
are useless, I feel hopeless everytime I try them. “Best (something)” playlists are even worser: I hop-off
after I exercise the “skip” button for almost a minute, not even being able to listen for some decent time
for a song. Should it be matching my music taste or pumping me with some algorithmic one’s?</p>

<p>Proton Mail — (maybe you didn’t even hear of that one) — recent update changed the UX of the archive action,
the most-used one, and it feels like a hiccup now when you slide email left.</p>

<p>Guardian App — with heir cursed limit of 30 topics you can follow: I’ve developed that number to almost 50
when suddenly it stopped working and asked me to decrease my choices until I can add new. It is very
frustrating to try to find out what is the limit when you stay at 49 and, you remove more and it still says
you are above the number, but what number it does not bother mentioning. Later they fixed that by mentioning
the limit is 30. Still lame.</p>

<p>Calendar iOS — knows better how to add new event’s info than you: even when you’ve already added the date and
time and then picked up a similar-called event from a drop-down list, it replaces you entries with the time
of the event you selected <strong>for the f#cking name</strong>!</p>

<p>Oceanic dive app for iOS — these motherf#ckers managed to release a new version last year that crashed on iOS
17 while still being listed as min required in App Store. There is nothing more upsetting than a crashing
dving app on your wrist, when you’re already in a wetsuite in a water set for the dive. Consumer smartwatch
from the company with zero experience in diving and an app from the company with zero experience in a app
development.</p>

<p>Quick (GoPro) — search the internet, it’s a PITA to use it, don’t want to talk about it more.</p>

<p>Instagram, Facebook — I deleted them at the very beginning of the year and do not miss at all. Could be the
ones professionaly built, but you know what — they somehow decided they know better what their users need.
Trivial things, they all “do the job” for them: feeding me with their POV of news and posts, algorithms
and moderation rules.</p>

<p>Strava, Garmin, Suunto… all busy with their cash flow and not the customers. Check the recent Strava suite
over Garmin. Poor Strava was asked to attribute the data uploaded from Garmin devices and they call it a
“user’s data” but they did decide themselves what is better for the user when they restricted their API use a
year ago.</p>

<p>I can continue the list. But if we go to the professional development, it’s the same: opinionated choices
can be good. Can be bad. I meet the bad choices too often. Maybe I just notice the bad things…</p>

<hr />

<p>So if you can program, do yourself a favor: write programs for yourself.</p>

<p>PS. I wear a mechanical watch on my wrist now and it reminds me that there are good things in life that
run no shit and that are completely yours once you bought them. Good luck.</p>]]></content><author><name>Aleksandr Vinokurov</name></author><category term="life," /><category term="boredome," /><category term="stagnation," /><category term="world," /><category term="purpose" /><category term="of" /><category term="life" /><summary type="html"><![CDATA[What’s it for you in your life?]]></summary></entry></feed>