<?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>Forem: Erik Novikov</title>
    <description>The latest articles on Forem by Erik Novikov (@eriknovikov).</description>
    <link>https://forem.com/eriknovikov</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.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2553696%2Ff55ce885-4244-4cbf-9f48-53ff49d760a7.jpg</url>
      <title>Forem: Erik Novikov</title>
      <link>https://forem.com/eriknovikov</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/eriknovikov"/>
    <language>en</language>
    <item>
      <title>How I passed the AWS DVA-C02</title>
      <dc:creator>Erik Novikov</dc:creator>
      <pubDate>Fri, 24 Apr 2026 11:14:39 +0000</pubDate>
      <link>https://forem.com/eriknovikov/how-i-passed-the-aws-dva-c02-5e4f</link>
      <guid>https://forem.com/eriknovikov/how-i-passed-the-aws-dva-c02-5e4f</guid>
      <description>&lt;h2&gt;
  
  
  What is the DVA-C02 and why does it matter?
&lt;/h2&gt;

&lt;p&gt;The AWS Certified Developer – Associate (DVA-C02) is Amazon's certification for developers who build and maintain applications on AWS. It covers the full spectrum of what a backend/cloud developer needs to know in practice: serverless architectures, CI/CD pipelines, security and identity management, NoSQL at scale, event-driven systems, and more.&lt;/p&gt;

&lt;p&gt;This isn't a "I clicked through a wizard" cert. Passing it means you can design, deploy, debug, and optimize cloud-native applications on one of the most widely adopted cloud platforms in the industry. The cert signals that you can own backend infrastructure on AWS — or work alongside DevOps and cloud engineers without hand-holding.&lt;/p&gt;

&lt;p&gt;This is my journey on how I got there.&lt;/p&gt;

&lt;h2&gt;
  
  
  It wasn't a one-month sprint
&lt;/h2&gt;

&lt;p&gt;I could have gone that route — watch a course, smash some practice exams, pass, forget everything. But that wasn't the point. I wanted to actually understand the AWS ecosystem, not just hold a certificate.&lt;/p&gt;

&lt;p&gt;So I took my time. About 5 months in total — though I wasn't doing this full time. Most of my time went to regular software development work, and AWS prep happened in the gaps: evenings, weekends, whenever I had the mental bandwidth.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I prepared
&lt;/h2&gt;

&lt;p&gt;A few things worked well for me:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hands-on labs on AWS Skill Builder&lt;/strong&gt; — There's no substitute for actually doing things. Clicking through the console, breaking stuff, fixing it. Skill Builder has solid labs and I'd recommend going through them before anything else.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Building something real&lt;/strong&gt; — I was already working on &lt;a href="https://dotapro.org" rel="noopener noreferrer"&gt;dotapro.org&lt;/a&gt;, an open-source Dota 2 analytics platform. Building and deploying a real application on AWS forced me to think about architecture decisions, IAM policies, deployment pipelines — things that actually show up on the exam because they actually matter in production.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stephane Maarek's course on Udemy&lt;/strong&gt; — The go-to for a reason. Clear, well-structured, covers a ton of the theory you need.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tutorials Dojo practice exams&lt;/strong&gt; — This is where things got real. The practice exams are harder than the actual exam, which is exactly what you want. They exposed the weak spots I didn't know I had and forced me to go back and fill them in properly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tutorials Dojo cheat sheets&lt;/strong&gt; — A bit lengthy, but a community favorite — and for good reason. Free, comprehensive, and kept up to date. They cover each service in real detail, and if something doesn't click, they link directly to the relevant AWS docs.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the exam is actually like
&lt;/h2&gt;

