<?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: TJ</title>
    <description>The latest articles on DEV Community by TJ (@tj1609).</description>
    <link>https://dev.to/tj1609</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%2F3618063%2F153f2b0b-0c93-4162-a3ae-8898062b518c.jpeg</url>
      <title>DEV Community: TJ</title>
      <link>https://dev.to/tj1609</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tj1609"/>
    <language>en</language>
    <item>
      <title>Run Claude for FREE Locally (Using Ollama + Claude Code)</title>
      <dc:creator>TJ</dc:creator>
      <pubDate>Wed, 25 Feb 2026 16:58:14 +0000</pubDate>
      <link>https://dev.to/tj1609/run-claude-for-free-locally-using-ollama-claude-code-45lf</link>
      <guid>https://dev.to/tj1609/run-claude-for-free-locally-using-ollama-claude-code-45lf</guid>
      <description>&lt;p&gt;Want to use a Claude-like coding assistant without paying API costs?&lt;/p&gt;

&lt;p&gt;In this guide, I’ll show you how to run it (step-by-step) locally using Ollama and Claude Code.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 What You’ll Build
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Local LLM setup (no API cost)&lt;/li&gt;
&lt;li&gt;Claude-style coding assistant&lt;/li&gt;
&lt;li&gt;Fully offline workflow (optional)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚙️ Step-by-Step Setup
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Install Ollama
&lt;/h3&gt;

&lt;p&gt;Ollama is the engine that runs LLMs locally.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://ollama.com/install.sh | sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ollama -v
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  2. Install Claude CLI
&lt;/h3&gt;

&lt;p&gt;Follow:&lt;br&gt;
&lt;a href="https://code.claude.com/docs/en/quickstart" rel="noopener noreferrer"&gt;https://code.claude.com/docs/en/quickstart&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you see claude is not installed, you missed this step.&lt;/p&gt;


&lt;h3&gt;
  
  
  3. Install Claude Code
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install -g @anthropic-ai/claude-code
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Pull a Coding Model
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Command :&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ollama pull qwen2.5-coder:7b
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;You will see&lt;/strong&gt; :&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%2Fpkjmxe4irvtitgcl6t9t.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%2Fpkjmxe4irvtitgcl6t9t.png" alt="Pull Model" width="800" height="306"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  5. Configure Environment
&lt;/h3&gt;

&lt;p&gt;Add to your ~/.bashrc or ~/.zshrc:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;export PATH="$HOME/.local/bin:$PATH"
export ANTHROPIC_BASE_URL=http://localhost:11434/v1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Reload:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;source ~/.bashrc
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;You will see&lt;/strong&gt; : &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%2Fpptr5fj4yafg2r9365v1.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%2Fpptr5fj4yafg2r9365v1.png" alt="Configure Claude" width="800" height="206"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  6. Launch Claude
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ollama launch claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now Claude will use your local Ollama model.  &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%2F8m2m09nt53vxb1ll5tte.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%2F8m2m09nt53vxb1ll5tte.png" alt="LaunchClaude" width="800" height="469"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free Claude Ready to Use&lt;/strong&gt;&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%2Fej9y57d7org4gt9qj3jm.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%2Fej9y57d7org4gt9qj3jm.png" alt="Claude Ready" width="800" height="245"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;&lt;em&gt;&lt;strong&gt;During my exploration, I got my model was confuse and the answer was not my want.&lt;/strong&gt;&lt;/em&gt;&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%2Fuqeu9o7vzo7wn67wk8im.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%2Fuqeu9o7vzo7wn67wk8im.png" alt="Confuse" width="800" height="755"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  🔄 Try Alternative Models
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ollama pull glm-5:cloud
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ollama launch claude
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Choose the new model. The New Model was more precise and answer the question well. &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%2Fnarxsuefdr3hsrom5hq3.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%2Fnarxsuefdr3hsrom5hq3.png" alt="NewModel" width="800" height="480"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;💻 Example Prompts&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Based on the current project purpose that for explain about claude playground, I want you to trigger technical architect skill here to create boiler plate for golang, to create simple, concise and easy to learn. Please also put the README file about this project. Before you write and work for it, I want you to create a terminal wireframe to show me exactly, using the ASCII art, where you can be able to create a terminal wireframe of exactly what it is going to look like for this playground before we do implementation.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;If you want to know about the history of the conversation and the project that created by Free Claude, you can the github below&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tjandrayana/playground/tree/master/claude-pg" rel="noopener noreferrer"&gt;Claude Playground&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/tjandrayana/playground/blob/master/claude-pg/CONVERSATION.md" rel="noopener noreferrer"&gt;Claude Conversation history&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>freeclaude</category>
      <category>vibecoding</category>
    </item>
    <item>
      <title>Modernizing Cephalometric Analysis: Building a Web App for Orthodontic Diagnostics</title>
      <dc:creator>TJ</dc:creator>
      <pubDate>Mon, 01 Dec 2025 17:56:04 +0000</pubDate>
      <link>https://dev.to/tj1609/modernizing-cephalometric-analysis-building-a-web-app-for-orthodontic-diagnostics-3lp7</link>
      <guid>https://dev.to/tj1609/modernizing-cephalometric-analysis-building-a-web-app-for-orthodontic-diagnostics-3lp7</guid>
      <description>&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%2Fhsut9cht1j4ygtqdgf1k.jpeg" 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%2Fhsut9cht1j4ygtqdgf1k.jpeg" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem: When Legacy Code Meets Modern Needs
