<?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: Oleh Klokov</title>
    <description>The latest articles on DEV Community by Oleh Klokov (@ssh_exe).</description>
    <link>https://dev.to/ssh_exe</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%2F3652836%2Fa737b698-5256-43af-a383-eeda08157d60.png</url>
      <title>DEV Community: Oleh Klokov</title>
      <link>https://dev.to/ssh_exe</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ssh_exe"/>
    <language>en</language>
    <item>
      <title>A lot of terminal setups look productive… until you restart your machine</title>
      <dc:creator>Oleh Klokov</dc:creator>
      <pubDate>Mon, 15 Dec 2025 15:00:00 +0000</pubDate>
      <link>https://dev.to/ssh_exe/a-lot-of-terminal-setups-look-productive-until-you-restart-your-machine-onh</link>
      <guid>https://dev.to/ssh_exe/a-lot-of-terminal-setups-look-productive-until-you-restart-your-machine-onh</guid>
      <description>&lt;p&gt;If you regularly run multiple dev servers, keep SSH sessions open, tail logs, or bounce between projects, you know the routine:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reopen terminal windows,&lt;/li&gt;
&lt;li&gt;reconnect to hosts,&lt;/li&gt;
&lt;li&gt;recreate splits,&lt;/li&gt;
&lt;li&gt;re-run commands,&lt;/li&gt;
&lt;li&gt;repeat.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I didn’t want “cool terminal aesthetics”. I wanted a &lt;strong&gt;workspace&lt;/strong&gt; that survives normal life.&lt;/p&gt;

&lt;p&gt;So I built a simple, repeatable workflow on macOS:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Ghostty&lt;/strong&gt; as the terminal UI layer (native macOS windows/tabs, clean config)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;tmux&lt;/strong&gt; as the state layer (sessions/windows/panes, detach/attach, persistence)&lt;/li&gt;
&lt;li&gt;plus one decision that keeps the setup practical:
&lt;strong&gt;tmux auto-starts only in Ghostty&lt;/strong&gt; - Terminal.app stays clean.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  The small controversy: tabs aren’t a workspace
&lt;/h2&gt;

&lt;p&gt;This is the harmless terminal holy war:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;“Why not just use terminal tabs?”&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because tabs are a view. They don’t encode recovery.&lt;br&gt;
Your layout and runtime context still live in your head.&lt;/p&gt;

&lt;p&gt;tmux is different:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;It has a stable model: &lt;strong&gt;session → windows → panes&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;It supports detach/attach and long-running sessions&lt;/li&gt;
&lt;li&gt;It’s keyboard-first and consistent across machines&lt;/li&gt;
&lt;li&gt;It encourages repeatable structure: one session per project, windows per task&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;To be clear: tabs are great. I still use Ghostty tabs - but as a UI feature, not as my persistence strategy.&lt;/p&gt;




&lt;h2&gt;
  
  
  What I wanted from my setup
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1) Persistence without friction
&lt;/h3&gt;

&lt;p&gt;I want to reopen my terminal and continue:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;same project context,&lt;/li&gt;
&lt;li&gt;same commands running,&lt;/li&gt;
&lt;li&gt;same layout.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2) Separation of concerns
&lt;/h3&gt;

&lt;p&gt;A terminal emulator should not decide how I manage sessions.&lt;br&gt;
And tmux should not hijack every shell I open.&lt;/p&gt;

&lt;p&gt;So I made it explicit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ghostty = development workspace&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Terminal.app = default system shell&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3) Reproducibility
&lt;/h3&gt;

&lt;p&gt;A “good setup” that can’t be recreated is just a lucky accident.&lt;/p&gt;

&lt;p&gt;So I stored everything in a repo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ghostty config&lt;/li&gt;
&lt;li&gt;tmux config (+ TPM plugins)&lt;/li&gt;
&lt;li&gt;a zsh snippet to autostart tmux only in Ghostty&lt;/li&gt;
&lt;li&gt;documentation and usage notes&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  What this gives me in practice
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Instant “back to work”
&lt;/h3&gt;

&lt;p&gt;Open Ghostty → attach to &lt;code&gt;main&lt;/code&gt; → everything is already there.&lt;/p&gt;

