<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Viktor Vítovec</title>
    <description>The latest articles on DEV Community by Viktor Vítovec (@vvitovec).</description>
    <link>https://dev.to/vvitovec</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4011130%2Fda83bf1c-6ad3-4adc-a172-d0d9370b1f83.jpeg</url>
      <title>DEV Community: Viktor Vítovec</title>
      <link>https://dev.to/vvitovec</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vvitovec"/>
    <language>en</language>
    <item>
      <title>The AI Wasn't Cheating. It Was Maximizing Its Score.</title>
      <dc:creator>Viktor Vítovec</dc:creator>
      <pubDate>Mon, 10 Aug 2026 11:55:19 +0000</pubDate>
      <link>https://dev.to/vvitovec/the-ai-wasnt-cheating-it-was-maximizing-its-score-8o7</link>
      <guid>https://dev.to/vvitovec/the-ai-wasnt-cheating-it-was-maximizing-its-score-8o7</guid>
      <description>&lt;p&gt;Today, while reading Brian Christian's &lt;a href="https://wwnorton.com/books/9780393635836" rel="noopener noreferrer"&gt;&lt;em&gt;The Alignment Problem&lt;/em&gt;&lt;/a&gt;, I came across a paragraph that made me stop. The book was published in October 2020, before ChatGPT and the current wave of AI agents. Yet it described something that played out almost literally in July 2026.&lt;/p&gt;

&lt;p&gt;It did not predict a specific model or company. It described a much broader problem: what can happen when we give a very capable system a clear goal without fully capturing the limits on how it should pursue that goal.&lt;/p&gt;

&lt;h2&gt;
  
  
  What &lt;em&gt;The Alignment Problem&lt;/em&gt; is about
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;The Alignment Problem: Machine Learning and Human Values&lt;/em&gt; is not a programming manual or a collection of dramatic science-fiction scenarios. It is an accessible book about how machines learn, and why making their behavior match what people actually want is so difficult.&lt;/p&gt;

&lt;p&gt;Brian Christian tells that story through the work of real researchers. He covers biased training data, reward systems, human feedback, imitation, transparency, and attempts to teach machines how to deal with uncertainty. The book is not only concerned with some distant superintelligence. Much of it is about failures we already see in ordinary algorithms: a system succeeds at the thing we can easily measure while missing the human intention behind it.&lt;/p&gt;

&lt;p&gt;That gap is the alignment problem. Telling a machine what number to maximize is relatively easy. Translating messy human values, expectations, and boundaries into something it can reliably follow is much harder. People often cannot describe every important rule in advance either. The book therefore does not offer one neat fix. It shows why the problem is difficult and follows the different approaches researchers have taken to it.&lt;/p&gt;

&lt;h2&gt;
  
  
  A sentence from 2020
&lt;/h2&gt;

&lt;p&gt;On page 210, Christian compares an agent that maximizes a score with one motivated by seeking new knowledge. The problem with a score is fairly simple: if a shortcut increases the reward, a capable enough system may find it.&lt;/p&gt;

&lt;p&gt;The line that stayed with me comes from researcher Laurent Orseau: &lt;strong&gt;“It doesn't have a sense of cheating. It's just, ‘Well, I do actions to maximize my reward.’”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That distinction matters. We see cheating because we understand what the rules are for. The system may only see another successful route to the result. It does not need to decide to be evil or deliberately rebel. It can try different actions, discover that one works, and keep moving toward the goal.&lt;/p&gt;

&lt;p&gt;The book contrasts this with pure knowledge-seeking. If a knowledge-seeking agent edits its own observations and creates a comfortable illusion, it learns nothing new, so the shortcut gives it no benefit. That is not a magic safety solution either. Christian immediately points out that a highly capable knowledge-seeker could instead start taking real-world resources in pursuit of more information. Different goals can create different shortcuts.&lt;/p&gt;

&lt;h2&gt;
  
  
  What ExploitGym actually tests
&lt;/h2&gt;

&lt;p&gt;To understand the incident, it helps to understand the test first. &lt;a href="https://www.cybergym.io/exploitgym/" rel="noopener noreferrer"&gt;ExploitGym&lt;/a&gt; is a benchmark: a standardized set of tasks used to compare how well different AI models perform at one specific capability. Here, that capability is turning a known software vulnerability into a working exploit.&lt;/p&gt;

&lt;p&gt;The model is not simply told to “hack something on the internet.” It receives a deliberately vulnerable program inside a controlled environment, along with information showing that the bug exists. Its job is to go further: understand the weakness and build an exploit that can, for example, retrieve a secret test value or execute code inside that environment. The more tasks it can genuinely complete, the higher its score.&lt;/p&gt;

&lt;p&gt;Public AI products normally have safety layers designed to refuse or stop dangerous cybersecurity requests. If those safeguards stayed fully active during this kind of evaluation, however, researchers could not tell whether a model lacked the technical ability or was simply refusing to use it. To measure the models' maximum capability, OpenAI deliberately reduced some of its normal production protections during this internal test.&lt;/p&gt;

&lt;p&gt;That was not supposed to give the models permission to attack the real internet. The dangerous work was meant to remain inside an isolated test environment containing prepared targets. Think of a car crash test: some assistance systems may be disabled so researchers can observe what really happens in a collision, but the test still takes place on a closed track. In this incident, the boundary around that track turned out to be weaker than expected.&lt;/p&gt;

&lt;h2&gt;
  
  
  What happened at Hugging Face
&lt;/h2&gt;

&lt;p&gt;In July 2026, OpenAI was running ExploitGym with a combination of GPT-5.6 Sol and a more capable unreleased model. When the agent system failed to solve some tasks through the expected route, it began looking for another way forward.&lt;/p&gt;

&lt;p&gt;It found a previously unknown vulnerability in part of the evaluation infrastructure and used it to reach the open internet. It then inferred that Hugging Face might store data, models, or solutions connected to ExploitGym. Instead of continuing to work on the tasks themselves, it started looking for the answers.&lt;/p&gt;

&lt;p&gt;By chaining several additional weaknesses, the system reached Hugging Face's production infrastructure and obtained test solutions from a database. &lt;a href="https://openai.com/index/hugging-face-model-evaluation-security-incident/" rel="noopener noreferrer"&gt;OpenAI's account of the incident&lt;/a&gt; says the models were intensely focused on the narrow goal of succeeding at ExploitGym. &lt;a href="https://huggingface.co/blog/agent-intrusion-technical-timeline" rel="noopener noreferrer"&gt;Hugging Face's reconstruction&lt;/a&gt; describes roughly 17,600 actions over several days and characterizes the campaign as an apparent attempt to bypass the intended test and retrieve its solutions.&lt;/p&gt;

&lt;p&gt;The agent was never instructed to attack Hugging Face. It was given a target outcome, tools, and room to keep trying. Another company's real production system became a path to a better score. At that point, the sentence from the book stops feeling theoretical.&lt;/p&gt;

&lt;h2&gt;
  
  
  This does not mean every model wants to cheat
&lt;/h2&gt;

&lt;p&gt;It would be easy to turn this into a story about an AI deciding to escape and cause harm. That would be misleading. The model did not need a secret plan or a human understanding of cheating. It was also being tested specifically on advanced exploitation, with some normal safety barriers reduced to measure capability.&lt;/p&gt;

&lt;p&gt;Humans and infrastructure remain a major part of the story. The evaluation environment was supposed to be isolated. The path out existed because of real vulnerabilities, overly broad access, and several weaknesses that could be connected.&lt;/p&gt;

&lt;p&gt;The parallel with the book still holds at the level of behavior: &lt;strong&gt;a capable system, a narrow measurable goal, and an environment with an unexpected shortcut are a dangerous combination.&lt;/strong&gt; The better an AI becomes at finding new routes to a result, the less we can assume it will also understand our unstated intention.&lt;/p&gt;

&lt;h2&gt;
  
  
  A score is not the same as intent
&lt;/h2&gt;

&lt;p&gt;This problem is not new. We used to see it mostly in simple demonstrations. A game-playing agent could drive in circles collecting points instead of finishing the race. A cleaning robot could hide a mess instead of cleaning it. A coding agent could change a test so that it passes instead of fixing the code.&lt;/p&gt;

&lt;p&gt;Today's agents have far more room to act. They can write and run code, use tools, and combine a long chain of small actions into one result. That is why checking only the final answer or score is no longer enough. A correct result can still come from a completely wrong process.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I take from this when building with agents
&lt;/h2&gt;

&lt;p&gt;I use AI agents every day across my &lt;a href="https://www.vvitovec.com/en/projects" rel="noopener noreferrer"&gt;projects&lt;/a&gt;. This incident is not a reason to stop using them. It is a very good reason not to trust a result just because it ends with a green checkmark.&lt;/p&gt;

&lt;p&gt;In practice, that means watching the route to the result, giving agents only the access they need, and verifying consequential actions independently. If we create a task that cannot be completed honestly, we also have to consider that a capable system may not search for a better answer. It may search for a loophole.&lt;/p&gt;