&lt;/h2&gt;

&lt;p&gt;The original cephalometric analysis tool worked, but it was slow. 30+ second build times, sluggish UI, and technology from 2018. As a developer working in healthcare technology, I modernized this legacy application - and the results were dramatic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The results&lt;/strong&gt;: 30+ second builds → &amp;lt;1 second HMR, 100% class components → modern React hooks, and 100% backward compatibility maintained. The result is &lt;a href="https://github.com/tjandrayana/ortho-cephalometry" rel="noopener noreferrer"&gt;&lt;strong&gt;Ortho Cephalometry&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Cephalometric Analysis?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Cephalometric analysis&lt;/strong&gt; is the science of measuring facial structures - how teeth, jaws, and facial bones relate to each other. Orthodontists use lateral cephalogram X-rays to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Measure angles and distances between anatomical landmarks&lt;/li&gt;
&lt;li&gt;Assess skeletal and dental relationships&lt;/li&gt;
&lt;li&gt;Plan treatment (braces, aligners, surgery)&lt;/li&gt;
&lt;li&gt;Track progress over time&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The analysis involves placing specific points on X-ray images and calculating measurements using methods like Downs Analysis, Steiner Analysis, Tweed's Triangle, and more. &lt;strong&gt;Accuracy and speed matter&lt;/strong&gt; - these measurements directly impact treatment decisions.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Modernization Journey
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Before → After
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Original Stack&lt;/strong&gt; (from 2018):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Webpack 4 (30+ second builds)&lt;/li&gt;
&lt;li&gt;React 16 (class components)&lt;/li&gt;
&lt;li&gt;TypeScript 2.9&lt;/li&gt;
&lt;li&gt;TSLint (deprecated)&lt;/li&gt;
&lt;li&gt;node-sass&lt;/li&gt;
&lt;li&gt;MobX 5&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Modern Stack&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Vite 5&lt;/strong&gt; - &amp;lt;1 second HMR&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;React 18&lt;/strong&gt; - Functional components with hooks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;TypeScript 5&lt;/strong&gt; - Better type inference&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;ESLint&lt;/strong&gt; - Modern linting&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Sass (Dart Sass)&lt;/strong&gt; - Latest compiler&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;MobX 6&lt;/strong&gt; - Latest state management&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Key Improvements
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Build Times&lt;/strong&gt;: 30+ seconds → &lt;strong&gt;&amp;lt;1 second&lt;/strong&gt; for HMR&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Component Architecture&lt;/strong&gt;: 100% migration to functional components with hooks&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Type Safety&lt;/strong&gt;: TypeScript 5 caught several bugs during migration&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Developer Experience&lt;/strong&gt;: Comprehensive Makefile for easy project management&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  The Challenge: 100% Backward Compatibility
&lt;/h3&gt;

