<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
     xmlns:atom="http://www.w3.org/2005/Atom"
     xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Maksim Golub - Posts</title>
    <link>https://maksimgolub.com/posts/</link>
    <description>Notes on launches, product work and the tools I build.</description>
    <language>en</language>
    <lastBuildDate>Wed, 16 Sep 2026 16:13:39 +0000</lastBuildDate>
    <atom:link href="https://maksimgolub.com/feed.xml" rel="self" type="application/rss+xml"/>
    <item>
      <title>Slow risk and late alarms: reading the cash before it harms</title>
      <link>https://maksimgolub.com/posts/slow-risk-and-late-alarms-reading-the-cash-before-it-harms/</link>
      <guid isPermaLink="false">https://maksimgolub.com/posts/slow-risk-and-late-alarms-reading-the-cash-before-it-harms/</guid>
      <pubDate>Thu, 10 Sep 2026 09:00:00 +0300</pubDate>
      <description>A full borrower-risk system read from one balance snapshot: metrics, weights, alerts, rollout and the feedback loop that keeps it honest.</description>
      <content:encoded><![CDATA[<p><em>Originally published at <a href="https://braginskyoleg.com/ru/content/2026/09/10/slow-risk-and-late-alarms-reading-the-cash-before-it-harms/" rel="noopener">braginskyoleg.com</a>.</em></p>
<p><em>Sometimes the money is all there, and the trouble is already in the room. In fintech the first question is rarely how much cash a company holds. Founder of the School of Troubleshooters Oleg Braginsky and student Maksim Golub examine how one balance snapshot turns into a stress score.</em></p>
<p>Risk in lending does not arrive as an event. It accumulates. A borrower drifts for weeks, then one payment is missed and the whole picture appears at once. Periodic reporting shows the drift a quarter late, by which point the repayment buffer is already thin. The signal existed earlier, in the balances, but nobody read it.</p>
<p>Product teams feel the same lag from the other side. You ship a feature meant to prevent losses, and the proof arrives one year later, once the whole loan book has turned over. Anything that shortens that loop is worth building. An early signal is cheaper than late but crisp certainty, even when it is a little less precise.</p>
<p>Data does not help by default. Numbers arrive incomplete, stale, or in a schema nobody has seen before. Often there is no history to compare against, so no delta can be computed at all and no trend exists. The decision still must be made today, on the fragment of the picture that reached the one who analyses it.</p>
<h2 id="setting-the-task">Setting the Task</h2>
<p>The task is to read borrower cash risk from a single hourly balance snapshot. Balances only: no transactions, no repayment schedule, no flag marking an account restricted. The output is one graded stress level plus the alerts an analyst opens first.</p>
<p>Before the mechanics, one question decides the shape of the product. Who acts on the number? A score built for a portfolio committee and a score built for a single deal owner are different products with the same arithmetic inside. Three roles touch borrower risk, and each reads the number differently.</p>
<h2 id="defining-personas">Defining Personas</h2>
<p>First persona: the monitoring analyst. Watches a set of borrowers, reads positions daily, decides whether to escalate or wait for the next file. Wants a filter that removes noise, not another dashboard, and resists any alert he cannot explain to the deal owner.</p>
<p>Second persona: the deal owner. Follows the companies she brought into the book and answers for them personally. She does not monitor the portfolio and does not want to. She wants a notification the moment her own borrower becomes fragile. Narrow and deep, the opposite of the analyst’s wide and shallow view.</p>
<p>Third persona: the credit committee. Looks above the individual deal at the health of the whole book. Needs a roll-up: how many borrowers sit in each stress tier, which way the count moved, and where it moved fastest. Detail matters less than comparability across borrowers and across the quarters behind them.</p>
<h2 id="measuring-the-cash">Measuring the Cash</h2>
<p>Three numbers carry the mechanism:</p>
<ul>
<li>Total available cash: every account summed into one currency at a snapshot rate.</li>
<li>Concentration: the share held by the top institution and the top three countries.</li>
<li>Currency risk: value that devaluation removes, access that controls block.</li>
</ul>
<p>Total cash answers the first question any lender asks and then settles nothing at all. For instance, two borrowers holding an identical balance are not in an identical position. One spreads the money across four banks in hard currency. The other keeps eighty per cent of it in one local institution under capital control.</p>
<p>Concentration measures that difference. One counterparty freezing, one authority imposing controls, removes the largest share of the buffer without warning. A share, not a sum, works with no history behind it.</p>
<p>Currency risk has two faces. First: value, how much can evaporate on a devaluation with no outflow at all. Second: access, how much is legally unavailable for repayment while it still sits on the balance sheet and shows up in the total. Both reduce what the lender can really collect, and neither is visible in the sum.</p>
<h2 id="naming-the-constraints">Naming the Constraints</h2>
<p>The frame is narrow, and every later decision refers to it:</p>
<ul>
<li>Schema is unknown: the next borrower exports a file we have never parsed.</li>
<li>Data arrives incomplete: institution keys and country codes go missing.</li>
<li>The signal comes late: the snapshot lags the event that caused it.</li>
<li>No history at cold start: no trend, no burn rate, no runway.</li>
<li>Values float: rates move after economic news.</li>
<li>One borrower per view: portfolio sits above.</li>
</ul>
<p>One more constraint sets every threshold. A missed signal costs the principal, a false alarm costs ten minutes and a call. We are tolerant of false positives, intolerant of false negatives, and the weights say so.</p>
<p>Think of the smoke detector in the kitchen. It goes off when you fry fish, and everyone knows why it still hangs there. The night it matters pays for every false alarm before it. A cash score sits on the same wall.</p>
<h2 id="designing-the-flow">Designing the Flow</h2>
<p>Money becomes a decision in five stages:</p>
<ol>
<li>Source: pull the hourly balance snapshot from the borrower’s banking systems.</li>
<li>Normalise: map any borrower schema onto the fields the product needs.</li>
<li>Compute: derive total cash, concentration and currency risk.</li>
<li>Score: turn the metrics into one graded stress level.</li>
<li>Act: escalate, call, or label.</li>
</ol>
<p>A feedback loop closes the chain from Act back to Score: every alert marked true or false calibrates the next threshold. Without it the score freezes, and the analyst argues with a number that cannot learn.</p>
<p><img src="/posts/media/slow-risk-and-late-alarms-reading-the-cash-before-it-harms/image1.webp" alt="Five stages from raw data to credit action: source, normalise, compute, score, act, with a feedback loop back to score" loading="lazy" decoding="async" width="1544" height="869" /></p>
<h2 id="building-the-score">Building the Score</h2>
<p>Each stage needs its own green check before the next may run: normalisation that silently drops three accounts produces a clean-looking score computed on half the money. The chain is monitored, not assumed.</p>
<p><img src="/posts/media/slow-risk-and-late-alarms-reading-the-cash-before-it-harms/image2.webp" alt="Stress scoring: the tier scale from Healthy to Stress and the four weighted components with their weights" loading="lazy" decoding="async" width="1596" height="898" /></p>
<p>The score is a weighted sum: each component normalised to a fixed scale, multiplied by an expert-set weight, added up. Narrow scales are a trap: five points force distinct borrowers into one bucket.</p>
<p>The prototype above runs on 0 to 100 because a reader holds those numbers without effort. In production the same arithmetic runs on 0 to 1000: ten times the resolution costs nothing, keeps neighbouring borrowers apart, and leaves room for new components without recutting every threshold in the book.</p>
<p>Weights are visible and contestable: concentration 35%, currency risk 30%, liquidity buffer 25%, data quality 10%. An analyst who disagrees points at the line, not at the tool, and a black box would not survive.</p>
<p>Data quality earns 10% by limiting the other three components. Missing institution keys and country codes reduce confidence in concentration, and the sample file has seventeen such gaps across 62 rows. The score reports its own reliability instead of presenting a confident result from incomplete data.</p>
<p>One number then splits into four tiers:</p>
<ol>
<li>Healthy: nothing to do, the position is boring and should stay that way.</li>
<li>Watch: look again at the next snapshot before saying anything.</li>
<li>Elevated: raise the flag and call the deal owner.</li>
<li>Stress: escalate now.</li>
</ol>
<h2 id="assumptions-and-validation">Assumptions and Validation</h2>
<p>Three assumptions carry the product. Cash fragility today predicts repayment trouble later. A single snapshot carries signal without a per-borrower baseline behind it. The credit team can act on an early warning rather than merely receive it and file it away. If the third one fails, the first two stop mattering.</p>
<p><img src="/posts/media/slow-risk-and-late-alarms-reading-the-cash-before-it-harms/image3.webp" alt="Assumptions and validation: three assumptions and three validation steps ordered by cost and strength of proof" loading="lazy" decoding="async" width="1551" height="872" /></p>
<p>Validation runs cheapest first. Face-check: push known borrowers through the score, some the team escalated last year, some healthy, and see whether the number agrees with what the analysts already know. Half a day of work, and it kills the obvious errors before a line of production code exists.</p>
<p>Cohort backtest comes next. Take the cases the team managed manually (restructuring, covenant breach, escalation) and ask whether the score would have lit up in advance of the call that started them. This is the first honest measure of catch rate, and it runs only if historical snapshots were kept. Nobody keeps them by accident, so the question is asked before the project starts.</p>
<p>The labelling loop is expensive: it exists only in production. The analyst marks each alert agree, disagree or needs review, and writes why. A bare label says the number is wrong; the comment says which component.</p>
<p><img src="/posts/media/slow-risk-and-late-alarms-reading-the-cash-before-it-harms/image4.webp" alt="Success metrics: adoption as action at 70%, alert trust at a 60% floor, catch rate, and the labelling loop behind them" loading="lazy" decoding="async" width="1577" height="887" /></p>
<h2 id="engineering-collaboration">Engineering Collaboration</h2>
<p>The building is split into three layers by who owns the work:</p>
<ol>
<li>PM builds, AI-assisted: prototype, metric and weight logic, known schemas.</li>
<li>PM specs, engineering builds: unknown schemas, alerting, feedback loop.</li>
<li>Engineering and security only: banking connection, storage, compliance.</li>
</ol>
<p>The prototype is the specification, not the production code. Engineers run the calculation and read the weights straight from the source instead of reconstructing them from a document. Then they rebuild it to the reliability and security requirements, and the numbers stay identical on both sides of that line.</p>
<p>Security joins before the building, not at the review. Banking connections and financial-data storage carry compliance requirements that reshape the schema and the retention rules. Discovering them after the alerting service is written costs a rewrite, so they are priced in while the design is still cheap to change.</p>
<h2 id="rolling-out">Rolling Out</h2>
<p>Adoption counted in users is a vanity number: a tool reaches every analyst on the floor and catches nothing. Each phase is gated by the trust earned so far, on borrowers the team knows well.</p>
<ol>
<li>Shadow: runs in parallel, drives no decision and carries no risk. Exit reading matches analyst judgement.</li>
<li>Assist: the score enters the decision. The analyst may overrule it and label each alert.</li>
<li>Operate: embedded in the workflow. Deal owners notified, labelling still running.</li>
</ol>
<p>The first user should be a sceptical, experienced analyst working a difficult borrower. Convince the sceptic and the rest of the floor follows without a memo. A failure also surfaces on one person first, inside a conversation, instead of spreading across a department and landing in a support queue nobody reads.</p>
<h2 id="measuring-impact">Measuring Impact</h2>
<ul>
<li>Adoption as action: 70% of alerts escalated, called on, or labelled by an analyst.</li>
<li>Alert trust: a 60% floor on alerts later confirmed as real stress.</li>
<li>Labelling coverage: 80% of alerts labelled after review.</li>
<li>Catch rate: real stress events caught in advance.</li>
</ul>
<p>Alert trust and catch rate are read as a pair, never one at a time. Optimise trust alone and the tool fires only on the obvious cases, staying silent everywhere else. Optimise catch alone and it fires on everything, and the analyst mutes it within a week. Neither number carries any meaning when it is read on its own.</p>
<p>None of the four is a target on its own. Adoption without trust means analysts click through; trust without coverage means the labels stop arriving and the score stops learning. The set is read as one instrument, and the weakest of the four sets the pace.</p>
<h2 id="inside-the-product">Inside the Product</h2>
<p>The dashboard leads with the score and its tier, coloured so the state registers before a word is read. The sample borrower opens at 73 out of 100, Elevated. Under it sit three metric cards: $9.31M of total cash, 31.6% concentration, 91.5% currency risk, then the open alerts and an events panel.</p>
<p><img src="/posts/media/slow-risk-and-late-alarms-reading-the-cash-before-it-harms/image5.webp" alt="Dashboard: risk score 73 out of 100 Elevated, metric cards for total cash, concentration and currency risk, top alerts and an events panel" loading="lazy" decoding="async" width="1600" height="900" /></p>
<p>Context is what prevents a wrong reading of that total. The events panel shows a $2.00M repayment due against $0.80M of hard currency available, next to a $0.62M payroll run and a $0.28M VAT payment in the same week. Nine million looks comfortable right up until those three lines sit beside it.</p>
<p>The alerts view names the rule that fired, the observed value, and the threshold it crossed. Here that reads as $2,941,538 parked in one institution against a 30% ceiling, four of the eight alerts still open. The analyst answers agree, disagree, or needs review, and the comment goes into calibration, not a support ticket.</p>
<p>Every alert is a hypothesis: analysts weigh the evidence, record their reasoning and compare the warning with the eventual outcome. Even a confirmed alert deserves scrutiny: the right answer for the wrong reason fails on the next borrower. In lending, trust is earned through evidence.</p>
<p>Distribution answers the question the total hides: where exactly the money sits. Cash by institution, by country, by currency type, plus the account table sorted by value, 62 rows across 29 institutions and 22 currencies. One glance shows that 41.7% of the whole buffer sits in a single country, Cameroon.</p>
<p><img src="/posts/media/slow-risk-and-late-alarms-reading-the-cash-before-it-harms/image6.webp" alt="Cash distribution by institution, by country and by currency type, with Cameroon holding 41.7% of the buffer" loading="lazy" decoding="async" width="1600" height="900" /></p>
<p>The point applies across the entire model. Each stage needs multiple layers of control, straightforward evidence, and auditable rationale for every decision. Where a rule still relies on expert judgement, that judgement should be captured explicitly, evaluated, and converted into measurable logic over time.</p>
<p><img src="/posts/media/slow-risk-and-late-alarms-reading-the-cash-before-it-harms/image7.webp" alt="Alerts view: each alert names the rule, the observed value and the threshold, with agree, disagree and needs review labels" loading="lazy" decoding="async" width="1600" height="900" /></p>
<p>The data tab keeps the raw snapshot visible and read-only, all 62 rows of it. Any alert can be traced back to the rows that produced it, and any number on the dashboard can be checked against its source. A score that nobody can audit gets overruled once in a meeting and quietly ignored.</p>
<p>Customers should be able to trace every metric to its source, inspect supporting details, and see where data or analysis is incomplete without asking the team. Due diligence may allow time for review, but human judgement should remain in the loop wherever the evidence cannot support an automated decision.</p>
<p><img src="/posts/media/slow-risk-and-late-alarms-reading-the-cash-before-it-harms/image8.webp" alt="Data tab: the raw read-only account snapshot, 62 rows across 22 currencies and 29 institutions" loading="lazy" decoding="async" width="1600" height="900" /></p>
<h2 id="what-comes-next">What Comes Next</h2>
<p>Five gaps separate this prototype from a portfolio-grade product:</p>
<ol>
<li>Account-level flags for restricted, escrow and payroll cash. They change the liquidity denominator.</li>
<li>Alert lifecycle, covenant-aware thresholds. Calibrated score, limits bind to terms of each facility.</li>
<li>Ingest with human-in-the-loop mapping. Any format, schema confirmed once, reused then on.</li>
<li>Counterparty risk across borrowers. One bank holding cash for several companies.</li>
<li>From snapshot to trend. Trajectory, burn rate, runway in days.</li>
</ol>
<p>Trend sits last on that list by length and first by value: trajectory, burn rate and runway remove the constraint the whole design was built around, the absence of any history.</p>
<p>Counterparty risk is invisible by construction: one bank can hold cash for four portfolio companies, and each scores acceptably read alone. The exposure appears only at the portfolio layer above this product.</p>
<h2 id="what-to-remember">What to Remember</h2>
<ol>
<li>Concentration and currency risk read a single snapshot; a share needs no history.</li>
<li>Weights stay visible: concentration 35%, currency 30%, buffer 25%, data 10%.</li>
<li>A missed signal costs the principal, a false alarm costs ten minutes.</li>
<li>Data quality caps what the other three components may claim.</li>
<li>A score with no labels stops learning the day it ships.</li>
</ol>
<p>The lesson is general: a score is not a calculation you ship once and leave on a dashboard. It improves while the analyst argues with it, and the whole chain must stay healthy. Build the feedback path first.</p>
]]></content:encoded>
    </item>
    <item>
      <title>Keeping part of the thinking physical</title>
      <link>https://maksimgolub.com/posts/thinking-on-paper/</link>
      <guid isPermaLink="false">https://maksimgolub.com/posts/thinking-on-paper/</guid>
      <pubDate>Sun, 06 Sep 2026 15:45:02 +0300</pubDate>
      <description>Voice is becoming the main interface, which is exactly why a pen, paper or a stylus still earns its place in the loop.</description>
      <content:encoded><![CDATA[<p>As voice becomes the main interface, I find it increasingly important to keep some part of the thinking physical. A pen and paper, or even drawing with an Apple Pencil, gets me beyond the constraints of text boxes and spreadsheets. The goal is not necessarily to produce anything polished. Simply writing, sketching, or doodling by hand can help ideas take shape and make abstract concepts easier to explore – Huge credit to my wife, who’s great at capturing these candid moments, even when I’m not always thrilled about being photographed 💚</p>
<p><img src="/posts/media/thinking-on-paper/01.webp" alt="" loading="lazy" decoding="async" width="800" height="1067" /></p>
]]></content:encoded>
    </item>
    <item>
      <title>The setup I work from when I am not at a desk</title>
      <link>https://maksimgolub.com/posts/mobile-setup/</link>
      <guid isPermaLink="false">https://maksimgolub.com/posts/mobile-setup/</guid>
      <pubDate>Sat, 05 Sep 2026 15:27:44 +0300</pubDate>
      <description>The tablet is the screen, the phone handles input and voice, and a paper notepad catches whatever will not wait.</description>
      <content:encoded><![CDATA[<p>This is pretty much my mobile setup: the iPad is my main screen, my phone handles input and voice, and I keep a simple notepad nearby for quick notes 🤓</p>
<p>It’s especially handy when I’m traveling, out and about, or just want to keep working on the move. Even in bed, I’ll sometimes review what I’ve been working on and add a few notes by voice.</p>
<p><img src="/posts/media/mobile-setup/01.webp" alt="" loading="lazy" decoding="async" width="800" height="1066" /></p>
]]></content:encoded>
    </item>
    <item>
      <title>A library of communication patterns, not one tone of voice</title>
      <link>https://maksimgolub.com/posts/communication-patterns/</link>
      <guid isPermaLink="false">https://maksimgolub.com/posts/communication-patterns/</guid>
      <pubDate>Fri, 28 Aug 2026 12:56:55 +0300</pubDate>
      <description>The same intros and the same replies keep getting rewritten. Better to keep the patterns and assemble the right one.</description>
      <content:encoded><![CDATA[<p>I’ve noticed that quite a few things I write are actually repetitive. Sometimes it’s the same kind of intro, sometimes the same explanation, sometimes a reply I’ve already written in slightly different words a dozen times before. So I started thinking that it would be useful to have a kind of alter ego (hehe) -&gt; not just one fixed “tone of voice,” but a small library of communication patterns. We all speak differently depending on the situation, the role we’re in, the person we’re talking to, and even the language we’re using. It would be nice to keep those patterns somewhere and quickly assemble the right version when needed, instead of reinventing it every time. Started buiding mine.</p>
<p>P.S: the first funny case was actually trying to speak with someone on Telegram on behalf of myself, a lot of things to work on, but will improve it over the time :)</p>
<p><img src="/posts/media/communication-patterns/01.webp" alt="" loading="lazy" decoding="async" width="800" height="999" /></p>
]]></content:encoded>
    </item>
    <item>
      <title>If I install this, what am I not doing?</title>
      <link>https://maksimgolub.com/posts/infrastructure-has-a-cost/</link>
      <guid isPermaLink="false">https://maksimgolub.com/posts/infrastructure-has-a-cost/</guid>
      <pubDate>Wed, 26 Aug 2026 17:48:44 +0300</pubDate>
      <description>A new tool always looks like progress. The question that kills most of them is what it displaces.</description>
      <content:encoded><![CDATA[<p>Ok, building infrastructure is always fun. Been there many times. You look for a new tool, a way to improve, optimise. But it comes with a cost - if you do X, you don’t do Y. And Y is actually more important, because it is building an actual product or pushing hard to deliver it into the hands of the customers 🤑</p>
<p>I am writing this for myself too. I was checking my backlog and saw the item “Try Orca” (it is a new ADE with thousands of stars on GitHub). I was about to install it and give it a go, but then thought - ok, if I proceed, what won’t I be doing? And apparently, that thing is far more important. Of course, of course, I will go ahead and play with this thing later, but it was a good exercise just to make sure I don’t build a fancy hangar while the airplane still cannot soar in the sky ✈️✈️</p>
<p><img src="/posts/media/infrastructure-has-a-cost/01.webp" alt="" loading="lazy" decoding="async" width="800" height="999" /></p>
]]></content:encoded>
    </item>
    <item>
      <title>Still one of the best productivity tools on the market</title>
      <link>https://maksimgolub.com/posts/paper-is-truly-offline/</link>
      <guid isPermaLink="false">https://maksimgolub.com/posts/paper-is-truly-offline/</guid>
      <pubDate>Thu, 20 Aug 2026 13:56:12 +0300</pubDate>
      <description>No subscription, no battery, no login, no regional restrictions, and no limit on what shape a thought can take.</description>
      <content:encoded><![CDATA[<p>No matter how good the technology gets, a pencil, a pen, and a sheet of paper remain some of my most valuable tools. ✏️📃 For thinking through a problem, taking notes, mapping a flow, or simply drawing an idea before it becomes a product. Paper is truly offline: no subscription, no battery, no login, no regional restrictions. It works anywhere. And there are no format limits. You can write a sentence, build a table, draw a system map, cross it out, or start again in the margin. Still one of the best productivity apps on the market 👍</p>
<p><img src="/posts/media/paper-is-truly-offline/01.webp" alt="" loading="lazy" decoding="async" width="800" height="1200" /></p>
]]></content:encoded>
    </item>
    <item>
      <title>A weekend with an old Raspberry Pi and an older speaker</title>
      <link>https://maksimgolub.com/posts/raspberry-pi-radio/</link>
      <guid isPermaLink="false">https://maksimgolub.com/posts/raspberry-pi-radio/</guid>
      <pubDate>Mon, 17 Aug 2026 13:15:03 +0300</pubDate>
      <description>Bluetooth to a Bose Link, a small interface for Radio Paradise, and AirPlay on top. Found parts, one weekend.</description>
      <content:encoded><![CDATA[<p>A little project a did over a weekend: found my old Raspberry PI -&gt; made it to connect to my another old road warrior Bose Link via bluetooth and set up a simple UI to play my all-time fav Radio Paradise and be able accept AirPlay connections too. It was neat and fun! 📻🎸</p>
<p><img src="/posts/media/raspberry-pi-radio/01.webp" alt="" loading="lazy" decoding="async" width="800" height="450" /></p>
<p><img src="/posts/media/raspberry-pi-radio/02.webp" alt="" loading="lazy" decoding="async" width="800" height="450" /></p>
<p><img src="/posts/media/raspberry-pi-radio/03.webp" alt="" loading="lazy" decoding="async" width="721" height="1280" /></p>
<p><img src="/posts/media/raspberry-pi-radio/04.webp" alt="" loading="lazy" decoding="async" width="800" height="1093" /></p>
]]></content:encoded>
    </item>
    <item>
      <title>Credentials stay behind an explicit approval step</title>
      <link>https://maksimgolub.com/posts/credentials-behind-approval/</link>
      <guid isPermaLink="false">https://maksimgolub.com/posts/credentials-behind-approval/</guid>
      <pubDate>Sun, 16 Aug 2026 22:54:20 +0300</pubDate>
      <description>The policy sits in the app, not in a prompt or a habit. Locking and unlocking by hand buys real peace of mind.</description>
      <content:encoded><![CDATA[<p>I have secure storage for sensitive data 🔐</p>
<p>When I delegate something to an agent and it needs to access credentials, I still run the action manually and approve it.</p>
<p>The cool part is that this isn’t just a habit or a prompt instruction. The policy is embedded directly into the app. It keeps sensitive actions behind an explicit approval step and reduces the chances of credentials or other sensitive data being compromised. Yeah, manual work to lock and unlock, but hey - peace of mind it gives outweights the hustle 🤓</p>
<p><img src="/posts/media/credentials-behind-approval/01.webp" alt="" loading="lazy" decoding="async" width="800" height="321" /></p>
]]></content:encoded>
    </item>
    <item>
      <title>The calendar as an operations layer for agents</title>
      <link>https://maksimgolub.com/posts/calendar-for-agents/</link>
      <guid isPermaLink="false">https://maksimgolub.com/posts/calendar-for-agents/</guid>
      <pubDate>Thu, 13 Aug 2026 16:18:29 +0300</pubDate>
      <description>It already tells me what happens when. The same timeline can schedule an agent and record what it actually did.</description>
      <content:encoded><![CDATA[<p>📆I already use my calendar to tell myself what should happen and when. So I started thinking: why should it only schedule me? An agent can have the same timeline. “Prepare this by 11.” “Run the migration at 1.” “Have the report ready before 4.” The calendar stops being just a collection of meetings and becomes a tiny operations layer for your whole virtual team. The nice part is that it can work both ways. Agents can read what is coming, do the work at the right moment, and update the event (or maybe relevant task) with what actually happened. You open the calendar and see not only what was planned, but what your little operating system has already done ✅</p>
<p><img src="/posts/media/calendar-for-agents/01.webp" alt="" loading="lazy" decoding="async" width="800" height="600" /></p>
]]></content:encoded>
    </item>
    <item>
      <title>Giving an agent a card, a limit and a ledger</title>
      <link>https://maksimgolub.com/posts/agents-that-can-pay/</link>
      <guid isPermaLink="false">https://maksimgolub.com/posts/agents-that-can-pay/</guid>
      <pubDate>Wed, 12 Aug 2026 09:45:07 +0300</pubDate>
      <description>An agent that stops at the payment step loses most of its value. Virtual cards, budgets and approvals fix that.</description>
      <content:encoded><![CDATA[<p>At some point an AI Chief of Staff needs more than access to your calendar and inbox. It needs resources. People, tools, and eventually money 💳 If I delegate a task like “book this”, “buy access to this API”, “pay this contractor”, or “renew this subscription”, having the agent stop at the payment step kills most of the value. So I’m experimenting with the idea of giving agents real payment capabilities: virtual cards, separate limits, approved vendors, spending categories, budgets, and human approval above a certain threshold. The agent becomes a payment proxy for the owner 🤖 It can spend $20 on an API, put down a restaurant deposit, pay for a small service, then automatically write everything into an expense ledger. This is where agents start becoming much more interesting to me. Not just software that recommends what to do -&gt; but software that can actually finish the job 💪 Obviously with limits, logs, controls and kill switches. But once AI can make small economic decisions on your behalf, a lot of workflows suddenly become much shorter ⚡</p>
<p><img src="/posts/media/agents-that-can-pay/01.webp" alt="" loading="lazy" decoding="async" width="800" height="999" /></p>
]]></content:encoded>
    </item>
    <item>
      <title>Speaking about Huffman coding at the School of Troubleshooters</title>
      <link>https://maksimgolub.com/posts/huffman-talk/</link>
      <guid isPermaLink="false">https://maksimgolub.com/posts/huffman-talk/</guid>
      <pubDate>Tue, 11 Aug 2026 12:26:28 +0300</pubDate>
      <description>A talk on the algorithm and the discussion around it. Nerve-racking, and worth doing again.</description>
      <content:encoded><![CDATA[<p>Had a great time speaking at the School of Troubleshooters about Huffman’s algorithm. It was definitely a bit nerve-racking, but also a lot of fun. Really enjoyed the experience and the discussion around the topic. Big thanks to Oleg Braginsky for having me! https://www.youtube.com/watch?v=h-7zfE_lp0w</p>
<p>P.S. You can switch the language to English on YouTube, and it will translate the talk in real time. What a time to be alive, right? 😊</p>
<p><img src="/posts/media/huffman-talk/01.webp" alt="" loading="lazy" decoding="async" width="160" height="90" /></p>
]]></content:encoded>
    </item>
    <item>
      <title>An assistant is a core plus the capabilities you plug in</title>
      <link>https://maksimgolub.com/posts/assistant-as-a-platform/</link>
      <guid isPermaLink="false">https://maksimgolub.com/posts/assistant-as-a-platform/</guid>
      <pubDate>Tue, 11 Aug 2026 09:15:01 +0300</pubDate>
      <description>The useful question stops being what the assistant can do and becomes which capability to add next.</description>
      <content:encoded><![CDATA[<p>I’ve started thinking about my AI assistant less as a single system and more as a modular platform. There is a core, and then there are capabilities you can plug in when you need them. Sometimes I build those tools myself, but often the better option is to reuse something that already exists and is good at one specific job.</p>
<p>A simple example is PDFs: I work with them a lot, and instead of writing another parser from scratch, I can plug in something like Firecrawl’s pdf-inspector. It can classify PDFs, extract structured text and tables, convert content to Markdown, and help decide when OCR is actually needed. The interesting part for me is not the library itself, but the pattern: today you add better PDF handling, tomorrow browser automation, payments, vision, audio, research, logistics, whatever your work requires.</p>
<p>This is one of the things I always liked about Linux: you start with the core and install the pieces you actually need. I think AI assistants are moving in the same direction. The useful question becomes less “what can my assistant do?” and more “what capability should I plug in next?” 🤖🤖</p>
<p><img src="/posts/media/assistant-as-a-platform/01.webp" alt="" loading="lazy" decoding="async" width="800" height="800" /></p>
]]></content:encoded>
    </item>
    <item>
      <title>Always go to the gemba</title>
      <link>https://maksimgolub.com/posts/always-go-to-the-gemba/</link>
      <guid isPermaLink="false">https://maksimgolub.com/posts/always-go-to-the-gemba/</guid>
      <pubDate>Sun, 09 Aug 2026 16:19:55 +0300</pubDate>
      <description>Ten minutes behind a counter teaches more than another hour of analytics. Selling it yourself teaches more again.</description>
      <content:encoded><![CDATA[<p>When I was building my side-hustle offline leather goods business back in 2018, I initially wanted to focus straight on e-commerce. But I quickly realised I was missing something important: seeing how real people actually react to the product. What they touch first, what they ask, what confuses them, what makes them hesitate. You learn more from ten minutes behind a counter than from another hour staring at analytics.</p>
<p>The second lesson was selling myself. Talking to people, negotiating, hearing “too expensive,” handling objections. It can be uncomfortable and sometimes painful, but that is exactly why it works. It is like the gym: muscles grow because you put them under load. The next day everything hurts, but after enough repetitions, you become stronger.</p>
<p>The photo is from a full day at a local fair: sales, conversations, questions, mini-interviews, and a notebook packed with customer feedback by the end of the day (my legs were soring as hell!)</p>
<p>Data is useful. Frameworks are useful. But they are still a proxy. Every now and then, leave the dashboard, go where the customer actually is, and sell something yourself 😎</p>
<p><img src="/posts/media/always-go-to-the-gemba/01.webp" alt="" loading="lazy" decoding="async" width="800" height="599" /></p>
<p><img src="/posts/media/always-go-to-the-gemba/02.webp" alt="" loading="lazy" decoding="async" width="800" height="599" /></p>
<p><img src="/posts/media/always-go-to-the-gemba/03.webp" alt="" loading="lazy" decoding="async" width="800" height="599" /></p>
<p><img src="/posts/media/always-go-to-the-gemba/04.webp" alt="" loading="lazy" decoding="async" width="800" height="599" /></p>
]]></content:encoded>
    </item>
    <item>
      <title>Heartbeat, the skill that wakes up and looks for work</title>
      <link>https://maksimgolub.com/posts/heartbeat-skill/</link>
      <guid isPermaLink="false">https://maksimgolub.com/posts/heartbeat-skill/</guid>
      <pubDate>Sun, 09 Aug 2026 02:12:46 +0300</pubDate>
      <description>Every few hours it checks activity, calendar and goals, then asks what it can move forward without being told.</description>
      <content:encoded><![CDATA[<p>One of the skills I added to my AI Chief of Staff is called Heartbeat. Every few hours it wakes up, looks at my recent activity, calendar and goals, then asks a simple question: is there anything useful I can move forward on my own? Maybe a follow-up was forgotten, a meeting needs preparation, a draft is sitting at 80%, or a goal has quietly gone nowhere (happens).</p>
<p>It reminds me a lot of loops in software: the system doesn’t need a new command every time. It keeps checking the environment, finding unfinished business and pushing things forward. This is where an AI assistant starts feeling less like a chatbot and more like an actual Chief of Staff 🤓</p>
<p><img src="/posts/media/heartbeat-skill/01.webp" alt="" loading="lazy" decoding="async" width="800" height="600" /></p>
]]></content:encoded>
    </item>
    <item>
      <title>A private clipboard for passing data on site</title>
      <link>https://maksimgolub.com/posts/private-clipboard/</link>
      <guid isPermaLink="false">https://maksimgolub.com/posts/private-clipboard/</guid>
      <pubDate>Wed, 05 Aug 2026 18:18:41 +0300</pubDate>
      <description>Client networks rarely make data exchange easy. A password protected clipboard on my own domain does.</description>
      <content:encoded><![CDATA[<p>When you work with a client onsite, there is not always a good way to exchange data. Sometimes it is security, limited access, or something equally inconvenient. For situations like this, I use a simple tool I built for myself: a private online clipboard where I can safely exchange data. It is password-protected, has a few additional safeguards, and works like a charm. Today, for example, I needed to pass a string to someone who only had a phone with no email or messenger. Old school, but they run their own business the way they want, and you have to respect that. I opened the clipboard on their phone, and my own domain looked legitimate enough for them to trust it. I copied the few things I needed and finished the task. Simple and useful, just the way I like it 😎</p>
<p>P.S: The text on screen is not from a real message, I do religiosly check screens I post hehe</p>
<p><img src="/posts/media/private-clipboard/01.webp" alt="" loading="lazy" decoding="async" width="800" height="415" /></p>
]]></content:encoded>
    </item>
    <item>
      <title>An agent deleted the document and nothing could recover it</title>
      <link>https://maksimgolub.com/posts/guardrails-are-common-sense/</link>
      <guid isPermaLink="false">https://maksimgolub.com/posts/guardrails-are-common-sense/</guid>
      <pubDate>Wed, 05 Aug 2026 10:30:02 +0300</pubDate>
      <description>Backups turned one bad action into an annoyance. The lesson was bigger: guardrails are not bureaucracy.</description>
      <content:encoded><![CDATA[<p>I’m a big believer in preparing for failure before it shows up 🤓</p>
<p>I run my own backup system. Even my clipboard has a long history (yups). Still, an agent managed to delete an important document. I pushed it hard, checked what it could recover, and the answer was basically: nothing. That was an unpleasant moment. It also made me think about the scarier version of the same story. What if this happened quietly, and nobody noticed until much later?</p>
<p>Backups and version history saved me from turning one bad action into a real disaster. But the lesson was bigger than recovery. In systems where agents can act on your behalf, guardrails are not bureaucracy. They are common sense. Approval layers, action logs, protected areas, clear policies. All the things that feel excessive right up until the moment something goes wrong.</p>
<p><img src="/posts/media/guardrails-are-common-sense/01.webp" alt="" loading="lazy" decoding="async" width="800" height="999" /></p>
<p><img src="/posts/media/guardrails-are-common-sense/02.webp" alt="" loading="lazy" decoding="async" width="800" height="566" /></p>
]]></content:encoded>
    </item>
    <item>
      <title>Rest is also work</title>
      <link>https://maksimgolub.com/posts/rest-is-also-work/</link>
      <guid isPermaLink="false">https://maksimgolub.com/posts/rest-is-also-work/</guid>
      <pubDate>Tue, 04 Aug 2026 14:32:08 +0300</pubDate>
      <description>Most of my notes get written while walking. Past a certain point, staring at the screen returns very little.</description>
      <content:encoded><![CDATA[<p>I can’t imagine life without movement.</p>
<p>As a proper computer nerd, I spend a lot of time sitting in front of a screen. But if you opened my Obsidian notes, you’d see that most of them were written on my phone, usually while walking somewhere. There is a separate story here about how I work in tech but still don’t trust clouds. Everything is self-hosted, homemade, following the old family recipe.</p>
<p>Most notes appear while I’m moving. I like walking, looking at nature, and letting my brain wander. This morning, I spent about twenty minutes standing on a bridge and staring into the water. My inner voice said: “jump in, it’s August after all” (haha, just kidding). There was a whole other world down there: ducks floating on the surface with bodies perfectly designed for it, small fish below them, bigger fish deeper down, all moving through a forest of algae slowly waving in the sunlight. Dragonflies flew above the water. I imagine something like this once helped Frank Herbert think of the ornithopters in Dune. 🌕 Sport works in a similar way. You focus on one thing and simply try to do it. You learn how your body works, or in my case, how it mostly doesn’t. You practise a serve, test different movements, and naturally think: I’m smart, I’ll figure this out immediately. Usually you don’t. Then suddenly you find one small physical clue: “Ah, that’s what the body was supposed to do.” And something clicks. That is the point I keep returning to: rest is also work. It is the work of defragmenting and reorganising your thoughts. You can stare at your screen for hours, but after a certain point, the return becomes very small 🤓🎾</p>
<p><img src="/posts/media/rest-is-also-work/01.webp" alt="" loading="lazy" decoding="async" width="800" height="1066" /></p>
]]></content:encoded>
    </item>
    <item>
      <title>Brief gives direction, debrief gives memory</title>
      <link>https://maksimgolub.com/posts/brief-and-debrief/</link>
      <guid isPermaLink="false">https://maksimgolub.com/posts/brief-and-debrief/</guid>
      <pubDate>Tue, 04 Aug 2026 14:02:46 +0300</pubDate>
      <description>One page in the morning on what deserves attention, a few lines at night on what actually changed.</description>
      <content:encoded><![CDATA[<p>We, as people don’t have an information problem. Usually, it is our focus.</p>
<p>The day starts, and before you know it, you are already inside the flow: messages, meetings, requests, updates, follow-ups. You become very good at processing everything, while the important things quietly drift away:</p>
<ul>
<li>goals; - promises; - key relationships; - strategic priorities; - projects that actually need attention.</li>
</ul>
<p>That is why I like the idea of a brief. Nice and neat one pager that tells you what deserves attention today or this week:</p>
<ul>
<li>what is blocked; - what matters most; - what you promised; - what you may be missing; - who you need to talk to; - which decisions are waiting;</li>
</ul>
<p>Part two. Then comes the debrief. This is where you add back the things the system cannot fully see from Slack, email, or meetings: what shipped, what changed, what moved a metric, what brought revenue, what got stuck, what you learned. Even a few short notes at the end of the day are useful. Brief gives you direction. Debrief gives the system memory. Together, they create a much better operating rhythm.</p>
<p>And the last part, which is similar to debief is a weekly report. Now, here is the trick, you don’t need to see what you did, but instead - what excatly changed because of your actions. This is, in fact, a powerplay - you will see the impact, not list of the tasks, and it will launch this loop and help with focusing on things that matter.</p>
<p>Cheers! 💚</p>
<p><img src="/posts/media/brief-and-debrief/01.webp" alt="" loading="lazy" decoding="async" width="800" height="999" /></p>
<p><img src="/posts/media/brief-and-debrief/02.webp" alt="" loading="lazy" decoding="async" width="800" height="999" /></p>
<p><img src="/posts/media/brief-and-debrief/03.webp" alt="" loading="lazy" decoding="async" width="800" height="999" /></p>
]]></content:encoded>
    </item>
    <item>
      <title>Company research as a repeatable script</title>
      <link>https://maksimgolub.com/posts/research-as-a-script/</link>
      <guid isPermaLink="false">https://maksimgolub.com/posts/research-as-a-script/</guid>
      <pubDate>Sun, 02 Aug 2026 18:40:34 +0300</pubDate>
      <description>The same questions in the same order, then a lens on top. That is the difference between a dossier and a move.</description>
      <content:encoded><![CDATA[<p>I’ve been thinking about company research less as an “AI skill” and more as a repeatable script. Hype comes and goes. What stays useful is a structure that can consistently answer the same questions: what this company is -&gt; who built it -&gt; how it makes money -&gt; what people are inside it -&gt; what it has done so far -&gt; what it is likely to do next -&gt; and who it is connected to.</p>
<p>The same approach works for people too. If you’re evaluating a founder,candidate or competitor, the job is similar: collect the right signals and turn them into something readable ~ actionable.</p>
<p>The interesting part starts after the collection. Raw research is only the base layer. The real value appears when you put a lens on top of it. In one case, that lens is competitive intelligence: where they are strong or weak, what share of the market they might control, what they do better than you, what can be borrowed, and where they are exposed. Suddenly the output is no longer “here is a dossier.” It becomes “here is what matters, here is what to watch, and here is what to do next.”</p>
<p>That is why I like building these systems as living maps. A company should be seen in context: against other companies, people, markets, and places. Once you do that, research stops being a background task and becomes an operating tool. Good intelligence is not about admiring the data. It is about making better moves from it.</p>
<p><img src="/posts/media/research-as-a-script/01.webp" alt="" loading="lazy" decoding="async" width="800" height="800" /></p>
]]></content:encoded>
    </item>
    <item>
      <title>A last checkpoint before anything becomes public</title>
      <link>https://maksimgolub.com/posts/gatekeeper/</link>
      <guid isPermaLink="false">https://maksimgolub.com/posts/gatekeeper/</guid>
      <pubDate>Thu, 30 Jul 2026 10:45:02 +0300</pubDate>
      <description>The problem is never a lack of care. It is volume. A scanner on outgoing files catches what you stopped checking.</description>
      <content:encoded><![CDATA[<p>It doesn’t matter whether you work alone or inside a large company. Anything you publish, from a repository to a screenshot or document, can contain something that should never leave your system: an API key, server details, vendor data, internal context, or PII (I cannot help but recall a local mem with one of the company - “It’s P2!” - if you read this and you know, then you know 🤓)</p>
<p>Anyways, the problem is rarely a lack of care -&gt; It is rather volume and confidence. When you handle enough files, reports, commits and screenshots, sooner or later you stop checking every detail as carefully as you think you do.</p>
<p>That is why I like the idea of a Gatekeeper: a final layer that scans outgoing information, flags sensitive content and asks for a second look before anything becomes public. It will never replace human judgement, and it should not. Its job is simpler: catch the things you missed. The more information you produce, the more useful that last checkpoint becomes.</p>
<p><img src="/posts/media/gatekeeper/01.webp" alt="" loading="lazy" decoding="async" width="800" height="566" /></p>
]]></content:encoded>
    </item>
  </channel>
</rss>