&lt;h3&gt;
  
  
  A workflow that matches real development
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;one session per project,&lt;/li&gt;
&lt;li&gt;windows for backend/logs/infra,&lt;/li&gt;
&lt;li&gt;panes for quick splits.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Less mental overhead
&lt;/h3&gt;

&lt;p&gt;Instead of thinking “where did I run that command?”, the structure stays consistent.&lt;/p&gt;

&lt;h3&gt;
  
  
  Easy migration
&lt;/h3&gt;

&lt;p&gt;New machine? Clone repo, copy configs, install tmux, done.&lt;/p&gt;




&lt;h2&gt;
  
  
  What’s in the repository
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;config/ghostty/config&lt;/code&gt; - Ghostty config (fonts, keybindings, Option-as-Alt)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;config/tmux/tmux.conf&lt;/code&gt; - tmux config (window/pane bindings, copy-mode, plugins)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;config/zsh/tmux-ghostty.zsh&lt;/code&gt; - auto-start tmux only in Ghostty&lt;/li&gt;
&lt;li&gt;a full README with installation steps and daily usage (sessions/windows/panes)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/Gunpy/ghostty_tmux.git" rel="noopener noreferrer"&gt;https://github.com/Gunpy/ghostty_tmux.git&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Who should try this
&lt;/h2&gt;

&lt;p&gt;This approach is especially useful if you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;run multiple dev servers and watchers daily,&lt;/li&gt;
&lt;li&gt;keep SSH sessions open,&lt;/li&gt;
&lt;li&gt;work across multiple environments,&lt;/li&gt;
&lt;li&gt;want persistence without turning tmux into a global requirement.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you’re a “no tmux, only tabs” person - that’s fair.&lt;br&gt;
But if you’ve ever rebuilt the same terminal state three times in a week, tmux starts to look less like a hobby and more like ergonomics.&lt;/p&gt;




&lt;h2&gt;
  
  
  Closing
&lt;/h2&gt;

&lt;p&gt;This setup is intentionally boring:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;minimal moving parts,&lt;/li&gt;
&lt;li&gt;predictable behavior,&lt;/li&gt;
&lt;li&gt;and easy to reproduce.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you try it, I’d love to hear how you organize your workspace:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;one session per project,&lt;/li&gt;
&lt;li&gt;one session for everything,&lt;/li&gt;
&lt;li&gt;or separate sessions for local vs remote?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/Gunpy/ghostty_tmux.git" rel="noopener noreferrer"&gt;https://github.com/Gunpy/ghostty_tmux.git&lt;/a&gt;&lt;/p&gt;

</description>
      <category>cli</category>
      <category>productivity</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Choosing a Database Isn’t About Hype - It’s About the Stage of Your Product</title>
      <dc:creator>Oleh Klokov</dc:creator>
      <pubDate>Tue, 09 Dec 2025 17:37:42 +0000</pubDate>
      <link>https://dev.to/ssh_exe/choosing-a-database-isnt-about-hype-its-about-the-stage-of-your-product-2795</link>
      <guid>https://dev.to/ssh_exe/choosing-a-database-isnt-about-hype-its-about-the-stage-of-your-product-2795</guid>
      <description>&lt;p&gt;Selecting a database is not about following hype or choosing what’s trending on tech Twitter.&lt;/p&gt;

&lt;p&gt;It’s about understanding what stage your product is in, the shape of your data, and the load patterns your system actually handles.&lt;/p&gt;

&lt;p&gt;Here’s a practical, engineer-focused breakdown of how to make the right choice.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;MVP / Early Startup Stage&lt;/strong&gt;
&lt;/h2&gt;
&lt;/blockquote&gt;

&lt;h5&gt;
  
  
  At this stage, your priorities are clear:
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Launch fast&lt;/li&gt;
&lt;li&gt;Avoid DevOps complexity&lt;/li&gt;
&lt;li&gt;Keep costs low&lt;/li&gt;
&lt;li&gt;Iterate on product, not infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  Recommended options:
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Supabase&lt;/li&gt;
&lt;li&gt;Firebase&lt;/li&gt;
&lt;li&gt;MongoDB Atlas (Free Tier)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Why these?
&lt;/h4&gt;