&lt;p&gt;We maintained complete compatibility - same file format, same iframe protocol, identical analysis results. Users can migrate without losing any data. &lt;strong&gt;Zero breaking changes&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Features
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Interactive Point Placement&lt;/strong&gt;: Upload X-rays and place anatomical points with drag-and-drop&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;9+ Analysis Methods&lt;/strong&gt;: Downs, Steiner, Tweed, Wits, and more&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Save &amp;amp; Load&lt;/strong&gt;: &lt;code&gt;.cephalometric&lt;/code&gt; format for tracking patients over time&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Export&lt;/strong&gt;: PNG export for patient reports&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Embeddable&lt;/strong&gt;: iframe support for integration into larger systems&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Technical Highlights
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;MobX 6&lt;/strong&gt; for reactive state management - when points are placed, calculations update automatically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;observer&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;mobx-react-lite&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Main&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;observer&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// Automatically re-renders when observable data changes&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;AnalysisView&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Modern React Hooks&lt;/strong&gt; - clean, testable code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;useEffect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nb"&gt;window&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onmessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;function &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;startsWith&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cephalometric-open:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;loadProject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;parseProjectData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;TypeScript 5&lt;/strong&gt; caught several undefined point errors during migration that would have been runtime bugs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Getting Started
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Node.js 18+ and npm&lt;/li&gt;
&lt;li&gt;Make (usually pre-installed on Unix-like systems)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Quick Start
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Clone and install&lt;/span&gt;
git clone https://github.com/tjandrayana/ortho-cephalometry.git
&lt;span class="nb"&gt;cd &lt;/span&gt;ortho-cephalometry
make &lt;span class="nb"&gt;install&lt;/span&gt;

&lt;span class="c"&gt;# Run dev server (background)&lt;/span&gt;
make dev-bg

&lt;span class="c"&gt;# Check status, view logs, or stop&lt;/span&gt;
make status
make logs
make stop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The app runs at &lt;code&gt;http://localhost:3000&lt;/code&gt; with instant HMR thanks to Vite.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Makefile Commands&lt;/strong&gt;: &lt;code&gt;make install&lt;/code&gt;, &lt;code&gt;make dev-bg&lt;/code&gt;, &lt;code&gt;make build&lt;/code&gt;, &lt;code&gt;make preview&lt;/code&gt;, &lt;code&gt;make lint&lt;/code&gt;, &lt;code&gt;make clean&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Alternative&lt;/strong&gt;: Use npm scripts directly (&lt;code&gt;npm install&lt;/code&gt;, &lt;code&gt;npm run dev&lt;/code&gt;, etc.)&lt;/p&gt;

&lt;h2&gt;
  
  
  Project Structure
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ortho-cephalometry/
├── src/
│   ├── data/              # MobX state management
│   ├── literature/         # Cephalometric definitions
│   │   ├── analysis/      # Analysis methods
│   │   ├── angles.ts      # Angle definitions
│   │   ├── distances.ts   # Distance measurements
│   │   └── points.ts      # Point definitions
│   ├── view-components/   # React components
│   └── main.tsx           # Entry point
├── Makefile               # Build automation
└── vite.config.ts         # Vite config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Migration Notes
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;100% backward compatible&lt;/strong&gt; - existing &lt;code&gt;.cephalometric&lt;/code&gt; files work perfectly. Same file format, same iframe protocol, identical analysis results. Users can migrate seamlessly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Use Cases
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Orthodontic Clinics&lt;/strong&gt;: Daily diagnostic analysis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dental Schools&lt;/strong&gt;: Educational tool for teaching&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Research&lt;/strong&gt;: Data collection and analysis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Practice Management&lt;/strong&gt;: iframe integration into larger systems&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Lessons Learned
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What worked&lt;/strong&gt;: Vite over Webpack (build time improvement was huge), sticking with MobX (perfect for reactive calculations), the Makefile (small QoL improvements matter), 100% backward compatibility (zero migration pain).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I'd do differently&lt;/strong&gt;: Start with TypeScript 5 directly (incremental upgrade was slower), convert components in batches (more efficient), add more tests before migration (would catch issues earlier).&lt;/p&gt;

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

&lt;p&gt;Modernizing this application created a tool that saves time, reduces errors, improves maintainability, and enhances developer experience. The result serves the orthodontic community while being a pleasure to develop with.&lt;/p&gt;

&lt;p&gt;If you're working in healthcare technology or modernizing legacy applications, I hope this project serves as a useful reference. The techniques apply to any legacy React application.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check it out&lt;/strong&gt;: &lt;a href="https://github.com/tjandrayana/ortho-cephalometry" rel="noopener noreferrer"&gt;Repository&lt;/a&gt; | &lt;a href="https://github.com/alexcorvi/cephalometric" rel="noopener noreferrer"&gt;Original Project&lt;/a&gt; | &lt;a href="http://cephalometric.apexo.app/" rel="noopener noreferrer"&gt;Original Demo&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;: This tool is intended for professional use by qualified dental professionals. Always ensure proper training and understanding of cephalometric analysis before using in clinical practice.&lt;/p&gt;