&lt;p&gt;Mostly serverless and application-layer stuff. If you're expecting heavy networking or infrastructure questions, you won't find many. What you will find, a lot of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Lambda (a lot)&lt;/li&gt;
&lt;li&gt;DynamoDB (seriously, a lot — know it well)&lt;/li&gt;
&lt;li&gt;API Gateway&lt;/li&gt;
&lt;li&gt;Cognito&lt;/li&gt;
&lt;li&gt;Kinesis&lt;/li&gt;
&lt;li&gt;CodeDeploy and CI/CD pipelines&lt;/li&gt;
&lt;li&gt;IAM&lt;/li&gt;
&lt;li&gt;S3&lt;/li&gt;
&lt;li&gt;RDS&lt;/li&gt;
&lt;li&gt;EC2 (less than you'd think)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The questions are scenario-based. They'll describe a situation and ask what the best solution is — which means you need to understand the &lt;em&gt;why&lt;/em&gt; behind each service, not just what it is. Memorizing won't cut it. Understanding will.&lt;/p&gt;

&lt;h2&gt;
  
  
  The takeaway
&lt;/h2&gt;

&lt;p&gt;The DVA-C02 isn't brutal, but it's not a gimme either. What made the difference for me wasn't the number of hours I put in — it was the quality of them. Hands-on work, real projects, and practice exams that exposed my gaps.&lt;/p&gt;

&lt;p&gt;If you're planning to sit it, don't shortcut the fundamentals. Cloud computing isn't magic — it's just distributed systems with good marketing. Once you internalize the core principles of software development and system design, the AWS-specific stuff starts making a lot more sense.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>softwaredevelopment</category>
      <category>cloud</category>
    </item>
    <item>
      <title>My Arch Linux Story</title>
      <dc:creator>Erik Novikov</dc:creator>
      <pubDate>Tue, 21 Apr 2026 09:54:57 +0000</pubDate>
      <link>https://forem.com/eriknovikov/my-arch-linux-story-4hi8</link>
      <guid>https://forem.com/eriknovikov/my-arch-linux-story-4hi8</guid>
      <description>&lt;h2&gt;
  
  
  Intro
&lt;/h2&gt;

&lt;p&gt;This is my journey of how I transitioned from Windows to Arch Linux, the reasons behind it, and whether it's really worth it. I'm a quite practical and no-fluff writer, so I'm sure you will find something useful or interesting. Stay tuned!&lt;/p&gt;

&lt;h2&gt;
  
  
  The very beginning
&lt;/h2&gt;

&lt;p&gt;Like everyone, I started on Windows. It's what everyone uses, it's what comes pre-installed, and it comes with most of what a normal person would need from a computer. Then at some point, I met Linux: open source, super fast and resource efficient, without the Windows bloat and with free licensing. Also, the server world runs on Linux, because it's &lt;a href="https://commandlinux.com/statistics/linux-vs-windows-server-response-time-and-throughput-benchmarks/" rel="noopener noreferrer"&gt;faster&lt;/a&gt; and &lt;a href="https://parquantix.com/linux-windows-aws-cost-comparison/" rel="noopener noreferrer"&gt;cheaper&lt;/a&gt;. So it was evident that if I wanted to take it seriously as a software dev, I had to become comfortable around Linux.&lt;/p&gt;

&lt;h2&gt;
  
  
  First stop: WSL
&lt;/h2&gt;

&lt;p&gt;The obvious first step was WSL — Windows Subsystem for Linux. You get a Linux terminal without leaving Windows, it's easy to set up, and for small scripts and simple projects it works fine.&lt;/p&gt;

&lt;p&gt;The problem showed up as soon as I tried to use it for &lt;strong&gt;real&lt;/strong&gt; work. On an 8GB RAM machine running VSCode with a fullstack project open — LSPs, syntax extensions, the works — the whole thing would hang. Not a little lag, but full 30-second freezes from just opening a moderately sized codebase. WSL adds a virtualization layer on top of Windows, and Windows itself is already eating a significant chunk of your memory. On constrained hardware, it simply doesn't hold up. And even on more powerful machines, I'd rather save that compute for actual development — not for system bloat or telemetry quietly reporting back to Microsoft.&lt;/p&gt;

&lt;p&gt;So I decided to switch for real.&lt;/p&gt;

&lt;h2&gt;
  
  
  Fedora — the right call for the wrong hardware
&lt;/h2&gt;

&lt;p&gt;It had a very &lt;a href="https://www.xda-developers.com/best-linux-setup-doesnt-exist-linus-torvalds-proves-it/" rel="noopener noreferrer"&gt;good reputation&lt;/a&gt; among the dev community, since it is the most developer-friendly distro. Faster and less bloated than Ubuntu, with good stability and smooth updates with 6-month release cycles, and it handles a ton for you out of the box.&lt;/p&gt;

&lt;p&gt;The difference from day one was noticeable. Memory usage at idle dropped substantially, everything felt snappier, and I could finally run my full dev setup — VSCode, Chrome with multiple tabs open, Docker, DBeaver — without the machine gasping.&lt;/p&gt;

&lt;p&gt;But I had a small problem — my laptop's WiFi chipset. It's a MediaTek MT7902, and MediaTek simply doesn't ship Linux-compatible drivers. My fix at the time was a USB WiFi dongle, which got the job done until it broke. So I started searching for alternatives, and the most promising solution was to compile and install third-party community drivers for my chipset. The community driver didn't work on Fedora, so I tried a few other distros. None allowed for the community driver installation, except Arch Linux.&lt;/p&gt;

&lt;h2&gt;
  
  
  Installing Arch (it was awesome)
&lt;/h2&gt;

&lt;p&gt;Arch has a reputation. The community talks about it like a rite of passage, and for years the installation process genuinely was manual enough to intimidate most people. I went in expecting the worst.&lt;/p&gt;

&lt;p&gt;The reality in 2026: &lt;code&gt;archinstall&lt;/code&gt; exists. It's a guided installer that walks you through partitioning, locale, desktop environment, bootloader — the whole thing. The whole installation took maybe 45 minutes. I was expecting a weekend project.&lt;/p&gt;

&lt;p&gt;Once it was up, I compiled the MediaTek driver. It worked. That alone made the whole detour worth it. I ended up automating the entire driver setup and publishing it &lt;a href="https://github.com/eriknovikov/WIFI-Drivers-MediaTek-MT7902-Installation" rel="noopener noreferrer"&gt;here&lt;/a&gt; for anyone else stuck in the same situation.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Arch actually feels like
&lt;/h2&gt;

&lt;p&gt;The performance difference is real, and it's immediately obvious. My system boots in about 5 seconds max — a few seconds faster than Fedora, which is a nice touch.&lt;/p&gt;

&lt;p&gt;Part of that is Arch's philosophy: you install exactly what you need, nothing else. No background updater for software you never asked for, no telemetry running quietly, no bundled apps eating RAM. The base system is minimal by design, and everything on top of it you put there deliberately.&lt;/p&gt;

&lt;p&gt;The other relevant thing about Arch is that it's a rolling release. There are no versions — no "Arch 2026" to upgrade to each year. You just run &lt;code&gt;pacman -Syu&lt;/code&gt; and you're always on the latest everything. For a dev machine that's genuinely convenient, but still isn't something that makes it 10x better than any other distro.&lt;/p&gt;

&lt;p&gt;And the most important thing — you get to flex "I use Arch btw 💪". The greatest meme in the Linux community.&lt;/p&gt;

&lt;p&gt;The tradeoff — some things don't configure themselves. Connecting an external monitor required manual setup. Default system audio meant installing &lt;code&gt;pavucontrol&lt;/code&gt; and configuring things from there. These aren't hard problems, but they're yours to solve — which is a different experience from what most people and devs are used to. If something doesn't work, you look it up, find the answer on the Arch Wiki or with a quick Google or AI search, install and set up what you need, and move on.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bottom line
&lt;/h2&gt;

&lt;p&gt;Honest answer — &lt;strong&gt;IT DOESN'T MATTER&lt;/strong&gt;. The real-world performance difference between Arch, Fedora, Ubuntu, and other distros is smaller than the internet would have you believe.&lt;/p&gt;

&lt;p&gt;I still recommend Arch to devs who take their craft seriously. You will gain a deeper understanding of your system. The installation teaches you things. Running, breaking, and fixing it teaches you even more. But it's not the right tool for everyone, and pretending otherwise is a kind of gatekeeping that doesn't help anyone. I also derive great satisfaction from having my OS as clean and minimal as possible, in the same way I do for my physical workspace — knowing exactly what the system has and for what purpose.&lt;/p&gt;

&lt;p&gt;Always remember — &lt;strong&gt;Pragmatism over dogma&lt;/strong&gt;. The most important thing is developer experience and productivity. Having your tools work, your workflow be uninterrupted, and your system stay out of your way — that's what matters. Which distro gets you there is secondary. A 5-second extra boot time or downloading some package 200 milliseconds faster is negligible when you work for hours a day.&lt;/p&gt;

&lt;p&gt;Try the best-known distros for a while (no more than a day in total), and pick the one that resonates the most with you. Don't fall into the OS optimization hell — focus instead on the big picture (developer experience and productivity), and remember that distro hopping is itself a form of procrastination. Use that time instead to do real work or to work on something you enjoy.&lt;/p&gt;

</description>
      <category>archlinux</category>
      <category>linux</category>
      <category>softwaredevelopment</category>
      <category>productivity</category>
    </item>
    <item>
      <title>The tech market is tough. Here's what actually matters.</title>
      <dc:creator>Erik Novikov</dc:creator>
      <pubDate>Tue, 07 Apr 2026 19:35:39 +0000</pubDate>
      <link>https://forem.com/eriknovikov/the-tech-market-is-tough-heres-what-actually-matters-4ekb</link>
      <guid>https://forem.com/eriknovikov/the-tech-market-is-tough-heres-what-actually-matters-4ekb</guid>
      <description>&lt;h2&gt;
  
  
  The situation
&lt;/h2&gt;

&lt;p&gt;Layoffs, an influx of new devs, and AI getting more capable every month. The market is genuinely harder than it was a few years ago — both at entry level and senior. Supply is up, so the average developer's value is down. That's just supply and demand.&lt;/p&gt;

&lt;p&gt;But the average developer is not you. Here's why it's not as grim as it looks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Competence still wins
&lt;/h2&gt;

&lt;p&gt;The market isn't homogeneous. Two developers with the same title and years of experience can be worlds apart in actual ability. What separates them:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Problem-solving over knowledge accumulation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The developer who knows three frameworks but can't think through an unfamiliar problem is less valuable than the one with strong fundamentals who can adapt fast. Protocols, concurrency, system design, debugging, fixing and shipping under pressure — these transfer across stacks. Knowing by heart a specific library or framework doesn't.&lt;/p&gt;

&lt;p&gt;A concrete example: migrating a microservice from Java to Go. A developer who's never touched Java might freeze. A developer with solid fundamentals in how languages handle concurrency and how services communicate will figure it out. Be the second developer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. AI leverage&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use AI to plan, brainstorm, review, and code — but stay in the driver's seat. Vibe-coding your way to a shipped feature might look fast until you spend hours debugging a system you never actually understood. AI is a force multiplier, not a replacement for understanding what you're building.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Learning rate&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In tech, what you know today matters less than how fast you can learn something new and apply it. The half-life of any specific skill is shrinking. Your ability to pick things up quickly is the most durable asset you have.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final word
&lt;/h2&gt;

&lt;p&gt;Don't stress over the market. Get extremely good instead. Strong fundamentals, smart use of AI, and a fast learning rate will put you ahead of most. Focus on those and the rest takes care of itself.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How I built voice-type</title>
      <dc:creator>Erik Novikov</dc:creator>
      <pubDate>Tue, 07 Apr 2026 19:17:00 +0000</pubDate>
      <link>https://forem.com/eriknovikov/how-i-built-voice-type-3i2p</link>
      <guid>https://forem.com/eriknovikov/how-i-built-voice-type-3i2p</guid>
      <description>&lt;h2&gt;
  
  
  Intro
&lt;/h2&gt;

&lt;p&gt;This post breaks down &lt;a href="https://github.com/eriknovikov/voice-type" rel="noopener noreferrer"&gt;Voice Type&lt;/a&gt; — a system-wide speech-to-text tool for Linux I built and use daily. I'll cover why I built it, how it works under the hood, and what I learned along the way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;Two reasons: wrist pain and productivity.&lt;/p&gt;

&lt;p&gt;Modern dev workflows involve a ton of prompting — LLMs, search, documentation. If you're doing that all day with a keyboard, your wrists notice. And beyond the ergonomics, you simply speak faster than you type. Offloading even part of that to voice has a real impact.&lt;/p&gt;

&lt;p&gt;The obvious solution was a local STT model. I tried SpeechNote on Linux with a Whisper.cpp small model — it wasn't accurate enough and had noticeable latency. Running a larger model wasn't an option either: I'm on an 8GB RAM laptop, and my dev setup (VSCode, Chrome, Docker, DBeaver, etc.) already pushes that. A 3–4GB model sitting in RAM wasn't viable.&lt;/p&gt;

&lt;p&gt;I eventually found that Chrome's built-in Web Speech API — which routes audio to Google's servers under the hood — matches the accuracy and speed of much larger models like Whisper large, with virtually zero local resource usage. That was the unlock.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;Voice Type launches a headless Chrome instance via Puppeteer and uses the Web Speech API to do real-time transcription. Here's the flow:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Browser&lt;/strong&gt; — Chrome runs the Web Speech API with &lt;code&gt;interimResults: true&lt;/code&gt;, which streams partial transcripts as you speak in real time. These flow in via Google's WebSocket infrastructure.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;IPC&lt;/strong&gt; — When a new interim result arrives in the browser, it triggers a callback into the main Node.js daemon. This is done via Puppeteer's &lt;code&gt;exposeFunction&lt;/code&gt;, which leverages the Chrome DevTools Protocol WebSocket connection to invoke a function in the main process in real time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Diffing&lt;/strong&gt; — The daemon keeps track of &lt;code&gt;currentText&lt;/code&gt;. On every update, it runs a diff: if nothing changed, do nothing. If it changed, find the longest common prefix between the old and new text, send the right number of backspaces, and type the new characters.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Typing&lt;/strong&gt; — Text is typed system-wide via &lt;code&gt;dotool&lt;/code&gt;. Standard ASCII goes through directly. Accented characters, emojis, and CJK are handled via GNOME's Unicode Hex Input sequence (&lt;code&gt;Ctrl+Shift+U&lt;/code&gt; → hex code → Enter), which makes it work across languages without needing to match the user's keyboard layout.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is why Voice Type can correct itself mid-sentence without retyping everything from scratch — it only fixes what changed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Privacy note
&lt;/h2&gt;

&lt;p&gt;Since the Web Speech API is powered by Google's servers, your audio does leave your machine. Worth knowing before you use it for anything sensitive.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I actually use it
&lt;/h2&gt;

&lt;p&gt;Mostly for prompting and writing blog posts like this one. Once it's bound to a key, it gets out of the way completely — press, speak, done. It supports text and sound notifications, though I prefer them disabled — GNOME already shows a mic icon in the system tray when the mic is active.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;STT is underrated as a dev tool. If you're on Linux, give &lt;a href="https://github.com/eriknovikov/voice-type" rel="noopener noreferrer"&gt;Voice Type&lt;/a&gt; a try — it's free, open source, and uses almost no resources. If it's useful to you, a star on GitHub goes a long way. Happy coding!&lt;/p&gt;

</description>
      <category>linux</category>
      <category>stt</category>
      <category>dictation</category>
      <category>softwaredevelopment</category>
    </item>
    <item>
      <title>How I built dotapro.org</title>
      <dc:creator>Erik Novikov</dc:creator>
      <pubDate>Wed, 01 Apr 2026 15:13:59 +0000</pubDate>
      <link>https://forem.com/eriknovikov/how-i-built-dotaproorg-1jba</link>
      <guid>https://forem.com/eriknovikov/how-i-built-dotaproorg-1jba</guid>
      <description>&lt;h2&gt;
  
  
  Intro
&lt;/h2&gt;

&lt;p&gt;This post breaks down &lt;a href="https://dotapro.org" rel="noopener noreferrer"&gt;dotapro.org&lt;/a&gt; — an open-source Dota 2 analytics platform for professional matches. I'll cover why I built it and the technical decisions behind it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why I built it
&lt;/h2&gt;

&lt;p&gt;Dota 2 is one of the few games I actually enjoy. I couldn't find a good tool for browsing professional match data with proper filtering, so I built one.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Advanced filtering by league, team, player, and hero&lt;/li&gt;
&lt;li&gt;Real-time ETL pipeline keeping match data up to date&lt;/li&gt;
&lt;li&gt;Fast &lt;code&gt;pg_trgm&lt;/code&gt; similarity search for names&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Architecture
&lt;/h2&gt;

&lt;p&gt;The React frontend talks to an API Lambda. A separate scraper Lambda runs on a schedule, pulls data from the &lt;a href="https://opendota.com" rel="noopener noreferrer"&gt;OpenDota API&lt;/a&gt;, and inserts it into PostgreSQL on RDS.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faydjrmz51x0jq50g80p3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faydjrmz51x0jq50g80p3.png" alt="Architecture" width="666" height="631"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Storage
&lt;/h3&gt;

&lt;p&gt;PostgreSQL on AWS RDS. I briefly ran Postgres manually on an EC2 instance just to understand what managed services actually abstract away — OS patching, backups, vertical scaling. The time cost isn't worth the savings unless you're optimizing hard on infrastructure spend.&lt;/p&gt;

&lt;h3&gt;
  
  
  Compute
&lt;/h3&gt;

&lt;p&gt;Two Lambdas: one scraper on an EventBridge schedule, one monolithic API Lambda handling all routes via &lt;code&gt;go-chi&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The monolith was a deliberate choice. One codebase, one deployment, and warm starts benefit all endpoints regardless of which one was hit first. I initially over-engineered it — scraper → SQS → ingestor Lambda — then collapsed it into a single Lambda when I realized nothing actually required that complexity.&lt;/p&gt;

&lt;p&gt;Split a Lambda monolith when you have separate teams needing independent deployments, or a specific hot path that needs provisioned concurrency. Otherwise, keep it simple.&lt;/p&gt;

&lt;h3&gt;
  
  
  Frontend
&lt;/h3&gt;

&lt;p&gt;React + TypeScript + Tailwind + Vite + TanStack Router/Query, deployed to S3 behind CloudFront. Standard setup, nothing unusual.&lt;/p&gt;

&lt;h3&gt;
  
  
  CI/CD
&lt;/h3&gt;

&lt;p&gt;GitHub Actions on push to &lt;code&gt;main&lt;/code&gt;, with OIDC auth to AWS. Selectively redeploys only what changed — UI gets built and synced to S3 with a CloudFront invalidation, Lambdas get compiled and pushed via &lt;code&gt;update-function-code&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Feel free to check it out at &lt;a href="https://dotapro.org" rel="noopener noreferrer"&gt;dotapro.org&lt;/a&gt;. The code is also on &lt;a href="https://github.com/eriknovikov/dotapro" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt; — drop a star if you find it useful. Happy coding!&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>career</category>
    </item>
    <item>
      <title>Welcome to my blog</title>
      <dc:creator>Erik Novikov</dc:creator>
      <pubDate>Thu, 08 Jan 2026 13:56:36 +0000</pubDate>
      <link>https://forem.com/eriknovikov/welcome-to-my-blog-39nk</link>
      <guid>https://forem.com/eriknovikov/welcome-to-my-blog-39nk</guid>
      <description>&lt;h2&gt;
  
  
  What is this blog about?
&lt;/h2&gt;

&lt;p&gt;Throughout this blog I intend to write about tech - full-stack web dev, programming, career advice, Linux, cloud computing, AI, and software development in general. Occasionally I may write about other topics I find interesting, only if I'm absolutely sure it would be of help to you somehow.&lt;/p&gt;

&lt;h2&gt;
  
  
  A bit about me
&lt;/h2&gt;

&lt;p&gt;Hey there! I'm Erik, a software dev. I started programming at 17, went to university (Software Engineering), and after that I have been professionally in the industry for a while. It's been an exciting ride, where I've had to learn A LOT, and will continue to do so. IMO, that's the best thing about tech - it evolves all the time. Other than doing "normal dev stuff", I'm currently sharpening my cloud computing (mostly AWS), 3D development, and AI skills. In my free time, you will find me building something cool like &lt;a href="https://github.com/eriknovikov/dotapro" rel="noopener noreferrer"&gt;dotapro.org&lt;/a&gt; (an open-source Dota 2 analytics platform), or &lt;a href="https://github.com/eriknovikov/voice-type" rel="noopener noreferrer"&gt;voice-type&lt;/a&gt; (a free Linux dictation tool with unmatched speed and accuracy).&lt;/p&gt;

&lt;h2&gt;
  
  
  Why this blog?
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;You'll definitely find something helpful here.&lt;/li&gt;
&lt;li&gt;I genuinely enjoy writing.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  About my writing style
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;I don't like fluff.&lt;/li&gt;
&lt;li&gt;I keep it casual, concise, and to the point.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I intend to be as value-driven as possible, so I'll only blog about something if I really believe it can be helpful to you. So no, GPT-stenchy blogs with a lot of bs and zero real world utility is something I won't ever do.&lt;/p&gt;

&lt;h2&gt;
  
  
  My socials
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/eriknovikov" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://linkedin.com/in/eriknovikov" rel="noopener noreferrer"&gt;LinkedIn&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://t.me/erik_nkv" rel="noopener noreferrer"&gt;Telegram&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>programming</category>
      <category>webdev</category>
      <category>career</category>
    </item>
  </channel>
</rss>