&lt;p&gt;Because you don’t need multi-region replicas or an enterprise-  grade SQL setup before you even have users.You need a database that helps you build features quickly with minimal overhead.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;Production Stage&lt;/strong&gt;
&lt;/h2&gt;
&lt;/blockquote&gt;

&lt;h5&gt;
  
  
  Once real users appear, the requirements change significantly:
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Predictability&lt;/li&gt;
&lt;li&gt;Transactional integrity&lt;/li&gt;
&lt;li&gt;Schema stability&lt;/li&gt;
&lt;li&gt;Query planning and indexing&lt;/li&gt;
&lt;li&gt;Long-term data reliability&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  Best fits:
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;PostgreSQL&lt;/li&gt;
&lt;li&gt;MySQL (managed)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Relational databases shine here because your data model stabilizes and you need strong guarantees on consistency, migrations, and analytics.&lt;br&gt;
Supabase/Firebase can still work in production, but relational databases remain the safer long-term foundation.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;AI-Driven Applications&lt;/strong&gt;
&lt;/h2&gt;
&lt;/blockquote&gt;

&lt;h5&gt;
  
  
  AI workloads behave differently from traditional CRUD systems:
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;High RPS&lt;/li&gt;
&lt;li&gt;Expensive operations&lt;/li&gt;
&lt;li&gt;Short-lived intermediate data&lt;/li&gt;
&lt;li&gt;Heavy caching needs&lt;/li&gt;
&lt;li&gt;Semantic search requirements&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  A typical architecture becomes hybrid:
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Redis + PostgreSQL&lt;/li&gt;
&lt;li&gt;Redis + ClickHouse&lt;/li&gt;
&lt;li&gt;Vector DB (Pinecone, Weaviate) + SQL&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  Roles:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Redis&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;caching model responses&lt;/li&gt;
&lt;li&gt;rate limiting&lt;/li&gt;
&lt;li&gt;job processing queues&lt;/li&gt;
&lt;li&gt;fast temporary storage&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;SQL&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;user history&lt;/li&gt;
&lt;li&gt;generated content&lt;/li&gt;
&lt;li&gt;logs&lt;/li&gt;
&lt;li&gt;analytics&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;

&lt;p&gt;Vector DB&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;embeddings&lt;/li&gt;
&lt;li&gt;semantic search&lt;/li&gt;
&lt;li&gt;retrieval pipelines&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Trying to push AI workloads into a single SQL database usually leads to bottlenecks.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;Data-Centric Applications&lt;/strong&gt;
&lt;/h2&gt;
&lt;/blockquote&gt;

&lt;p&gt;This applies to CRMs, dashboards, admin panels, SaaS tools with heavy reporting, and anything where data relationships* are the core of the product.&lt;/p&gt;

&lt;h5&gt;
  
  
  You need:
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;consistency&lt;/li&gt;
&lt;li&gt;clear relational structure&lt;/li&gt;
&lt;li&gt;predictable JOIN performance&lt;/li&gt;
&lt;li&gt;strict schema control&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  Use:
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;PostgreSQL&lt;/li&gt;
&lt;li&gt;MySQL&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If most of your product revolves around data tables, relational databases are the strongest choice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  MVP:
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Supabase / Firebase / MongoDB → move fast.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  Production:
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;PostgreSQL / MySQL → stay stable.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  AI workloads:
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Redis + SQL + Vector DB → maximize speed and flexibility.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  Data-heavy applications:
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Pure SQL → structure is your advantage.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br&gt;
Choosing a database is not about picking the flashiest tool or copying another team’s stack.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Early products don’t need enterprise-level infrastructure.&lt;/li&gt;
&lt;li&gt;Mature systems can’t rely on flexible-but-loose NoSQL setups.&lt;/li&gt;
&lt;li&gt;AI systems require a hybrid approach.&lt;/li&gt;
&lt;li&gt;Data-focused apps thrive on relational clarity.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  Choose a database for your product stage-not for the hype.
&lt;/h5&gt;

</description>
      <category>database</category>
      <category>mvp</category>
      <category>ai</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