</description>
      <category>webdev</category>
      <category>javascript</category>
      <category>react</category>
      <category>cephalometric</category>
    </item>
    <item>
      <title>A beginner's journey from setup hell to jump to heaven: Building a tool that does it in 30 seconds</title>
      <dc:creator>TJ</dc:creator>
      <pubDate>Tue, 18 Nov 2025 16:42:59 +0000</pubDate>
      <link>https://dev.to/tj1609/a-beginners-journey-from-setup-hell-to-building-a-docker-compose-orchestration-tool-that-runs-any-4fd6</link>
      <guid>https://dev.to/tj1609/a-beginners-journey-from-setup-hell-to-building-a-docker-compose-orchestration-tool-that-runs-any-4fd6</guid>
      <description>&lt;h1&gt;
  
  
  🎼 Building Stack Orchestra: From "I Can't Code" to "I Built This"
&lt;/h1&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Ever spent 3 hours setting up a database just to test a 5-minute feature?&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Yeah, me too. That's why I built Stack Orchestra.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  🎬 The Moment Everything Changed
&lt;/h2&gt;

&lt;p&gt;Picture this: It's 2 AM. You're learning to code. You need PostgreSQL for your project. You Google "how to install PostgreSQL," follow 15 different tutorials, mess up your system, spend hours fixing it, and finally—FINALLY—get it working.&lt;/p&gt;

&lt;p&gt;Then you realize you also need Redis. And Elasticsearch. And maybe Neo4j.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Sound familiar?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I just started learning to code, and I was drowning in setup hell. Every time I wanted to try a new technology, I'd spend more time configuring it than actually learning it. That's when I had my "enough is enough" moment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What if there was a way to spin up any tech stack with one command?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That question led me to build &lt;strong&gt;Stack Orchestra&lt;/strong&gt;—and it changed everything.&lt;/p&gt;




&lt;h2&gt;
  
  
  😤 The Problem That Drove Me Crazy
&lt;/h2&gt;

&lt;p&gt;Let me paint you a picture of my life before Stack Orchestra:&lt;/p&gt;

&lt;h3&gt;
  
  
  The Old Way (The Painful Way) 😰
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Monday: "I need PostgreSQL"
  → 2 hours installing PostgreSQL
  → 1 hour configuring it
  → 30 minutes troubleshooting
  → Finally working! ✅

Tuesday: "Now I need Redis"
  → 1 hour installing Redis
  → 30 minutes configuring
  → Conflict with PostgreSQL port
  → Fix conflict, restart everything
  → Finally working! ✅

Wednesday: "Let me try Elasticsearch"
  → 3 hours of Docker Compose hell
  → Memory issues
  → Port conflicts
  → Give up, use cloud version 😢
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Total time wasted: 8+ hours&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Actual coding time: Maybe 2 hours&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  The New Way (The Stack Orchestra Way) 🚀
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Need PostgreSQL? &lt;/span&gt;
make postgres-up
&lt;span class="c"&gt;# Done in 30 seconds ✅&lt;/span&gt;

&lt;span class="c"&gt;# Need Redis too?&lt;/span&gt;
make redis-up  
&lt;span class="c"&gt;# Done in 30 seconds ✅&lt;/span&gt;

&lt;span class="c"&gt;# Want Elasticsearch + Kibana?&lt;/span&gt;
make kibana-up
&lt;span class="c"&gt;# Automatically starts Elasticsearch too!&lt;/span&gt;
&lt;span class="c"&gt;# Done in 1 minute ✅&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Total time: 2 minutes&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Actual coding time: The rest of your day!&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  💡 The "Aha!" Moment
&lt;/h2&gt;

&lt;p&gt;I was sitting there, frustrated, thinking: &lt;em&gt;"Why does this have to be so hard?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Then it hit me: &lt;strong&gt;What if each technology was a separate, independent service?&lt;/strong&gt; What if I could start just what I need, when I need it?&lt;/p&gt;

&lt;p&gt;That's when Stack Orchestra was born.&lt;/p&gt;


&lt;h2&gt;
  
  
  🎯 What Stack Orchestra Actually Does
&lt;/h2&gt;

&lt;p&gt;Think of Stack Orchestra as your &lt;strong&gt;personal tech stack butler&lt;/strong&gt;. You tell it what you need, and it handles the rest.&lt;/p&gt;
&lt;h3&gt;
  
  
  🎪 Try This Right Now (Seriously, Do It!)
&lt;/h3&gt;