&lt;p&gt;Brian Christian wrote about this before ChatGPT and today's terminal-operating agents. Six years later, it is no longer just a clever thought experiment. &lt;strong&gt;The alignment problem is not only in the goal we give an AI. It is also in every path we leave open while it pursues that goal.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>aisafety</category>
      <category>aiagents</category>
      <category>cybersecurity</category>
    </item>
    <item>
      <title>PQC migration does not start by replacing an algorithm</title>
      <dc:creator>Viktor Vítovec</dc:creator>
      <pubDate>Mon, 03 Aug 2026 01:25:49 +0000</pubDate>
      <link>https://dev.to/vvitovec/pqc-migration-does-not-start-by-replacing-an-algorithm-g8f</link>
      <guid>https://dev.to/vvitovec/pqc-migration-does-not-start-by-replacing-an-algorithm-g8f</guid>
      <description>&lt;p&gt;In &lt;a href="https://www.vvitovec.com/en/blog/quantum-problem-starts-before-quantum-computer" rel="noopener noreferrer"&gt;part one&lt;/a&gt;, I explained why the quantum problem starts before a sufficiently powerful quantum computer arrives. Data lives for years, and large cryptographic changes take years too.&lt;/p&gt;

&lt;p&gt;Now for the more practical question: &lt;strong&gt;what should a company actually do first?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The obvious answer is usually “deploy a post-quantum algorithm.” But that is a little like starting a move by ordering a new sofa. You may need one, but it helps to know where you are moving, what you already own, and whether it fits through the door.&lt;/p&gt;

&lt;p&gt;PQC migration does not start by replacing an algorithm. It starts with an inventory.&lt;/p&gt;

&lt;h2&gt;
  
  
  An algorithm is only one part of the system
&lt;/h2&gt;

&lt;p&gt;NIST has already standardized ML-KEM, ML-DSA, and SLH-DSA. The hardest part is not inventing our own cryptography. I would strongly recommend not doing that.&lt;/p&gt;

&lt;p&gt;The hard part is putting the change into a real product without breaking compatibility, performance, or trust between systems.&lt;/p&gt;

&lt;p&gt;Classical public-key cryptography may live in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;TLS and internal PKI,&lt;/li&gt;
&lt;li&gt;application, container, firmware, and update signing,&lt;/li&gt;
&lt;li&gt;VPNs, SSH, email, and authentication,&lt;/li&gt;
&lt;li&gt;API tokens and identity systems,&lt;/li&gt;
&lt;li&gt;mobile and embedded devices,&lt;/li&gt;
&lt;li&gt;HSMs and secure elements,&lt;/li&gt;
&lt;li&gt;libraries, cloud platforms, and third-party products.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Some things can be changed through configuration. Others will need new hardware, firmware, a certificate authority, a protocol change, or a vendor commitment. Some will need to run in a hybrid mode for a long time because an entire ecosystem will not switch on the same day.&lt;/p&gt;

&lt;p&gt;That is why blind algorithm search-and-replace is a bad start. Without context, you do not know whether you fixed the biggest risk or only the easiest line of code.&lt;/p&gt;

&lt;h2&gt;
  
  
  What belongs in a cryptographic inventory
&lt;/h2&gt;

&lt;p&gt;An inventory is not a spreadsheet with two columns called &lt;code&gt;RSA&lt;/code&gt; and &lt;code&gt;yes/no&lt;/code&gt;. To support decisions, it needs to connect technical evidence with context.&lt;/p&gt;

&lt;p&gt;For every important item, I would want to know at least:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;what it is&lt;/strong&gt; — an algorithm, certificate, protocol, library, key, or device,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;where it is&lt;/strong&gt; — a repository, service, endpoint, product, or vendor component,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;what it does&lt;/strong&gt; — encryption, key establishment, signing, identity, or code signing,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;who owns it&lt;/strong&gt; — a specific team, vendor, or operational role,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;how long the data must remain protected&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;how critical and exposed the system is&lt;/strong&gt;,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;how difficult the change will be&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://pages.nist.gov/nccoe-migration-post-quantum-cryptography/" rel="noopener noreferrer"&gt;NIST NCCoE now describes cryptographic visibility and risk management&lt;/a&gt; as one of the core PQC migration workstreams. Its current guidance starts with discovery and inventory because an organization cannot effectively prioritize cryptography it has not found.&lt;/p&gt;

&lt;h2&gt;
  
  
  How PQC Radar approaches it
&lt;/h2&gt;

&lt;p&gt;I am building &lt;a href="https://pqc-radar.com/en" rel="noopener noreferrer"&gt;PQC Radar&lt;/a&gt; around this logic. Not as a button that produces a “quantum safety” percentage after one scan, but as a controlled process from uncertainty to a decision.&lt;/p&gt;

&lt;p&gt;A sensible first pass looks like this to me:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Scope one product
&lt;/h3&gt;

&lt;p&gt;Do not try to map the whole company on day one. Choose one important product, service, or trust chain with a clear owner and business reason.&lt;/p&gt;

&lt;p&gt;The scope may include two representative repositories, approved TLS endpoints, a certificate export, and one signing or update flow. That is enough to build a useful picture, but still small enough to avoid turning the work into an endless audit.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Collect technical signals
&lt;/h3&gt;

&lt;p&gt;PQC Radar inspects repositories, certificates, and explicitly authorized network targets. It looks for classical public-key algorithms, TLS configuration, cryptographic libraries, certificate files, signing scripts, and other signals.&lt;/p&gt;

&lt;p&gt;The result is not only a list of strings found by a regular expression. Each finding includes evidence, a confidence level, an explanation of its quantum relevance, a recommendation, and notes about possible false positives. Sensitive values are redacted; private keys and tokens do not belong in the output.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Validate findings with owners
&lt;/h3&gt;

&lt;p&gt;This is the part no scanner can do alone.&lt;/p&gt;

&lt;p&gt;Code may contain RSA because of an old test. A certificate may protect a public marketing page with no long-lived sensitive data. A library may be a dependency but never be used. At the same time, the most critical signing process may live inside an HSM or a vendor product and leave almost no trace in the repository.&lt;/p&gt;

&lt;p&gt;Automated discovery makes the work faster. People provide the context.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Prioritize risk
&lt;/h3&gt;

&lt;p&gt;The algorithm alone does not determine priority. The same use of RSA may be a low priority in a temporary internal tool and a high priority in a long-lived product protecting sensitive data or signing firmware.&lt;/p&gt;

&lt;p&gt;It therefore makes sense to consider data lifetime, business criticality, external exposure, ownership, and migration difficulty. The goal is not to produce as many red findings as possible. The goal is to know what to fund and fix first.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Build a roadmap and vendor questions
&lt;/h3&gt;

&lt;p&gt;For some items in the inventory, the next step will not be “change the code.” It will be “ask the vendor.”&lt;/p&gt;

&lt;p&gt;Does the product support ML-KEM or ML-DSA? What is its migration plan? Will it support hybrid deployment? Does the change require new hardware? What happens to old signatures, archives, and devices already in the field?&lt;/p&gt;

&lt;p&gt;A good first output is therefore more than a technical backlog. It should include owners, validation steps, vendor questions, and a 30/60/90-day plan.&lt;/p&gt;

&lt;h2&gt;
  
  
  Crypto agility is bigger than PQC
&lt;/h2&gt;

&lt;p&gt;There is another reason I like this work. Even if estimates for when a powerful quantum computer might arrive keep changing, a good cryptographic inventory and the ability to replace algorithms are not wasted effort.&lt;/p&gt;

&lt;p&gt;Cryptography changes without quantum computers too. Vulnerabilities appear, parameters weaken, standards evolve, regulations change, and vendors end support. &lt;a href="https://csrc.nist.gov/pubs/cswp/39/upd1/considerations-for-achieving-crypto-agility/final" rel="noopener noreferrer"&gt;NIST calls the ability to manage these changes crypto agility&lt;/a&gt;: replacing and adapting cryptographic algorithms across applications, protocols, hardware, and infrastructure while preserving security and operations.&lt;/p&gt;

&lt;p&gt;PQC is a large test of that ability. If a company cannot say where cryptography is used today, every future transition will be more expensive and slower than it needs to be.&lt;/p&gt;

&lt;h2&gt;
  
  
  What PQC Radar does not promise
&lt;/h2&gt;

&lt;p&gt;I want to be precise about this. One readiness sprint is not a complete cryptographic audit of an entire organization. A scanner cannot see everything. Heuristic findings require manual validation. And the result is not a certificate that a product is quantum safe.&lt;/p&gt;

&lt;p&gt;PQC Radar is meant to deliver something more practical:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;a defensible initial inventory for an approved scope,&lt;/li&gt;
&lt;li&gt;prioritization based on real context,&lt;/li&gt;
&lt;li&gt;a CBOM-style export and finding evidence,&lt;/li&gt;
&lt;li&gt;questions for internal teams and vendors,&lt;/li&gt;
&lt;li&gt;a roadmap that people can actually start working through.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I think that is the right first step. Not because it completes the entire migration in two weeks, but because it replaces the worst state — uncertainty — with a concrete list of decisions.&lt;/p&gt;

&lt;p&gt;Post-quantum migration does not begin when someone adds a new algorithm to the backlog. It begins when an organization can say: &lt;strong&gt;we know what protects our data, we know who owns it, and we know what should change first.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is exactly what &lt;a href="https://pqc-radar.com/en" rel="noopener noreferrer"&gt;PQC Radar&lt;/a&gt; is meant to help with.&lt;/p&gt;

</description>
      <category>pqc</category>
      <category>security</category>
      <category>cryptography</category>
      <category>pqcradar</category>
    </item>
    <item>
      <title>The quantum problem starts before the quantum computer arrives</title>
      <dc:creator>Viktor Vítovec</dc:creator>
      <pubDate>Mon, 03 Aug 2026 01:25:38 +0000</pubDate>
      <link>https://dev.to/vvitovec/the-quantum-problem-starts-before-the-quantum-computer-arrives-36bh</link>
      <guid>https://dev.to/vvitovec/the-quantum-problem-starts-before-the-quantum-computer-arrives-36bh</guid>
      <description>&lt;p&gt;When someone says “quantum computer,” it still sounds like a problem from the future. Something that might eventually arrive, break RSA, and give us a reason to deal with it.&lt;/p&gt;