&lt;p&gt;Open your terminal and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/tjandrayana/stack-orchestra
&lt;span class="nb"&gt;cd &lt;/span&gt;stack-orchestra
make &lt;span class="nb"&gt;help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Boom!&lt;/strong&gt; You just saw all 9 available services. That took 10 seconds.&lt;/p&gt;

&lt;p&gt;Now try this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make postgres-up
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Wait 30 seconds...&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make ps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Look at that!&lt;/strong&gt; PostgreSQL is running. No configuration. No headaches. Just... working.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That feeling? That's what I wanted to give to every developer.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🎨 The Magic: How It Actually Works
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. 🎯 Run Only What You Need
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Before Stack Orchestra:&lt;/strong&gt;&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="c"&gt;# Start entire docker-compose with 9 services&lt;/span&gt;
docker-compose up &lt;span class="nt"&gt;-d&lt;/span&gt;
&lt;span class="c"&gt;# Your laptop: 💻🔥🔥🔥 (overheating)&lt;/span&gt;
&lt;span class="c"&gt;# Your RAM: 📈📈📈 (maxed out)&lt;/span&gt;
&lt;span class="c"&gt;# Your sanity: 😵 (gone)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;With Stack Orchestra:&lt;/strong&gt;&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="c"&gt;# Just need PostgreSQL? &lt;/span&gt;
make postgres-up
&lt;span class="c"&gt;# Only PostgreSQL runs. Your laptop: 😌 (happy)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Real talk:&lt;/strong&gt; How many times have you started a full docker-compose just to use one service? Stack Orchestra fixes that.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. 🧠 Smart Dependency Management (It's Actually Smart!)
&lt;/h3&gt;

&lt;p&gt;Here's where it gets cool. Watch this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make kibana-up
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;What just happened?&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Stack Orchestra saw you want Kibana&lt;/li&gt;
&lt;li&gt;It checked: "Does Kibana need anything? Yes, Elasticsearch!"&lt;/li&gt;
&lt;li&gt;It started Elasticsearch first&lt;/li&gt;
&lt;li&gt;Then it started Kibana&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;You did nothing.&lt;/strong&gt; Just one command.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Try it yourself:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make kibana-up
make ps
&lt;span class="c"&gt;# See both Elasticsearch AND Kibana running? &lt;/span&gt;
&lt;span class="c"&gt;# That's the magic! ✨&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;The best part?&lt;/strong&gt; You don't need to remember dependencies. Stack Orchestra does.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. ⚡ Choose Your Speed
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Feeling patient?&lt;/strong&gt; Start services one by one:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make up
&lt;span class="c"&gt;# Services start sequentially, nice and calm&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Feeling impatient?&lt;/strong&gt; Start them all at once:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make up-parallel
&lt;span class="c"&gt;# Everything starts simultaneously&lt;/span&gt;
&lt;span class="c"&gt;# Your laptop: "Challenge accepted!" 💪&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Want to control the chaos?&lt;/strong&gt;&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;PARALLELISM&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;3 make up-parallel
&lt;span class="c"&gt;# Start 3 services at a time&lt;/span&gt;
&lt;span class="c"&gt;# Perfect balance of speed and sanity&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🎁 What's in the Box? (Spoiler: It's Awesome)
&lt;/h2&gt;