&lt;p&gt;That is not how cryptographic migration works. &lt;strong&gt;The quantum problem does not start on the day someone builds a sufficiently powerful machine. It starts when data needs to stay secret for longer than the transition to new cryptography will take.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;No quantum computer can practically break RSA or elliptic-curve cryptography today. I do not want to turn this into a countdown to disaster. It still makes sense to start now.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data can outlive the system protecting it
&lt;/h2&gt;

&lt;p&gt;Plenty of data loses its value quickly. A one-time code or a short-lived operational message may not be sensitive ten years from now.&lt;/p&gt;

&lt;p&gt;Other data will remain valuable. Medical records, product know-how, long-term contracts, financial information, identity data, government communication, or information from products with long life cycles can remain valuable far into the future.&lt;/p&gt;

&lt;p&gt;This is where &lt;strong&gt;harvest now, decrypt later&lt;/strong&gt; comes in. An attacker does not need to break today's encryption today. Capturing the traffic, storing it, and waiting for better tools may be enough. The joint &lt;a href="https://www.cisa.gov/sites/default/files/2023-08/Quantum%20Readiness_Final_CLEAR_508c%20%283%29.pdf" rel="noopener noreferrer"&gt;CISA, NSA, and NIST quantum-readiness guidance&lt;/a&gt; connects PQC preparation not only to future quantum capability, but also to data lifetime, inventory work, and vendor engagement.&lt;/p&gt;

&lt;p&gt;That is the important shift for me. The question is not only &lt;em&gt;when will a quantum computer be strong enough?&lt;/em&gt; It is also &lt;em&gt;how long must my data remain protected?&lt;/em&gt; and &lt;em&gt;how long will it take me to change the systems protecting it?&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The standards are no longer theoretical
&lt;/h2&gt;

&lt;p&gt;There is another, much less dramatic reason to work on this now: we have something concrete to work with.&lt;/p&gt;

&lt;p&gt;In August 2024, NIST finalized its first three post-quantum cryptography standards:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;FIPS 203 / ML-KEM&lt;/strong&gt; for establishing shared secrets,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FIPS 204 / ML-DSA&lt;/strong&gt; for digital signatures,&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;FIPS 205 / SLH-DSA&lt;/strong&gt; for hash-based digital signatures.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://www.nist.gov/cybersecurity-and-privacy/what-post-quantum-cryptography" rel="noopener noreferrer"&gt;NIST now encourages organizations to begin the transition&lt;/a&gt;, including inventorying systems that use encryption and talking to vendors about the change.&lt;/p&gt;

&lt;p&gt;That does not mean replacing RSA with ML-KEM everywhere tomorrow. It means PQC is no longer only an academic algorithm competition. The standards exist, and the less exciting work begins: finding where current cryptography is used and understanding what can actually be changed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cryptography is everywhere, but it is rarely visible
&lt;/h2&gt;

&lt;p&gt;When I got deeper into this topic, the most interesting part was not the quantum computer itself. It was the mess around today's cryptography.&lt;/p&gt;

&lt;p&gt;It sits in TLS certificates, application and firmware signing, JWT flows, VPNs, libraries, HSMs, mobile apps, devices, cloud services, and vendor products. Some of it is directly in code. Some is hidden in configuration. Some has no clear internal owner because a vendor set it up years ago and it has worked ever since.&lt;/p&gt;

&lt;p&gt;While everything works, there is little reason to notice it. But an algorithm migration is not one package update. It can affect key and signature sizes, certificates, protocols, hardware, performance, compatibility, and the entire chain of trust.&lt;/p&gt;

&lt;p&gt;The biggest problem may not be the old algorithm. &lt;strong&gt;It may be the fact that nobody knows exactly where it is or who can change it.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  That is why I am building PQC Radar
&lt;/h2&gt;

&lt;p&gt;This is where &lt;a href="https://pqc-radar.com/en" rel="noopener noreferrer"&gt;PQC Radar&lt;/a&gt; came from. Its purpose is not to put a “quantum safe” badge on a company. That would be a very bold claim today.&lt;/p&gt;

&lt;p&gt;I want it to provide a practical first step: inspect an approved scope, find signals of classical public-key cryptography, build an initial cryptographic inventory, and turn it into priorities that make sense both technically and commercially.&lt;/p&gt;

&lt;p&gt;PQC Radar can look for things such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;RSA, ECDSA, ECDH, Ed25519, and other classical algorithms in repositories,&lt;/li&gt;
&lt;li&gt;certificates, signature algorithms, keys, and expiry dates,&lt;/li&gt;
&lt;li&gt;explicitly authorized public TLS endpoints,&lt;/li&gt;
&lt;li&gt;signing, PKI, and other cryptographic dependencies,&lt;/li&gt;
&lt;li&gt;evidence for a CBOM-style inventory and later manual validation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is discovery, not magic. A heuristic scan cannot understand the whole business context, and a finding in code does not prove that the path runs in production. Automated collection therefore needs validation by the people who actually own the product.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would ask first
&lt;/h2&gt;

&lt;p&gt;If I were responsible for a long-lived product today, I would not start with “how quickly can we deploy ML-KEM?” I would start with much more boring questions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which data must stay confidential for five, ten, or twenty years?&lt;/li&gt;
&lt;li&gt;Where do we use RSA, ECC, Diffie-Hellman, or digital signatures?&lt;/li&gt;
&lt;li&gt;Which dependencies do we control, and which belong to a vendor?&lt;/li&gt;
&lt;li&gt;How do we sign software, firmware, and updates?&lt;/li&gt;
&lt;li&gt;Who owns the migration if a change is required?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are not questions for a cryptographer alone. They cross architecture, security, engineering, procurement, risk, and company leadership.&lt;/p&gt;

&lt;p&gt;PQC matters not because the internet will stop working tomorrow. It matters because large cryptographic changes take years, and the worst possible starting point is &lt;strong&gt;“we do not know what we have.”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In &lt;a href="https://www.vvitovec.com/en/blog/pqc-migration-starts-with-inventory" rel="noopener noreferrer"&gt;part two&lt;/a&gt;, I will get more practical: how to build the first cryptographic inventory and turn it into a migration roadmap without starting a giant audit of everything.&lt;/p&gt;

</description>
      <category>pqc</category>
      <category>security</category>
      <category>cryptography</category>
      <category>quantumcomputing</category>
    </item>
    <item>
      <title>Codex Needed Better Subagent Control. So I Built It.</title>
      <dc:creator>Viktor Vítovec</dc:creator>
      <pubDate>Wed, 15 Jul 2026 07:02:18 +0000</pubDate>
      <link>https://dev.to/vvitovec/codex-subagents-are-almost-great-so-i-finished-the-orchestration-layer-myself-1lkk</link>
      <guid>https://dev.to/vvitovec/codex-subagents-are-almost-great-so-i-finished-the-orchestration-layer-myself-1lkk</guid>
      <description>&lt;p&gt;I use Codex every day, and subagents are one of those features where the potential is immediately obvious. They can already work in parallel, use custom roles, and load their own configuration. But once I wanted precise control over model choice, reasoning effort, and a larger queue of jobs, I started hitting differences between the various Codex surfaces.&lt;/p&gt;

&lt;p&gt;So I built my own orchestration layer. Not as a replacement for Codex, but as a more programmatic layer on top of it.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Codex can already do
&lt;/h2&gt;

&lt;p&gt;Native Codex subagents are not a toy. The current &lt;a href="https://developers.openai.com/codex/subagents" rel="noopener noreferrer"&gt;official documentation&lt;/a&gt; describes the built-in &lt;code&gt;default&lt;/code&gt;, &lt;code&gt;worker&lt;/code&gt;, and &lt;code&gt;explorer&lt;/code&gt; roles, custom agents in &lt;code&gt;.codex/agents/*.toml&lt;/code&gt;, thread limits, and per-agent settings for the model, &lt;code&gt;model_reasoning_effort&lt;/code&gt;, sandbox, MCP servers, and skills.&lt;/p&gt;

&lt;p&gt;Codex can spawn a child, wait for it, send follow-up instructions, interrupt it, and bring its result back to the lead agent. For large repetitive workloads, there is also an experimental &lt;code&gt;spawn_agents_on_csv&lt;/code&gt; flow that creates a worker per row and collects structured results into another CSV.&lt;/p&gt;

&lt;p&gt;That is a strong base. The problem is not that Codex lacks subagents. The problem is that capabilities still vary between the desktop app, CLI, tool-backed sessions, and experimental modes. Something that can be expressed in a custom-agent TOML is not necessarily exposed with the same reliability as a dynamic choice on every spawn surface.&lt;/p&gt;

&lt;h2&gt;
  
  
  V1 and V2 subagents in Codex
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;V1&lt;/code&gt; and &lt;code&gt;V2&lt;/code&gt; are not two variants documented as such in the user-facing docs. They are names for two implementations in the &lt;code&gt;openai/codex&lt;/code&gt; upstream.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;V1 is the stable path today.&lt;/strong&gt; A lead agent starts child threads, waits for results, and can steer them afterward. Current upstream V1 can pass &lt;code&gt;model&lt;/code&gt; and &lt;code&gt;reasoning_effort&lt;/code&gt; directly at spawn time, while custom-agent TOML can pin them. My particular tool-backed desktop session did not expose those fields in its &lt;code&gt;spawn_agent&lt;/code&gt; schema; it only offered the task name, prompt, and context-fork mode. The limitation is therefore not universal to Codex core, but an inconsistency between surfaces.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;V2 is a more ambitious orchestration rebuild.&lt;/strong&gt; It is built around canonical task paths, direct &lt;code&gt;send_message&lt;/code&gt;, &lt;code&gt;followup_task&lt;/code&gt;, and &lt;code&gt;list_agents&lt;/code&gt; tools, and more granular &lt;code&gt;fork_turns&lt;/code&gt; control (&lt;code&gt;none&lt;/code&gt;, &lt;code&gt;all&lt;/code&gt;, or the last N turns). It remains behind a feature flag and is marked &lt;code&gt;UnderDevelopment&lt;/code&gt; upstream. A full-history fork intentionally rejects a different &lt;code&gt;agent_type&lt;/code&gt;, &lt;code&gt;model&lt;/code&gt;, or &lt;code&gt;reasoning_effort&lt;/code&gt;; a child with a different role, model, or effort therefore needs a clean or partial fork. OpenAI collaborators have additionally said in &lt;a href="https://github.com/openai/codex/issues/26753" rel="noopener noreferrer"&gt;GitHub issue discussions&lt;/a&gt; — not in the official docs — that V2 is not yet recommended for stable use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Neither version is a good interface for precisely controlled orchestration yet.&lt;/strong&gt; Not because they cannot split up work, but because I do not get reliable control over the model, reasoning effort, and token budget of every child across all Codex surfaces. Upstream supports some of those choices, but product workflows can still lock them, hide them, or take over the decision for me.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Ultra&lt;/code&gt; is an even more interesting case. &lt;a href="https://openai.com/index/gpt-5-6/" rel="noopener noreferrer"&gt;OpenAI describes it&lt;/a&gt; as a multi-agent mode that coordinates four agents in parallel by default. It can therefore burn through tokens like almost nothing else, especially once a task starts branching. I would not claim that it is literally the public Codex &lt;code&gt;multi_agent_v2&lt;/code&gt; implementation, or that Ultra subagents recursively spawn more Ultra subagents, because OpenAI has not publicly confirmed either point. The practical limitation is the same either way: I can see the result of very powerful orchestration, but I do not get reliable per-child control over model, effort, depth, and budget.&lt;/p&gt;

&lt;p&gt;This area changes quickly. Treat this section as a snapshot from July 13, 2026, not a permanent verdict on Codex.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I was missing
&lt;/h2&gt;

&lt;p&gt;I wanted the strongest model to act as a control plane: understand the project, split the work, choose the right worker, and verify the integrated result. I did not want every mechanical scan or routine check to inherit the most expensive model at an extreme reasoning setting.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The main point is to use the smartest model as the orchestrator and weaker, faster, cheaper models as workers.&lt;/strong&gt; The orchestrator should spend its intelligence on architecture, delegation, and verification; workers should execute tightly scoped jobs at a sensible cost. Without my layer, I cannot reliably assemble and control that hierarchy dynamically across the different Codex surfaces today.&lt;/p&gt;

&lt;p&gt;More specifically, I wanted to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;select the model and effort per job instead of hoping the runtime picked what I meant;&lt;/li&gt;
&lt;li&gt;keep feeding a queue programmatically instead of manually spawning dozens of agents;&lt;/li&gt;
&lt;li&gt;allow one writer by default unless ownership scopes were genuinely separate;&lt;/li&gt;
&lt;li&gt;resume after interruption without repeating completed jobs;&lt;/li&gt;
&lt;li&gt;keep a manifest, logs, a hash of the final artifact, and discovered thread IDs when the event stream exposes them;&lt;/li&gt;
&lt;li&gt;run the same workflow on my MacBook, Mac mini, and Linux server.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  My solution: Codex as the engine, my runner as the control layer
&lt;/h2&gt;

&lt;p&gt;The result is the open-source &lt;a href="https://github.com/vvitovec/codex-orchestration" rel="noopener noreferrer"&gt;vvitovec/codex-orchestration&lt;/a&gt; project. It contains five cooperating skills for decomposition, routing, compact delegation prompts, review, and scaling. I then added a real programmatic runner on top of &lt;code&gt;codex exec&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Each job is a normal JSONL record:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"api-review"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"model"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"gpt-5.6-terra"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"effort"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"medium"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"sandbox"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"read-only"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"workdir"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="nl"&gt;"prompt"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="s2"&gt;"Review the API surface and return concrete risks."&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The runner passes the model and effort explicitly to the Codex CLI, limits total and write concurrency, locks a run against duplicate execution, persists an atomic manifest, and verifies that a supposedly successful job actually produced a completed result. It records the output size and SHA-256 hash, so a missing or modified artifact cannot hide behind an old &lt;code&gt;succeeded&lt;/code&gt; state during resume.&lt;/p&gt;

&lt;p&gt;A timed-out writer is not automatically repeated unless the job is explicitly marked safe and idempotent. Parallel writers require an explicit opt-in and unique &lt;code&gt;ownership_scope&lt;/code&gt; values. These details are boring, but they are what separates a nice orchestration demo from a workflow I am willing to point at a real repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where it is different, and where native Codex is still better
&lt;/h2&gt;

&lt;p&gt;My layer gives me more &lt;strong&gt;programmatic freedom&lt;/strong&gt;. The requested model, effort, sandbox, timeout, retry policy, and ownership are not merely prompt suggestions: the runner passes them as CLI arguments or configuration and records them in a persistent manifest. That guarantees the exact launch request, not the effective backend route, which current &lt;code&gt;codex exec --json&lt;/code&gt; does not explicitly attest. The queue can contain three jobs or three hundred and still behaves like a queue rather than a long chain of manual tool calls.&lt;/p&gt;

&lt;p&gt;I am not pretending that I built a better Codex. Native subagents have a huge integration advantage: their threads are visible in the UI, I can steer them naturally, and the lead agent can collaborate with them conversationally. My runner is stronger for deterministic batches and auditable automation. The native system is nicer for interactive work.&lt;/p&gt;

&lt;p&gt;Codex App Server already exposes better route information and reroute events, so that is the natural next backend for this project.&lt;/p&gt;

&lt;h2&gt;
  
  
  One of the few unfinished parts. For now.
&lt;/h2&gt;

&lt;p&gt;This is not an attack on Codex. Quite the opposite: it is my main working tool because the team ships at an absurd pace and clearly cares about the product. &lt;a href="https://x.com/thsottiaux" rel="noopener noreferrer"&gt;Thibault “Tibo” Sottiaux&lt;/a&gt;, one of the people behind Codex, is unusually open on X and GitHub, responds to concrete problems, and the team often addresses user feedback before another company would finish scheduling the roadmap meeting.&lt;/p&gt;

&lt;p&gt;I have also been testing &lt;a href="https://openai.com/index/gpt-5-6/" rel="noopener noreferrer"&gt;GPT-5.6 Sol and the other models&lt;/a&gt; pretty intensely since release, and I think they are excellent. I have produced more code and finished more work with them than ever before. They can also keep going for absurdly long runs: the cover screenshot is one of my own GPT-5.6 Sol Ultra runs, at 23 hours and 50 minutes.&lt;/p&gt;

&lt;p&gt;That is why I expect OpenAI to improve the native multi-agent workflow quickly. Custom agents and CSV fan-out already point in the right direction. My orchestration gives me the control I need today, while also being a useful experiment in how agent routing could become more precise.&lt;/p&gt;

&lt;p&gt;Subagents are one of the few parts of Codex that still feel genuinely unfinished to me. &lt;strong&gt;FOR NOW.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I keep the rest of my technical experiments and builds in my &lt;a href="https://www.vvitovec.com/en/projects" rel="noopener noreferrer"&gt;projects&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>codex</category>
      <category>automation</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Your Mac is protecting you! (but is it worth it?)</title>
      <dc:creator>Viktor Vítovec</dc:creator>
      <pubDate>Mon, 06 Jul 2026 09:59:21 +0000</pubDate>
      <link>https://dev.to/vvitovec/your-mac-is-protecting-you-but-is-it-worth-it-1g34</link>
      <guid>https://dev.to/vvitovec/your-mac-is-protecting-you-but-is-it-worth-it-1g34</guid>
      <description>&lt;p&gt;Your Mac is trying to keep you safe. That is good. But when I run Codex all day, with parallel agents, computer use, browser work and a lot of local process launches, the next question becomes interesting too: &lt;strong&gt;how much performance does that safety cost?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;So I made a small benchmark: &lt;a href="https://github.com/vvitovec/macos-gatekeeper-codex-benchmark" rel="noopener noreferrer"&gt;macos-gatekeeper-codex-benchmark&lt;/a&gt;. It is not a formal paper. It is a practical test from my real workflow on a MacBook Air.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I was actually testing
&lt;/h2&gt;

&lt;p&gt;On macOS, part of this protection comes from &lt;a href="https://support.apple.com/guide/security/gatekeeper-and-runtime-protection-sec5599b66df/web" rel="noopener noreferrer"&gt;Gatekeeper&lt;/a&gt; and the &lt;a href="https://www.manpagez.com/man/8/syspolicyd/" rel="noopener noreferrer"&gt;&lt;code&gt;syspolicyd&lt;/code&gt;&lt;/a&gt; process. Apple describes Gatekeeper as a technology that helps make sure only trusted software runs on a Mac. For normal use, that is mostly invisible. You download an app, macOS checks it, and you open it. If you want the deeper rabbit hole, Scott Knight's &lt;a href="https://knight.sc/reverse%20engineering/2019/02/20/syspolicyd-internals.html" rel="noopener noreferrer"&gt;&lt;code&gt;syspolicyd&lt;/code&gt; internals&lt;/a&gt; write-up is a good technical read.&lt;/p&gt;

&lt;p&gt;My workflow is different. Codex can run multiple jobs at once, use browser/computer control, execute terminal commands, hand work to other agents and create a lot of small local process launches. That is exactly where tiny system checks can become very visible.&lt;/p&gt;

&lt;p&gt;I did not want to disable Gatekeeper globally. That might be fast, but it is a bad default. I wanted to know whether the issue was quarantine metadata, first-run assessment of many executable paths, or something else.&lt;/p&gt;

&lt;h2&gt;
  
  
  The benchmark setup
&lt;/h2&gt;

&lt;p&gt;The repo includes the scripts and the results. The main benchmark ran &lt;code&gt;codex help&lt;/code&gt; repeatedly under a few conditions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;RUN_ID&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;baseline &lt;span class="nv"&gt;TOTAL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;20 &lt;span class="nv"&gt;CONCURRENCY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;5 &lt;span class="nv"&gt;REPS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3 &lt;span class="nv"&gt;CMD_TIMEOUT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;8 scripts/run-codex-gatekeeper-benchmark.zsh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The second benchmark was smaller and cleaner. It used a tiny locally compiled Mach-O executable and compared one clean path, one quarantined path, many clean copies and many quarantined copies:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;TOTAL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;100 &lt;span class="nv"&gt;CONCURRENCY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;10 &lt;span class="nv"&gt;REPS&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;5 &lt;span class="nv"&gt;CMD_TIMEOUT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;5 &lt;span class="nv"&gt;MANY_COUNT&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;50 scripts/run-case-study-extras.zsh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I also tested temporary &lt;code&gt;syspolicyd&lt;/code&gt; priority changes and a daemon restart:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;renice +10 &lt;span class="nt"&gt;-p&lt;/span&gt; &amp;lt;syspolicyd-pid&amp;gt;
renice +19 &lt;span class="nt"&gt;-p&lt;/span&gt; &amp;lt;syspolicyd-pid&amp;gt;
killall syspolicyd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Those are not commands I would recommend as a normal fix. They were there to check whether they were real mitigations. They were not.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the numbers said
&lt;/h2&gt;

&lt;p&gt;The easiest way to read the benchmark is not through the internal test names. It is this:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The normal, trusted Codex install was fast.&lt;/strong&gt; Repeatedly launching the real Codex binary that macOS had already seen stayed basically instant for my workflow. In the small burst test, 20 launches finished in a fraction of a second.&lt;/p&gt;

&lt;p&gt;The slow part was different: creating a lot of new executable paths and asking macOS to run them right away. When I copied the Codex binary into many fresh locations and launched those copies in parallel, the first run jumped &lt;strong&gt;from “blink and it is done” to roughly 11 seconds&lt;/strong&gt;. That is the part you feel as the machine suddenly dragging.&lt;/p&gt;

&lt;p&gt;The tiny executable test made the same point in a cleaner way: a tiny trusted helper could be launched 100 times almost instantly, while the same kind of helper with quarantine attached did not really get through the run before the timeout. New clean files were better than quarantined files, but the first run could still be noticeably slower until macOS assessed them once. I also tried the tempting system-level fixes, like lowering &lt;code&gt;syspolicyd&lt;/code&gt; priority and restarting it, but they did not solve the real problem. The better fix is more boring: keep trusted tools clean, avoid unnecessary executable path churn, and warm up new generated tools before throwing a lot of parallel agents at them.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I am not taking from this
&lt;/h2&gt;

&lt;p&gt;I am not taking the lesson as "disable Gatekeeper". Actually the opposite. I did not run &lt;code&gt;spctl --master-disable&lt;/code&gt;, and I do not want this to become a generic performance trick.&lt;/p&gt;

&lt;p&gt;The better rule is narrower:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;xattr &lt;span class="nt"&gt;-p&lt;/span&gt; com.apple.quarantine /path/to/trusted/tool
xattr &lt;span class="nt"&gt;-d&lt;/span&gt; com.apple.quarantine /path/to/trusted/tool
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That only makes sense for tools I actually trust and understand. Not random downloads. Not a global cleanup.&lt;/p&gt;

&lt;p&gt;The other practical rule is about path churn. If a workflow creates many executable files, do not immediately spawn all of them at high concurrency. The first run may be slower because macOS is assessing new paths. Warming them at lower concurrency can be better than letting a large agent run make the system feel stuck.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I will probably do
&lt;/h2&gt;

&lt;p&gt;I will probably keep everything on. The reason is simple: I can offload a lot of the pressure. If Codex is doing heavier work, I can hand jobs from my workstation MacBook Air to my Mac mini or to my &lt;a href="https://www.vvitovec.com/en/blog/old-gaming-pc-linux-server" rel="noopener noreferrer"&gt;Linux server&lt;/a&gt;. That is a better tradeoff for me than weakening security on my main laptop.&lt;/p&gt;

&lt;p&gt;But for performance maxers, this is an interesting thing to look into. Not because they should turn off protection, but because they can find the specific places where macOS keeps checking things that are already trusted inside their own workflow.&lt;/p&gt;

&lt;p&gt;The full benchmark, scripts and raw results are here: &lt;a href="https://github.com/vvitovec/macos-gatekeeper-codex-benchmark" rel="noopener noreferrer"&gt;github.com/vvitovec/macos-gatekeeper-codex-benchmark&lt;/a&gt;. You can also see more of my practical build work on my &lt;a href="https://www.vvitovec.com/en/projects" rel="noopener noreferrer"&gt;projects page&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you work with coding agents, automation or custom build tools on a Mac, it is worth checking whether your bottleneck is really just CPU. Sometimes it is the security layer doing exactly what it is supposed to do. Just very often.&lt;/p&gt;

</description>
      <category>macos</category>
      <category>codex</category>
      <category>performance</category>
      <category>automation</category>
    </item>
    <item>
      <title>Why (not)learn programming.</title>
      <dc:creator>Viktor Vítovec</dc:creator>
      <pubDate>Wed, 01 Jul 2026 16:57:28 +0000</pubDate>
      <link>https://dev.to/vvitovec/why-notlearn-programming-f93</link>
      <guid>https://dev.to/vvitovec/why-notlearn-programming-f93</guid>
      <description>&lt;p&gt;A few years ago, programming felt like the default answer to: &lt;em&gt;what should I learn if I want a valuable skill?&lt;/em&gt; And honestly, it made sense. If you knew Python, JavaScript, or TypeScript, you could suddenly build things that most people could only describe.&lt;/p&gt;

&lt;p&gt;Today I would not tell someone: learn a programming language and you are set. &lt;strong&gt;Knowing syntax is not the main skill anymore.&lt;/strong&gt; AI can produce a ridiculous amount of code in a day. Roughly the kind of volume a normal employed developer would write by hand over years. The exact number is not the point. The point is that writing lines of code became much cheaper.&lt;/p&gt;

&lt;p&gt;That does not mean programming is useless. It means the reason to learn it changed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Programming work changed
&lt;/h2&gt;

&lt;p&gt;In the past, a big part of the value was simply being able to turn an idea into code. You knew how to write an endpoint, a component, a script, a database query, an API integration. That is still useful, but it is not as rare as it used to be.&lt;/p&gt;

&lt;p&gt;If I have a fairly clear system in my head today, AI can write a large part of the implementation for me. Not perfectly. Not without review. But fast enough that &lt;code&gt;typing code&lt;/code&gt; is usually not the bottleneck anymore.&lt;/p&gt;

&lt;p&gt;The bottleneck is more like: do you know what should be built? Do you know where the boundary should be between frontend, backend, and database? Do you know when a simple script is enough and when you need a real app? Can you tell when AI wrote code that looks clean but will break in a month?&lt;/p&gt;

&lt;p&gt;That is the new line, in my opinion.&lt;/p&gt;

&lt;h2&gt;
  
  
  A language is not enough
&lt;/h2&gt;

&lt;p&gt;Learning Python or TypeScript is great. Really. I just would not expect it to automatically make you employable or make someone trust you with a real product.&lt;/p&gt;

&lt;p&gt;A language is a tool. If you only know the language, you mostly know how to phrase instructions for a computer. But real software is not a language exam. It is decisions around data, users, errors, deployment, security, performance, UI, operations, and a thousand small details that tutorials often skip.&lt;/p&gt;

&lt;p&gt;I know Python and JavaScript/TypeScript, but honestly, I barely write most code by hand anymore. Most of the useful work is deciding how the project should behave, how to split it up, what should stay simple, what needs to be robust, where it can fail, and how to verify it. On projects like my &lt;a href="https://www.vvitovec.com/en/projects/portfolio-web" rel="noopener noreferrer"&gt;portfolio&lt;/a&gt; or internal tools, the main work is often the system, not the lines.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I would learn instead of “just programming”
&lt;/h2&gt;

&lt;p&gt;If I started from zero today, I would still learn coding basics. But I would treat them as the entry ticket, not the final goal.&lt;/p&gt;

&lt;p&gt;I would learn product development first. How to take a messy problem and turn it into something someone actually uses. How to tell whether I am building the right thing. How to choose a small first version instead of a giant plan that never ships.&lt;/p&gt;

&lt;p&gt;Then I would learn how programs are structured. Not necessarily writing every file manually, but understanding why a project has folders, modules, database models, API layers, tests, env vars, and a deployment pipeline. This is exactly where AI still needs a person holding the direction.&lt;/p&gt;

&lt;p&gt;And I would learn problem solving. Reading errors. Finding causes. Figuring out whether the issue is in the database, cache, config, network, UI, or my own assumptions. AI helps a lot here, but it still needs someone who knows what to check next.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why programming is still worth learning
&lt;/h2&gt;

&lt;p&gt;I do not want this to sound like “do not learn code.” That would be stupid. If you do not understand code at all, you are completely dependent on whatever AI outputs. That is risky.&lt;/p&gt;

&lt;p&gt;Programming basics let you judge whether AI output makes sense. You can see when a function does something different from what you asked. You understand why types do not match. You can spot a piece of code that bypasses security or a migration that might delete data.&lt;/p&gt;

&lt;p&gt;You also ask better questions. When you use tools like &lt;a href="https://openai.com/codex/" rel="noopener noreferrer"&gt;OpenAI Codex&lt;/a&gt; or other coding agents, the result depends a lot on whether you can describe the problem precisely. “Build me an app” is not enough. You need to know the inputs, outputs, states, and constraints.&lt;/p&gt;

&lt;p&gt;So yes, learn programming. Just do not treat it as the final destination.&lt;/p&gt;

&lt;h2&gt;
  
  
  The new value is orientation
&lt;/h2&gt;

&lt;p&gt;I think the gap will grow between people who can write some code and people who can orient themselves inside software.&lt;/p&gt;

&lt;p&gt;Orientation means you can open an unfamiliar project and slowly understand what is going on. You can find where a bug starts. You can build a mental map of the system. You know what to give AI, what to review manually, and when the better solution is to simplify instead of adding more code.&lt;/p&gt;

&lt;p&gt;That is much stronger than memorizing syntax. AI can fill in syntax. But a bad product or architecture decision can be accelerated by AI too, which only makes it more expensive.&lt;/p&gt;

&lt;h2&gt;
  
  
  So: should you learn programming or not?
&lt;/h2&gt;

&lt;p&gt;Yes, learn it. But not with the idea that knowing one language is a career by itself.&lt;/p&gt;

&lt;p&gt;Learn programming so you understand what AI is doing. Learn to build small things from start to finish. Learn to read existing projects. Learn to structure work. Learn product thinking. Learn to verify, not only generate.&lt;/p&gt;

&lt;p&gt;Writing code is cheaper than it used to be. &lt;strong&gt;Knowing what code should exist in the first place is more valuable than it used to be.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That is the better reason to learn programming now.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
      <category>product</category>
    </item>
    <item>
      <title>The barrier to entry into tech does not exist anymore.</title>
      <dc:creator>Viktor Vítovec</dc:creator>
      <pubDate>Wed, 01 Jul 2026 16:57:26 +0000</pubDate>
      <link>https://dev.to/vvitovec/the-barrier-to-entry-into-tech-does-not-exist-anymore-3ooj</link>
      <guid>https://dev.to/vvitovec/the-barrier-to-entry-into-tech-does-not-exist-anymore-3ooj</guid>
      <description>&lt;p&gt;Getting into tech is easier now than it has ever been. Not because programming, debugging, or building products suddenly became trivial. More because &lt;strong&gt;access to information is barely the blocker anymore&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Before, you had to find a book, a course, a smarter person, or dig through forums until something clicked. Then the internet and YouTube changed the game. Now AI pushes it even further, because you can keep asking questions in one thread until the thing finally makes sense.&lt;/p&gt;

&lt;p&gt;That changes the entry point into tech more than a lot of people admit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Curiosity is still the best teacher
&lt;/h2&gt;

&lt;p&gt;I did not get into this through some serious plan like: now I will become a programmer. It started in a much more normal way. I was a gamer and I wanted to mess with things around games.&lt;/p&gt;

&lt;p&gt;For a lot of people, that game is &lt;a href="https://www.minecraft.net/" rel="noopener noreferrer"&gt;Minecraft&lt;/a&gt;. I still think it is one of the best games for pulling someone into technology, because it naturally rewards curiosity. You want to change something, add something, understand why something works the way it does. Suddenly you are not only playing a game anymore. You are dealing with files, servers, plugins, mods, commands, and eventually code.&lt;/p&gt;

&lt;p&gt;That is a very good way in, because it does not feel like forced learning. It is not: here is a syllabus, now suffer. It is more like: I want this thing, I do not know how to do it, so I will try to figure it out.&lt;/p&gt;

&lt;h2&gt;
  
  
  The internet already broke most of the barrier
&lt;/h2&gt;

&lt;p&gt;I never really built my learning around paid courses. Not because all paid courses are bad, but because for the way I learn, they were not necessary. There is so much information online that if you have some interest and patience, you can learn almost anything.&lt;/p&gt;

&lt;p&gt;YouTube and the open web taught a lot of people things that school or formal courses never did. Not because school is useless, but because the internet is closer to real problems. Want to run a server, fix a React error, understand a database, write a script, set up domains, or automate emails? Someone already had that problem. Someone recorded a video, wrote an article, or argued about it in a forum.&lt;/p&gt;

&lt;p&gt;That is a huge shift. Access used to be the problem. Now the harder part is choosing what to try first.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI made learning feel like a conversation
&lt;/h2&gt;

&lt;p&gt;In the last two years, this moved again. Before, you searched Google, opened ten tabs, read different answers, and tried to combine them into something that matched your exact problem.&lt;/p&gt;

&lt;p&gt;With AI, it feels more like an ongoing conversation. You ask. You get an explanation. You do not understand it? Ask for a simpler version. Want an example? Ask for one. Do not know what to ask? Ask what you should ask.&lt;/p&gt;

&lt;p&gt;For a beginner, this is extremely strong. They do not immediately need to be good at search keywords, filtering old answers, reading long documentation, or guessing whether a Stack Overflow thread from 2014 is still relevant. They can get a first map of the problem and move step by step.&lt;/p&gt;

&lt;p&gt;And now it is not only about explanations. Tools like &lt;a href="https://openai.com/codex/" rel="noopener noreferrer"&gt;Codex&lt;/a&gt; or &lt;a href="https://claude.com/product/claude-code" rel="noopener noreferrer"&gt;Claude Code&lt;/a&gt; can open a project, write code, edit files, set up config, run tests, and get something working. If you want to build almost anything practical - a website, automation, small internal tool, script, data import, or API connection - you often do not need to start from a blank editor anymore. You describe the outcome and an agent can build the first version for you.&lt;/p&gt;

&lt;p&gt;Of course AI can be wrong. You still need to think, test things, and verify the result. But as a starting engine, it is ridiculously convenient. We moved from searching physical libraries, to searching the internet, to asking &lt;a href="https://chatgpt.com/" rel="noopener noreferrer"&gt;ChatGPT&lt;/a&gt; or a similar tool and continuing from there.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is still hard
&lt;/h2&gt;

&lt;p&gt;This does not mean everything is easy. It means the main obstacle changed.&lt;/p&gt;

&lt;p&gt;Information is almost free. Tools are available. AI can suggest a plan, explain an error, write a first version, set up a project, and tell you what to try next. But it still cannot solve the most important part for you: &lt;strong&gt;wanting to do it&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Forced learning is much harder than starting from a hobby. When the thing itself interests you, you survive debugging, messy docs, bad tutorials, and the moment where something does not work for two hours because of one stupid mistake. When you only do it because you feel like you should, every blocker feels like the end.&lt;/p&gt;

&lt;p&gt;The second hard part is finding an idea. Some people have a head full of problems they want to solve. Some stare at an empty editor and have nothing. But even that can be worked around. Look at your normal day and ask: what do I do manually, what slows me down, what could be faster, cleaner, or more fun?&lt;/p&gt;

&lt;p&gt;That is usually better than trying to invent a startup.&lt;/p&gt;

&lt;h2&gt;
  
  
  A first project should be tiny
&lt;/h2&gt;

&lt;p&gt;If I had to recommend a first project for this week, it would not be a huge app. It would be something small that solves one annoying problem from your own life.&lt;/p&gt;

&lt;p&gt;If you are a gamer, try a tiny game tweak, config, simple mod, server script, or something around your community. If you have too many emails, try an automation that summarizes them and drafts a reply in your style. If you repeat some task at school, work, or home, try making it faster.&lt;/p&gt;

&lt;p&gt;It does not need to be perfect. The point is being able to say: right now I do this manually, and I want to make it faster, cleaner, or more fun.&lt;/p&gt;

&lt;p&gt;That is how small things naturally turn into real projects. For me it leads into websites, automations, internal tools, and the kind of work I show in my &lt;a href="https://www.vvitovec.com/en/projects" rel="noopener noreferrer"&gt;portfolio projects&lt;/a&gt;. But the principle stays the same: take a problem, build a small first version, break it, fix it, learn the next thing.&lt;/p&gt;

&lt;h2&gt;
  
  
  The barrier is low, but the work is still real
&lt;/h2&gt;

&lt;p&gt;The biggest lie about tech now is that you need some special entry pass. You do not. You need curiosity, a bit of stubbornness, and the willingness to build small things before they look elegant.&lt;/p&gt;

&lt;p&gt;AI and the internet will not create motivation for you. But if you already have the motivation, starting today is almost comically accessible.&lt;/p&gt;

&lt;p&gt;That is good news. Not because everyone has to become a programmer. More because the less people are scared of technology, the more small annoying problems they can solve for themselves.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>learning</category>
      <category>tech</category>
      <category>tools</category>
    </item>
    <item>
      <title>I Want to Build Things That Save Work</title>
      <dc:creator>Viktor Vítovec</dc:creator>
      <pubDate>Wed, 01 Jul 2026 16:48:47 +0000</pubDate>
      <link>https://dev.to/vvitovec/i-want-to-build-things-that-save-work-2edi</link>
      <guid>https://dev.to/vvitovec/i-want-to-build-things-that-save-work-2edi</guid>
      <description>&lt;p&gt;I have built a lot of websites. I still build them, and honestly, I think I have become pretty good at it. I still enjoy making a page feel fast, clear, polished, and useful.&lt;/p&gt;

&lt;p&gt;But websites by themselves are not really the thing I want to spend my whole future doing.&lt;/p&gt;

&lt;p&gt;I already wrote about this from a slightly different angle in &lt;a href="https://www.vvitovec.com/en/blog/pretty-is-not-a-website-strategy" rel="noopener noreferrer"&gt;Pretty Is Not a Website Strategy&lt;/a&gt;. A good website should not just look nice. It should solve something.&lt;/p&gt;

&lt;p&gt;That is the part I care about most now: &lt;strong&gt;finding repeated work and turning it into a shorter process&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Websites are still fun, but they are not the whole point
&lt;/h2&gt;

&lt;p&gt;I do not dislike websites. The opposite, actually. A website is still one of the fastest ways to build something visible, useful, and easy for people to access. I like the details: speed, layout, content, design, structure, and the overall product feeling.&lt;/p&gt;

&lt;p&gt;What I do not like is the idea of making the same landing page over and over, changing the logo, colors, and text, and pretending it is a brand-new problem every time.&lt;/p&gt;

&lt;p&gt;When I build a website, the best part is when it becomes more than a presentation. When it gets an admin system, a map, a calculator, data processing, automation, or some internal tool behind it.&lt;/p&gt;

&lt;h2&gt;
  
  
  EasyFlex made that clear early
&lt;/h2&gt;

&lt;p&gt;One of the best examples is &lt;a href="https://www.vvitovec.com/en/projects/easyflex" rel="noopener noreferrer"&gt;EasyFlex&lt;/a&gt;. My mom runs her own accounting and tax advisory business, and every month she spends a lot of time entering invoice data into &lt;a href="https://www.abra.eu/flexi/" rel="noopener noreferrer"&gt;ABRA Flexi&lt;/a&gt;, the accounting system she uses.&lt;/p&gt;

&lt;p&gt;On paper, this does not sound dramatic. You open an invoice, read the amount, date, supplier, variable symbol, a few other fields, and enter it into the system. But when you do that again and again, every month, for multiple clients, it becomes a lot of work. Not hard work, just repetitive, slow, and annoying.&lt;/p&gt;

&lt;p&gt;The first version of EasyFlex was not some perfect platform. It was more of a test: what if I could take an invoice, extract the useful data, and prepare it in a way that makes the accounting work much faster?&lt;/p&gt;

&lt;p&gt;Over time I rebuilt parts of it, fixed things, and improved the flow. The result is much more interesting to me than a nice portfolio screenshot: the time my mom spends on that part of the work dropped by more than ten times.&lt;/p&gt;

&lt;p&gt;That is the type of building I like. Not because it looks impressive in a mockup, but because it removes work someone would otherwise repeat again and again.&lt;/p&gt;

&lt;h2&gt;
  
  
  The best features make something easier
&lt;/h2&gt;

&lt;p&gt;I feel the same way with websites. When I worked on Mostky, the most interesting part was not just making a page with text and photos. It was the interactive &lt;a href="https://mostky-web.vercel.app/cs#plots" rel="noopener noreferrer"&gt;2.5D parcel map&lt;/a&gt;, because it helps people understand what is for sale, where it is, and how the plots relate to each other much faster.&lt;/p&gt;

&lt;p&gt;That is the kind of extra feature I enjoy. Not animation just because something should move. I like features that help someone understand the situation faster or make a decision with less effort.&lt;/p&gt;

&lt;p&gt;At that point, the website is mostly the surface. The interesting work is underneath: data, logic, a simple interface, automation, and information flowing in the right order.&lt;/p&gt;

&lt;h2&gt;
  
  
  Optimization is not only a technical thing
&lt;/h2&gt;

&lt;p&gt;When I say I like optimizing, I do not only mean shrinking a bundle or making an API endpoint faster. I like that too, but it is only one layer.&lt;/p&gt;

&lt;p&gt;I mean looking for friction in normal work. Where someone clicks ten times when they should click once. Where someone manually copies data that already exists somewhere else. Where a human waits on a step a system could handle. Where the same small mistake happens every month because nobody built a better process.&lt;/p&gt;

&lt;p&gt;That is much more interesting to me than just asking whether a page looks nice. It should look nice. But if it does not make anything faster, easier, or clearer, then it is mostly decoration.&lt;/p&gt;

&lt;h2&gt;
  
  
  Right now I want experience
&lt;/h2&gt;

&lt;p&gt;I do not know exactly what I want my final “real job” to be. And I think that is fine. I am still at the stage where I want to try as much as possible: websites, automation, AI tools, internal systems, databases, self-hosting, product work, all of it.&lt;/p&gt;

&lt;p&gt;But the direction is becoming pretty clear. I like building things that are not just nice, but useful. Things that take boring, slow, repeated work and make it faster.&lt;/p&gt;

&lt;p&gt;So yes, I will keep building websites. I just increasingly want there to be something real behind them.&lt;/p&gt;

&lt;p&gt;That is the work I find most interesting now: find a problem, understand it well enough, and build a tool that makes it easier to deal with.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>websites</category>
      <category>tools</category>
      <category>ai</category>
    </item>
    <item>
      <title>Pretty Is Not a Website Strategy</title>
      <dc:creator>Viktor Vítovec</dc:creator>
      <pubDate>Wed, 01 Jul 2026 16:48:45 +0000</pubDate>
      <link>https://dev.to/vvitovec/pretty-is-not-a-website-strategy-2d9a</link>
      <guid>https://dev.to/vvitovec/pretty-is-not-a-website-strategy-2d9a</guid>
      <description>&lt;p&gt;A website can look really good and still do almost nothing. That is one of the most common traps with new websites: people spend a lot of energy on colors, animations, photos, and mood, but less on whether a visitor understands the offer in ten seconds.&lt;/p&gt;

&lt;p&gt;Design matters. It is just not the whole product.&lt;/p&gt;

&lt;h2&gt;
  
  
  Design is the first impression, not the whole website
&lt;/h2&gt;

&lt;p&gt;A good-looking website helps. When a page feels clean, modern, and trustworthy, people have less reason to close it immediately. That is real value, not some shallow detail.&lt;/p&gt;

&lt;p&gt;The problem starts when visual design becomes the final goal. Then the website can become a nice screenshot for a portfolio, but a weak business tool. The visitor does not know where to start, what the company actually does, who it is for, why it is different, or what to do next.&lt;/p&gt;

&lt;p&gt;Good visuals should support the message, not hide the lack of one.&lt;/p&gt;

&lt;h2&gt;
  
  
  Structure sells more than effects
&lt;/h2&gt;

&lt;p&gt;A lot of website performance comes from the order of information. First, the offer needs to be clear. Then who it helps. Then why someone should trust it. Then the next step.&lt;/p&gt;

&lt;p&gt;That sounds simple, but it breaks all the time. A homepage has a big slogan and a few nice sections, but no real logic. The visitor gets a few separate impressions, but never moves naturally from problem to solution.&lt;/p&gt;

&lt;p&gt;When I build &lt;a href="https://www.vvitovec.com/en/websites" rel="noopener noreferrer"&gt;websites and landing pages&lt;/a&gt;, I try to understand the business, person, or product behind the page first. A local service needs a different website than a SaaS tool. A portfolio needs a different rhythm again. Using the same template for everyone is fast, but usually the wrong shortcut.&lt;/p&gt;

&lt;h2&gt;
  
  
  Copy is not filler
&lt;/h2&gt;

&lt;p&gt;Copywriting is one of the most underrated parts of a website. Text is not something you paste in at the end after the design is finished. Text often decides whether the offer makes sense at all.&lt;/p&gt;

&lt;p&gt;One clear sentence can replace three sections of explanation. One vague sentence can make a beautiful layout useless.&lt;/p&gt;

&lt;p&gt;This is not about big marketing phrases. It is about precision. What do you do? Who is it for? What gets better? Why you? What should the visitor do next? If those answers are not visible quickly, design will not rescue the page.&lt;/p&gt;

&lt;h2&gt;
  
  
  Speed and SEO are not boring extras
&lt;/h2&gt;

&lt;p&gt;A slow website loses people before they even see the pretty design. And a website that cannot be found properly is often dependent on manually sending people the link.&lt;/p&gt;

&lt;p&gt;This does not need to become overcomplicated. The basics are fast pages, sensible images, a clean heading structure, useful metadata, and content that answers real questions. For practical performance guidance, &lt;a href="https://web.dev/learn/performance" rel="noopener noreferrer"&gt;web.dev&lt;/a&gt; is useful, and Google has an official &lt;a href="https://developers.google.com/search/docs/fundamentals/seo-starter-guide" rel="noopener noreferrer"&gt;SEO Starter Guide&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;These things should not be treated as “later” work. They belong in the base of the website, the same way colors and typography do.&lt;/p&gt;

&lt;h2&gt;
  
  
  Launch is not the finish line
&lt;/h2&gt;

&lt;p&gt;Another weak point is maintenance. A website launches, everyone is happy for a while, and then it starts getting old. The offer changes. New references appear. Something breaks. Nobody tests the form. The copy stops matching reality. The technology around it keeps moving.&lt;/p&gt;

&lt;p&gt;A website is not a poster. It is a living system.&lt;/p&gt;

&lt;p&gt;That is why I like building things in a more connected way: design, landing pages, web apps, automation, data, and sometimes the backend around it. In some &lt;a href="https://www.vvitovec.com/en/projects" rel="noopener noreferrer"&gt;projects&lt;/a&gt;, the website is not just a business card. It is the entrance into a real workflow. At that point, looking good is only the baseline.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I think about it
&lt;/h2&gt;

&lt;p&gt;When someone wants a new website, the best first question is not “what should it look like?”. A better one is: what should it change?&lt;/p&gt;

&lt;p&gt;Should it bring leads? Explain a complicated service? Make sales easier? Build more trust? Save the team time? Show the work better than the old site?&lt;/p&gt;

&lt;p&gt;Only then does style become useful. Style without direction is just decoration.&lt;/p&gt;

&lt;p&gt;A pretty website is great. But a good website is pretty, clear, fast, maintained, and built around the people who actually use it. I have a short overview of how I build &lt;a href="https://www.vvitovec.com/en/websites" rel="noopener noreferrer"&gt;websites&lt;/a&gt;, or you can just reach out through &lt;a href="https://www.vvitovec.com/en/contact" rel="noopener noreferrer"&gt;contact&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;That is basically it. Not every website needs to be a huge application. But almost no website should be just a nice picture with a menu.&lt;/p&gt;

</description>
      <category>websites</category>
      <category>design</category>
      <category>business</category>
    </item>
    <item>
      <title>I turned my old gaming PC into a Linux server</title>
      <dc:creator>Viktor Vítovec</dc:creator>
      <pubDate>Wed, 01 Jul 2026 16:07:08 +0000</pubDate>
      <link>https://dev.to/vvitovec/i-turned-my-old-gaming-pc-into-a-linux-server-58gh</link>
      <guid>https://dev.to/vvitovec/i-turned-my-old-gaming-pc-into-a-linux-server-58gh</guid>
      <description>&lt;p&gt;Sometimes an upgrade is not about buying something new. Sometimes the better move is taking the thing that is already sitting there and giving it a better job.&lt;/p&gt;

&lt;p&gt;That is what happened to my old gaming PC. It used to be the center of my gaming setup. Now it is a small home server running databases, backends, and the kinds of things I do not want to pay for as another separate service.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I stopped using the desktop
&lt;/h2&gt;

&lt;p&gt;I have been gaming on PC since I was very young, so that machine had a long run. But this year I bought a MacBook Air, and it slowly became my main computer for almost everything: work, personal projects, writing, Codex, and quick ideas away from the desk.&lt;/p&gt;

&lt;p&gt;That changed more than I expected. I did not want to be tied to one setup anymore. I wanted to open the laptop on a train, at school, on a sofa, or wherever else and just continue.&lt;/p&gt;

&lt;p&gt;So the desktop stayed powered off more and more. And when I want to play something now, &lt;a href="https://www.nvidia.com/en-us/geforce-now/" rel="noopener noreferrer"&gt;GeForce NOW&lt;/a&gt; from the Mac is usually enough. The old PC was good for its time, but it was starting to hit performance walls as a gaming machine. As a server, it still made perfect sense.&lt;/p&gt;

&lt;h2&gt;
  
  
  I did not want every small idea to become a subscription
&lt;/h2&gt;

&lt;p&gt;A lot of my projects need some backend, database, auth, or small internal tool. Managed services like Supabase are comfortable and absolutely have their place. But when I build lots of small things for fun, paying separately for every tiny project stops making sense.&lt;/p&gt;

&lt;p&gt;This was not about saving money at all costs. It was more about removing a bad filter from the way I build: &lt;strong&gt;“Is this idea worth another monthly bill?”&lt;/strong&gt; That is a bad question to put in front of creativity.&lt;/p&gt;

&lt;p&gt;Now the server can hold small databases, test services, and backends for projects like &lt;a href="https://www.vvitovec.com/en/projects/easyflex" rel="noopener noreferrer"&gt;EasyFlex&lt;/a&gt;, &lt;a href="https://www.vvitovec.com/en/projects/abra-flexi-ai" rel="noopener noreferrer"&gt;ABRA Flexi AI&lt;/a&gt;, and even the database side of this &lt;a href="https://www.vvitovec.com/en/projects/portfolio-web" rel="noopener noreferrer"&gt;portfolio website&lt;/a&gt;. It also gives me space for more experiments that would otherwise stay in notes.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing Ubuntu was not exactly smooth
&lt;/h2&gt;

&lt;p&gt;The setup itself was not some clean cinematic montage. It was more like a few failed boots, trying to hit the right boot-menu key, dealing with small annoying issues, and finally getting into the &lt;a href="https://ubuntu.com/download" rel="noopener noreferrer"&gt;Ubuntu&lt;/a&gt; installer.&lt;/p&gt;

&lt;p&gt;I kept the setup as minimal as possible. No unnecessary desktop environment, no giant experiment on day one. The goal was simple: &lt;strong&gt;the server should run, host things, and stay out of the way&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That matters. Home infrastructure can easily become another project that eats more time than it saves. I wanted the opposite.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cloudflare Tunnel beat messing with my router
&lt;/h2&gt;

&lt;p&gt;The next decision was networking. I did not want to expose my home router or deal with port forwarding, public IPs, NAT, and all the usual small traps. I used &lt;a href="https://developers.cloudflare.com/tunnel/" rel="noopener noreferrer"&gt;Cloudflare Tunnel&lt;/a&gt; instead.&lt;/p&gt;

&lt;p&gt;That worked surprisingly well. The tunnel runs on the server, I map a service to a domain, and I do not have to open random things directly through the router. &lt;em&gt;It is boring in exactly the right way.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Then I started moving hosted things over. Some apps needed different env vars. Some expected a different Node version. Some worked locally and then broke in a completely different way on the server. But that is the normal cost of owning more of the stack.&lt;/p&gt;

&lt;h2&gt;
  
  
  It became a server when I unplugged the monitor
&lt;/h2&gt;

&lt;p&gt;Once the setup was stable enough, I unplugged the monitor. From that point it stopped feeling like “a computer under the desk” and started feeling like a server.&lt;/p&gt;

&lt;p&gt;At first I accessed it through Tailscale, later mostly through SSH with public/private key auth. I also wanted to remove the GPU to save more idle power, but my Ryzen 5 3600 setup will not boot without it. So the GPU unfortunately stays.&lt;/p&gt;

&lt;p&gt;It is not perfect. But it is still much better than letting the whole machine sit unused.&lt;/p&gt;

&lt;h2&gt;
  
  
  Codex became part of the server workflow
&lt;/h2&gt;

&lt;p&gt;The next obvious step was installing &lt;a href="https://github.com/openai/codex" rel="noopener noreferrer"&gt;Codex&lt;/a&gt;. Not only for working on projects, but also for managing the server itself.&lt;/p&gt;

&lt;p&gt;These days I do not manually SSH into it nearly as much. In the Codex app on my Mac, I have a connection that lets the agent work directly on the Linux server. In &lt;code&gt;AGENTS.md&lt;/code&gt; and a custom skill, I describe what the server is, where projects live, how it should behave, and what it can safely do.&lt;/p&gt;

&lt;p&gt;I sometimes use &lt;a href="https://www.anthropic.com/news/enabling-claude-code-to-work-more-autonomously" rel="noopener noreferrer"&gt;Claude&lt;/a&gt; too, mostly when I want a different angle on UI or frontend work. But for normal server tasks, the interesting part is that Codex can work right next to the infrastructure.&lt;/p&gt;

&lt;p&gt;In practice, that means I can ask it to help with things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;moving a small service,&lt;/li&gt;
&lt;li&gt;checking logs,&lt;/li&gt;
&lt;li&gt;preparing a deployment,&lt;/li&gt;
&lt;li&gt;cleaning up &lt;code&gt;/srv/projects&lt;/code&gt;,&lt;/li&gt;
&lt;li&gt;setting up a new database or backend quickly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I still need to understand what is happening. That part does not disappear. But I do not have to copy the same commands again and again.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I learned from it
&lt;/h2&gt;

&lt;p&gt;I am not saying self-hosting is always better than managed services. It is not. If a project is critical, needs high uptime, has a team behind it, or requires quick support, a managed platform makes a lot of sense.&lt;/p&gt;

&lt;p&gt;But for personal projects, prototypes, small databases, and things I want to build quickly without a small mental tax, having my own Linux server is great. It also fits parts of my &lt;a href="https://www.vvitovec.com/en/websites" rel="noopener noreferrer"&gt;portfolio and website work&lt;/a&gt;, where a small piece of infrastructure does not always need a large platform around it.&lt;/p&gt;

&lt;p&gt;Mostly, I like that the old gaming PC did not become a dust collector. It used to give me performance for games. Now it gives me room to build small things without attaching another account to every idea.&lt;/p&gt;

&lt;p&gt;That is a pretty good second career for an old PC.&lt;/p&gt;

</description>
      <category>selfhosting</category>
      <category>linux</category>
      <category>automation</category>
      <category>codex</category>
    </item>
  </channel>
</rss>