&lt;p&gt;Stack Orchestra comes with &lt;strong&gt;9 battle-tested technology stacks&lt;/strong&gt;:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;🎯 Technology&lt;/th&gt;
&lt;th&gt;💡 What It's For&lt;/th&gt;
&lt;th&gt;🚀 Try It&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Elasticsearch + Kibana&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Search &amp;amp; Analytics&lt;/td&gt;
&lt;td&gt;&lt;code&gt;make kibana-up&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Neo4j&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Graph Databases&lt;/td&gt;
&lt;td&gt;&lt;code&gt;make neo4j-up&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;PostgreSQL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Relational DB&lt;/td&gt;
&lt;td&gt;&lt;code&gt;make postgres-up&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MySQL&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Relational DB&lt;/td&gt;
&lt;td&gt;&lt;code&gt;make mysql-up&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;ArangoDB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Multi-model DB&lt;/td&gt;
&lt;td&gt;&lt;code&gt;make arangodb-up&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Redis&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Caching &amp;amp; Queues&lt;/td&gt;
&lt;td&gt;&lt;code&gt;make redis-up&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;MongoDB&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Document DB&lt;/td&gt;
&lt;td&gt;&lt;code&gt;make mongodb-up&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Nginx&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Web Server&lt;/td&gt;
&lt;td&gt;&lt;code&gt;make nginx-up&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;OpenResty&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Nginx + Lua&lt;/td&gt;
&lt;td&gt;&lt;code&gt;make openresty-up&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Each one:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Pre-configured (no setup needed)&lt;/li&gt;
&lt;li&gt;✅ Health-checked (knows when it's ready)&lt;/li&gt;
&lt;li&gt;✅ Isolated (won't conflict with others)&lt;/li&gt;
&lt;li&gt;✅ Persistent (your data survives restarts)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🎬 A Day in My Life (With Stack Orchestra)
&lt;/h2&gt;

&lt;p&gt;Let me show you how I actually use this:&lt;/p&gt;

&lt;h3&gt;
  
  
  🌅 Morning: Learning Graph Databases
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make neo4j-up
&lt;span class="c"&gt;# Opens Neo4j Browser at http://localhost:7474&lt;/span&gt;
&lt;span class="c"&gt;# Learning Cypher queries&lt;/span&gt;
&lt;span class="c"&gt;# Building my first graph&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Time spent:&lt;/strong&gt; 30 seconds to start&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Time learning:&lt;/strong&gt; The rest of the morning! 🎓&lt;/p&gt;


&lt;h3&gt;
  
  
  🌞 Afternoon: Building a REST API
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make elasticsearch-up
make postgres-up  
make nginx-up
&lt;span class="c"&gt;# Full stack running in 2 minutes&lt;/span&gt;
&lt;span class="c"&gt;# Now I'm coding, not configuring!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Time spent:&lt;/strong&gt; 2 minutes&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Time coding:&lt;/strong&gt; The rest of the afternoon! 💻&lt;/p&gt;


&lt;h3&gt;
  
  
  🌙 Evening: Experimenting with Lua
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make openresty-up
&lt;span class="c"&gt;# Testing Lua scripts at http://localhost:8081&lt;/span&gt;
&lt;span class="c"&gt;# Building custom endpoints&lt;/span&gt;
&lt;span class="c"&gt;# Having fun! 🎉&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Time spent:&lt;/strong&gt; 30 seconds&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Time experimenting:&lt;/strong&gt; All evening! 🚀&lt;/p&gt;


&lt;h3&gt;
  
  
  😴 Bedtime: Clean Shutdown
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make down
&lt;span class="c"&gt;# Everything stops cleanly&lt;/span&gt;
&lt;span class="c"&gt;# No orphaned processes&lt;/span&gt;
&lt;span class="c"&gt;# Good night! 😴&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Time spent:&lt;/strong&gt; 5 seconds&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Peace of mind:&lt;/strong&gt; Priceless ✨&lt;/p&gt;


&lt;h2&gt;
  
  
  🎓 What I Learned (And You Can Too!)
&lt;/h2&gt;

&lt;p&gt;Building Stack Orchestra wasn't just about solving my problem—it was a crash course in:&lt;/p&gt;
&lt;h3&gt;
  
  
  1. 🐳 Docker Compose Architecture
&lt;/h3&gt;

&lt;p&gt;I learned how to structure multi-file compose projects. Each service is independent, but they share a network. It's like having separate apartments in the same building.&lt;/p&gt;
&lt;h3&gt;
  
  
  2. 📝 Makefile Mastery
&lt;/h3&gt;

&lt;p&gt;Makefiles aren't just for compiling C code! I learned to create reusable, parameterized build systems. It's like having a personal assistant that remembers all your commands.&lt;/p&gt;
&lt;h3&gt;
  
  
  3. 🎼 Service Orchestration
&lt;/h3&gt;

&lt;p&gt;Managing dependencies and startup order taught me how real orchestration tools work. It's the same concepts used in Kubernetes, just simpler.&lt;/p&gt;
&lt;h3&gt;
  
  
  4. 👥 Developer Experience
&lt;/h3&gt;

&lt;p&gt;The best tool is the one you actually use. I focused on making Stack Orchestra so simple that using it is faster than not using it.&lt;/p&gt;


&lt;h2&gt;
  
  
  🎯 Try It Yourself (No, Really!)
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Right now, in the next 2 minutes:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Clone the repo:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   git clone https://github.com/tjandrayana/stack-orchestra
   &lt;span class="nb"&gt;cd &lt;/span&gt;stack-orchestra
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;See what's available:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   make &lt;span class="nb"&gt;help&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Start your first service:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   make redis-up
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Check it's running:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   make ps
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Test it:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;   redis-cli ping
   &lt;span class="c"&gt;# Should return: PONG&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Congratulations!&lt;/strong&gt; You just started a service in under 2 minutes. No configuration. No headaches. Just... working.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That's the power of Stack Orchestra.&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  📊 The Impact: Before vs. After
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Before Stack Orchestra:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;⏰ &lt;strong&gt;Setup time:&lt;/strong&gt; 2-3 hours per new technology&lt;/li&gt;
&lt;li&gt;😰 &lt;strong&gt;Frustration level:&lt;/strong&gt; High&lt;/li&gt;
&lt;li&gt;💻 &lt;strong&gt;Actual coding:&lt;/strong&gt; 20% of time&lt;/li&gt;
&lt;li&gt;😵 &lt;strong&gt;Mental state:&lt;/strong&gt; Exhausted&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  After Stack Orchestra:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;⏰ &lt;strong&gt;Setup time:&lt;/strong&gt; 30 seconds&lt;/li&gt;
&lt;li&gt;😌 &lt;strong&gt;Frustration level:&lt;/strong&gt; Low&lt;/li&gt;
&lt;li&gt;💻 &lt;strong&gt;Actual coding:&lt;/strong&gt; 90% of time&lt;/li&gt;
&lt;li&gt;🚀 &lt;strong&gt;Mental state:&lt;/strong&gt; Energized&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The math is simple:&lt;/strong&gt; More time coding = More learning = Better developer&lt;/p&gt;


&lt;h2&gt;
  
  
  🎁 Real-World Scenarios
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Scenario 1: "I Need to Test Something Quickly"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Old way:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install service (30 min)&lt;/li&gt;
&lt;li&gt;Configure it (20 min)&lt;/li&gt;
&lt;li&gt;Test (5 min)&lt;/li&gt;
&lt;li&gt;Clean up (10 min)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Total: 65 minutes&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Stack Orchestra way:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;make &amp;lt;service&amp;gt;-up    &lt;span class="c"&gt;# 30 seconds&lt;/span&gt;
&lt;span class="c"&gt;# Test your thing&lt;/span&gt;
make &amp;lt;service&amp;gt;-down  &lt;span class="c"&gt;# 5 seconds&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Total: 35 seconds&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You just saved 64 minutes. That's a whole episode of your favorite show!&lt;/strong&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Scenario 2: "I'm Building a Full-Stack App"
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Old way:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Set up PostgreSQL (1 hour)&lt;/li&gt;
&lt;li&gt;Set up Redis (30 min)&lt;/li&gt;
&lt;li&gt;Set up Elasticsearch (1 hour)&lt;/li&gt;
&lt;li&gt;Configure Nginx (30 min)&lt;/li&gt;
&lt;li&gt;Fix conflicts (1 hour)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Total: 4 hours of setup&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Stack Orchestra way:&lt;/strong&gt;&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;SERVICES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"postgres redis elasticsearch nginx"&lt;/span&gt; make up-parallel
&lt;span class="c"&gt;# Wait 2 minutes...&lt;/span&gt;
&lt;span class="c"&gt;# Start coding!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Total: 2 minutes&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You just saved 3 hours and 58 minutes. That's enough time to build a feature!&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 What's Next? (The Roadmap)
&lt;/h2&gt;

&lt;p&gt;I'm not done yet! Here's what's coming:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🔮 &lt;strong&gt;More Services:&lt;/strong&gt; Kafka, Cassandra, InfluxDB, and more&lt;/li&gt;
&lt;li&gt;📚 &lt;strong&gt;Better Docs:&lt;/strong&gt; More examples, tutorials, and use cases&lt;/li&gt;
&lt;li&gt;🎨 &lt;strong&gt;UI Dashboard:&lt;/strong&gt; A web interface to manage services (maybe?)&lt;/li&gt;
&lt;li&gt;🤖 &lt;strong&gt;Auto-Discovery:&lt;/strong&gt; Automatically detect what services your project needs&lt;/li&gt;
&lt;li&gt;🌍 &lt;strong&gt;Cloud Support:&lt;/strong&gt; Deploy to AWS, GCP, Azure with one command&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Want to help?&lt;/strong&gt; Contributions are welcome! Check out the &lt;a href="https://github.com/tjandrayana/stack-orchestra" rel="noopener noreferrer"&gt;README&lt;/a&gt; for how to add new services.&lt;/p&gt;




&lt;h2&gt;
  
  
  💭 The Real Talk Section
&lt;/h2&gt;

&lt;p&gt;Here's the truth: &lt;strong&gt;I'm still learning to code.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This project isn't perfect. There are probably better ways to do things. But you know what? It works. It solves a real problem. And it's mine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That's the point.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;You don't need to be a senior engineer to build useful tools. You just need to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Have a problem&lt;/li&gt;
&lt;li&gt;Build a solution&lt;/li&gt;
&lt;li&gt;Share it with others&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Stack Orchestra proves that even beginners can create something valuable.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 Your Turn: What Will You Build?
&lt;/h2&gt;

&lt;p&gt;Now that you know about Stack Orchestra, here's my challenge to you:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Try it:&lt;/strong&gt; Clone the repo and start a service&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use it:&lt;/strong&gt; Build something with it&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Improve it:&lt;/strong&gt; Found a bug? Want a feature? Contribute!&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Share it:&lt;/strong&gt; Tell someone who might find it useful&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;The best way to learn is by doing.&lt;/strong&gt; Stack Orchestra gives you the infrastructure. Now go build something amazing!&lt;/p&gt;




&lt;h2&gt;
  
  
  🎬 The Conclusion (But Not Really)
&lt;/h2&gt;

&lt;p&gt;Stack Orchestra started as a personal learning tool. Now it's something I'm proud to share.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;But here's the real story:&lt;/strong&gt; This isn't about Stack Orchestra. It's about you.&lt;/p&gt;

&lt;p&gt;You're learning to code. You're facing the same problems I faced. You're spending hours on setup instead of coding.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You don't have to.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Stack Orchestra is here. It's free. It's open source. It's yours.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Use it. Improve it. Make it better. Share it.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Because the best tools aren't built by experts. They're built by people who have problems and decide to solve them.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔗 Quick Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;🔗 Repository:&lt;/strong&gt; &lt;a href="https://github.com/tjandrayana/stack-orchestra" rel="noopener noreferrer"&gt;github.com/tjandrayana/stack-orchestra&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;📄 License:&lt;/strong&gt; MIT (use it however you want!)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🤝 Contributing:&lt;/strong&gt; Pull requests welcome!&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;🐛 Issues:&lt;/strong&gt; Found a bug? Let me know!&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;💡 Ideas:&lt;/strong&gt; Have a feature request? Open an issue!&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💬 Let's Connect!
&lt;/h2&gt;

&lt;p&gt;Tried Stack Orchestra? Loved it? Hated it? Found a bug? Want to contribute?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I'd love to hear from you!&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⭐ Star the repo if you find it useful&lt;/li&gt;
&lt;li&gt;🐛 Open an issue if you find a problem&lt;/li&gt;
&lt;li&gt;💡 Suggest features you'd like to see&lt;/li&gt;
&lt;li&gt;🤝 Submit a PR if you want to help&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Remember:&lt;/strong&gt; We're all learning. Let's learn together.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Built with ❤️ by someone who's still learning, for others who are learning too.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Now go build something amazing! 🚀&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🎁 Bonus: Quick Start Cheat Sheet
&lt;/h2&gt;

&lt;p&gt;Save this for later:&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="c"&gt;# See all services&lt;/span&gt;
make &lt;span class="nb"&gt;help&lt;/span&gt;

&lt;span class="c"&gt;# Start one service&lt;/span&gt;
make &amp;lt;service&amp;gt;-up

&lt;span class="c"&gt;# Start multiple services&lt;/span&gt;
&lt;span class="nv"&gt;SERVICES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"postgres redis"&lt;/span&gt; make up

&lt;span class="c"&gt;# Start in parallel&lt;/span&gt;
&lt;span class="nv"&gt;SERVICES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"postgres redis mongodb"&lt;/span&gt; make up-parallel

&lt;span class="c"&gt;# Check status&lt;/span&gt;
make ps

&lt;span class="c"&gt;# View logs&lt;/span&gt;
&lt;span class="nv"&gt;SERVICES&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"postgres"&lt;/span&gt; make logs

&lt;span class="c"&gt;# Stop a service&lt;/span&gt;
make &amp;lt;service&amp;gt;-down

&lt;span class="c"&gt;# Stop everything&lt;/span&gt;
make down

&lt;span class="c"&gt;# Nuclear option (removes everything including data)&lt;/span&gt;
make clean
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;That's it. That's all you need to know.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now go code! 💻✨&lt;/p&gt;

</description>
      <category>docker</category>
      <category>beginners</category>
      <category>productivity</category>
      <category>webdev</category>
    </item>
  </channel>
</rss>
