<?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: Nikola Balic</title>
    <description>The latest articles on Forem by Nikola Balic (@nibzard).</description>
    <link>https://forem.com/nibzard</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%2F1142858%2Fca694e4a-dac4-45db-b7c4-0e6c7ce6bc66.png</url>
      <title>Forem: Nikola Balic</title>
      <link>https://forem.com/nibzard</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/nibzard"/>
    <language>en</language>
    <item>
      <title>Browser Automation Built for Agents</title>
      <dc:creator>Nikola Balic</dc:creator>
      <pubDate>Thu, 05 Mar 2026 16:08:17 +0000</pubDate>
      <link>https://forem.com/steeldotdev/browser-automation-built-for-agents-5gp2</link>
      <guid>https://forem.com/steeldotdev/browser-automation-built-for-agents-5gp2</guid>
      <description>&lt;p&gt;Today we're launching the new Steel CLI and &lt;code&gt;steel-browser&lt;/code&gt; skill, which brings browser automation redesigned from the ground up for agents.&lt;/p&gt;

&lt;p&gt;Agents handle code, reasoning, and tool use well enough. Then they hit a real website and everything falls apart. Login walls, dynamic content, anti-bot systems, session state that doesn't persist. A five-minute human task becomes a twenty-minute debugging session.&lt;/p&gt;

&lt;p&gt;This release targets that gap. It's also our first serious implementation of &lt;a href="https://biilmann.blog/articles/introducing-ax/" rel="noopener noreferrer"&gt;agent experience (AX)&lt;/a&gt;: building tools where agents get clear inputs, predictable outputs, and failures they can recover from.&lt;/p&gt;

&lt;h2&gt;
  
  
  TL;DR
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;New agent skill and CLI&lt;/li&gt;
&lt;li&gt;agent-browser integration&lt;/li&gt;
&lt;li&gt;Stealth: captcha solving &amp;amp; proxies for agents&lt;/li&gt;
&lt;li&gt;Run background browser sessions in parallel&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What this actually does
&lt;/h2&gt;

&lt;p&gt;The skill and CLI work together to make web tasks agents can finish reliably.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run multi-step flows through login and dynamic UI&lt;/li&gt;
&lt;li&gt;Pull clean markdown from cluttered pages&lt;/li&gt;
&lt;li&gt;Capture screenshots and PDFs as evidence&lt;/li&gt;
&lt;li&gt;Handle anti-bot measures and CAPTCHAs&lt;/li&gt;
&lt;li&gt;Maintain session state across longer runs&lt;/li&gt;
&lt;li&gt;Return structured outcomes you can verify&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A working agent web run should be boring. Predictable, reviewable, debuggable. Agent starts a browser session via CLI, follows the skill contract, executes commands (open, snapshot, click, fill, type, wait), collects artifacts, returns status.&lt;/p&gt;

&lt;p&gt;That's it. No heroics required.&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%2Fy2y449450jl1wv05vnkd.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%2Fy2y449450jl1wv05vnkd.png" alt="How to install Steel CLI and Skill" width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  SKILL.md: A contract, not a prompt
&lt;/h2&gt;

&lt;p&gt;&lt;code&gt;SKILL.md&lt;/code&gt; is a specification that tells an agent how to use a capability.&lt;/p&gt;

&lt;p&gt;For web tasks, it tells the agent:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;When to invoke the skill&lt;/li&gt;
&lt;li&gt;How to execute the workflow&lt;/li&gt;
&lt;li&gt;What shape the output takes&lt;/li&gt;
&lt;li&gt;How to handle blockers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The goal is simple: less prompt glue, more repeatable behavior. Instead of rebuilding web handling for every project, your team adopts one stable path that carries across agents and harnesses.&lt;/p&gt;

&lt;h2&gt;
  
  
  What the steel-browser skill handles
&lt;/h2&gt;

&lt;p&gt;This &lt;a href="https://github.com/steel-dev/cli/tree/main/skills/steel-browser" rel="noopener noreferrer"&gt;&lt;code&gt;steel-browser&lt;/code&gt;&lt;/a&gt; skill is designed for autonomous web tasks where basic fetch tools fall short, often failing across many sites due to blocking, complexity, and other limitations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Anti-bot and CAPTCHA flow
&lt;/h3&gt;

&lt;p&gt;When automation is blocked, agent can use these patterns:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;steel browser start &lt;span class="nt"&gt;--session&lt;/span&gt; checkout-bot-check &lt;span class="nt"&gt;--session-solve-captcha&lt;/span&gt;
steel browser open https://example.com
steel browser captcha solve &lt;span class="nt"&gt;--session&lt;/span&gt; checkout-bot-check
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For automation-first sessions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;steel browser start &lt;span class="nt"&gt;--session&lt;/span&gt; checkout-bot-check &lt;span class="nt"&gt;--stealth&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the difference between an agent that reports what it can't do and one that finishes the job.&lt;/p&gt;

&lt;h2&gt;
  
  
  The new Steel Browser CLI workflow
&lt;/h2&gt;

&lt;p&gt;The CLI is the operator layer. It handles session lifecycle and gives agents and humans a clean interface for browsing work.&lt;/p&gt;

&lt;h3&gt;
  
  
  Session lifecycle, cloud or local
&lt;/h3&gt;

&lt;p&gt;The CLI manages sessions and gives agents and humans a clean interface.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;steel browser start&lt;/code&gt; creates or attaches a named session&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;steel browser live&lt;/code&gt; prints the live view URL for the active session&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;steel browser sessions&lt;/code&gt; lists sessions as JSON for scripting and agent loops&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;steel browser stop&lt;/code&gt; stops the active session&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;steel browser stop --all&lt;/code&gt; stops every session&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;steel browser start --api-url&lt;/code&gt; connects through a self-hosted endpoint&lt;/li&gt;
&lt;/ul&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%2Frmp1u982yftu4gpjf968.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%2Frmp1u982yftu4gpjf968.png" alt="Steel session lifecycle, cloud or local" width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Passthrough commands for agent browser actions
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;steel browser&lt;/code&gt; command forwards inherited &lt;a href="https://github.com/vercel-labs/agent-browser" rel="noopener noreferrer"&gt;agent-browser&lt;/a&gt; actions with a command prefix swap, including &lt;code&gt;open&lt;/code&gt;, &lt;code&gt;snapshot&lt;/code&gt;, &lt;code&gt;fill&lt;/code&gt;, &lt;code&gt;click&lt;/code&gt;, and &lt;code&gt;wait&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Local runtime now lives under &lt;code&gt;steel dev&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Local runtime orchestration is now explicit and separate:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;steel dev install&lt;/code&gt; — install dependencies&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;steel dev start&lt;/code&gt; — start local runtime&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;steel dev stop&lt;/code&gt; — stop it&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes it easier to develop and debug workflows locally, then run the same shape of workflow in the cloud.&lt;/p&gt;

&lt;h2&gt;
  
  
  Get started
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Install and auth&lt;/span&gt;
npm i &lt;span class="nt"&gt;-g&lt;/span&gt; @steel-dev/cli
steel login
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Full command reference: &lt;a href="https://docs.steel.dev/overview/steel-cli" rel="noopener noreferrer"&gt;Steel CLI docs&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Install the skill
&lt;/h2&gt;

&lt;p&gt;Available in the CLI repo's skills package:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;npx skills add steel-dev/cli &lt;span class="nt"&gt;--skill&lt;/span&gt; steel-browser
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or via &lt;a href="https://skills.sh/steel-dev/cli/steel-browser" rel="noopener noreferrer"&gt;skills.sh&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where this helps
&lt;/h2&gt;

&lt;p&gt;This is not about browsing for its own sake. It is about unlocking agents and workflows where the web is the source of truth.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Competitive research with verifiable screenshots&lt;/li&gt;
&lt;li&gt;Lead enrichment from JavaScript-heavy sites&lt;/li&gt;
&lt;li&gt;Bug reproduction with session recordings&lt;/li&gt;
&lt;li&gt;QA testing on live interfaces&lt;/li&gt;
&lt;li&gt;Compliance documentation captured as PDFs&lt;/li&gt;
&lt;li&gt;Data extraction from gated portals&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Give your agent a real browser
&lt;/h2&gt;

&lt;p&gt;Run one real workflow. Tell us what worked and what didn't.&lt;/p&gt;

&lt;p&gt;Join our &lt;a href="https://discord.gg/steel" rel="noopener noreferrer"&gt;Discord&lt;/a&gt; and share your experience with the new skill and CLI.&lt;/p&gt;

</description>
      <category>browser</category>
      <category>automation</category>
      <category>agents</category>
      <category>playwright</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Nikola Balic</dc:creator>
      <pubDate>Wed, 25 Feb 2026 12:43:30 +0000</pubDate>
      <link>https://forem.com/nibzard/-3ice</link>
      <guid>https://forem.com/nibzard/-3ice</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/niksa" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&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%2Fuser%2Fprofile_image%2F3789292%2F983a1e48-6006-451e-86d2-88c9afa003a9.jpg" alt="niksa"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/niksa/making-browser-agents-observable-with-raindrop-and-steel-5fb9" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Making Browser Agents More Observable with Raindrop and Steel&lt;/h2&gt;
      &lt;h3&gt;Niksa Kuzmanic ・ Feb 24&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#ai&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#webdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#observability&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>ai</category>
      <category>webdev</category>
      <category>observability</category>
    </item>
    <item>
      <title>How Websites Decide You're Human</title>
      <dc:creator>Nikola Balic</dc:creator>
      <pubDate>Wed, 18 Feb 2026 15:12:02 +0000</pubDate>
      <link>https://forem.com/steeldotdev/how-websites-decide-youre-human-12gj</link>
      <guid>https://forem.com/steeldotdev/how-websites-decide-youre-human-12gj</guid>
      <description>&lt;p&gt;Automated bots account for nearly half of all web traffic. According to Akamai's 2024 State of the Internet report, bots make up about 42% of traffic—and nearly two-thirds of those are malicious. They scrape protected data, stuff credentials, hijack accounts, and exploit competitive advantages.&lt;/p&gt;

&lt;p&gt;This article explains how anti-bot protection works under the hood: the signals collected, the layers involved, and the logic that separates humans from sophisticated automation. Understanding the machinery helps you evaluate solutions, debug issues, and appreciate what it takes to defend modern applications.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding the Bot Threat Landscape
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Three Categories of Bot Traffic
&lt;/h3&gt;

&lt;p&gt;Modern websites see three types of automated traffic.&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%2Fm2yh3guwn3v2ex2o52xg.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%2Fm2yh3guwn3v2ex2o52xg.jpeg" alt="Layers" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Friendly Bots&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Search engine crawlers, uptime monitors, feed aggregators, and copyright verification tools. They follow robots.txt, identify themselves, and behave predictably. Let them through.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Jekyll and Hyde Bots&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Price comparison scrapers, social media automation tools, ticketing bots. Sometimes useful, sometimes abusive—depends on frequency, context, and business impact.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Malicious Bots&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Credential stuffing, DDoS attacks, payment fraud, account takeover, inventory hoarding, spam. This is what anti-bot systems exist to stop.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Modern Anti-Bot Systems Need Multiple Layers
&lt;/h2&gt;

&lt;p&gt;Bots range from simple scripts to full-blown headless browsers that mimic human behavior. No single detection method catches everything. Network-level checks stop basic automation but fail against residential proxies. Fingerprinting catches device anomalies but can be spoofed. Behavioral signals work well, but high-risk flows still need challenges.&lt;/p&gt;

&lt;p&gt;Modern anti-bot systems layer these techniques so weaknesses in one area get covered by strengths in another. Websites evaluate risk dynamically and escalate friction only when something looks truly suspicious.&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%2F50inmmzyiq1y6isttq6n.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%2F50inmmzyiq1y6isttq6n.jpeg" alt="Multi-layered bot detection workflow" width="800" height="1066"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Layer 1: Network-Level Detection
&lt;/h2&gt;

&lt;h3&gt;
  
  
  IP Reputation Analysis
&lt;/h3&gt;

&lt;p&gt;Anti-bot systems check incoming IPs against global threat intelligence sources to identify datacenter IPs, proxy services, VPN endpoints, Tor exit nodes, and known malicious addresses. IPs with poor reputation get flagged for additional verification like CAPTCHA challenges.&lt;/p&gt;

&lt;h3&gt;
  
  
  Rate Limiting
&lt;/h3&gt;

&lt;p&gt;Rate controls detect abnormal request patterns and prevent abuse. Common techniques:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Fixed window — counters reset at fixed intervals, such as 100 requests per hour&lt;/li&gt;
&lt;li&gt;Sliding window — distributes limits over rolling time intervals for smoother traffic management&lt;/li&gt;
&lt;li&gt;Token bucket — allows short bursts while maintaining sustained rate constraints&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When clients exceed limits, servers return HTTP 429 Too Many Requests. Advanced systems adapt limits based on authentication status, endpoint sensitivity, and past behavior.&lt;/p&gt;

&lt;h2&gt;
  
  
  Layer 2: Browser and Device Fingerprinting
&lt;/h2&gt;

&lt;p&gt;Browser and device fingerprinting generates stable identifiers by analyzing browser environment, operating system, and hardware characteristics. These identifiers don't rely on cookies, making them effective against bots that rotate identities, clear storage, or run in private mode.&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%2Fltkwkoa4223ojkahtam9.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%2Fltkwkoa4223ojkahtam9.jpeg" alt="Browser fingerprinting techniques and how they combine to create unique device identifiers" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Canvas Fingerprinting
&lt;/h3&gt;

&lt;p&gt;Canvas fingerprinting uses the HTML5 canvas element to detect differences in GPU hardware, graphics drivers, and rendering engines. The system draws text or graphics on a hidden canvas and captures the pixel data. Small variations in hardware or driver configuration produce different pixel patterns, creating a unique fingerprint.&lt;/p&gt;

&lt;h3&gt;
  
  
  Conceptual example
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Canvas fingerprint generation (conceptual example)&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;canvas&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;canvas&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ctx&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;2d&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;textBaseline&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;top&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;font&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;14px Arial&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;ctx&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;fillText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Browser fingerprint test&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;dataURL&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;canvas&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;toDataURL&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fingerprint&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;dataURL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  WebGL Fingerprinting
&lt;/h3&gt;

&lt;p&gt;WebGL fingerprinting uses the browser's 3D rendering pipeline. It collects GPU vendor, renderer strings, supported shader extensions, and rendering behavior. These parameters differ across devices and help identify automation tools using virtual GPUs.&lt;/p&gt;

&lt;h3&gt;
  
  
  Audio Context Fingerprinting
&lt;/h3&gt;

&lt;p&gt;The Web Audio API generates audio signals and measures how the device processes them. The resulting waveform varies across devices due to hardware audio pipelines, drivers, and browser implementations. These differences form a stable signature that's difficult for bots to spoof.&lt;/p&gt;

&lt;h3&gt;
  
  
  Font Enumeration
&lt;/h3&gt;

&lt;p&gt;Font fingerprinting checks the list of installed system fonts. Each operating system, enterprise device, or custom environment tends to have a unique font combination. These lists help differentiate between real users, automated browsers, and headless environments.&lt;/p&gt;

&lt;h3&gt;
  
  
  Hardware and Environment Profiling
&lt;/h3&gt;

&lt;p&gt;Anti-bot systems gather device metadata to build a broader fingerprint. Common signals:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Screen size and pixel density&lt;/li&gt;
&lt;li&gt;Available memory&lt;/li&gt;
&lt;li&gt;CPU core count&lt;/li&gt;
&lt;li&gt;Color depth&lt;/li&gt;
&lt;li&gt;Battery status (on mobile)&lt;/li&gt;
&lt;li&gt;Installed plugins, MIME types, or extensions&lt;/li&gt;
&lt;li&gt;System locale and timezone&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bots often fail to replicate the full set of these attributes, and small inconsistencies can reveal automated behavior.&lt;/p&gt;

&lt;h2&gt;
  
  
  Layer 3: Behavioral Analysis
&lt;/h2&gt;

&lt;p&gt;Behavioral analysis identifies patterns that deviate from natural human interaction.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mouse Movement Analysis
&lt;/h3&gt;

&lt;p&gt;Systems track cursor paths, acceleration, hesitations, and micro-adjustments. Humans move their mouse with natural curves and irregular pauses. Bots generate straight, overly precise, or uniform movements.&lt;/p&gt;

&lt;h3&gt;
  
  
  Keyboard Dynamics
&lt;/h3&gt;

&lt;p&gt;Systems evaluate typing cadence, key-press duration, rhythm variability, and error behavior. Human typing includes inconsistencies and occasional mistakes. Automated input shows perfectly uniform timing.&lt;/p&gt;

&lt;h3&gt;
  
  
  Navigation Patterns
&lt;/h3&gt;

&lt;p&gt;Systems observe page sequence, dwell time, scroll depth, speed, and interaction timing. Warning signs include instant form submissions, zero page dwell time, or clicking elements immediately after load.&lt;/p&gt;

&lt;h3&gt;
  
  
  Session Consistency
&lt;/h3&gt;

&lt;p&gt;Systems check whether user attributes stay stable during a session. Abrupt changes in fingerprints, IP, geolocation, or device traits indicate account takeover or bot-driven manipulation.&lt;/p&gt;

&lt;p&gt;Modern anti-bot systems apply machine learning models trained on massive datasets of real user interactions to identify statistical anomalies in real time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Layer 4: Challenge Mechanisms
&lt;/h2&gt;

&lt;p&gt;Challenge mechanisms act as the final barrier when a request appears risky. These controls require the client to prove a human or genuine browser environment operates it.&lt;/p&gt;

&lt;h3&gt;
  
  
  CAPTCHA Systems
&lt;/h3&gt;

&lt;p&gt;CAPTCHAs remain the most well-known challenge method. Modern variants:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Image-based CAPTCHAs where users read distorted text or pick the correct characters&lt;/li&gt;
&lt;li&gt;Object-recognition challenges that ask users to identify items like vehicles or signs&lt;/li&gt;
&lt;li&gt;Invisible CAPTCHAs that silently assess risk and only show a challenge when necessary&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;CAPTCHAs add friction and impact accessibility. Use them sparingly, only when risk is high.&lt;/p&gt;

&lt;h3&gt;
  
  
  Adaptive Interactive Challenges
&lt;/h3&gt;

&lt;p&gt;Some systems present lightweight interactive puzzles—dragging sliders, matching shapes, completing simple tasks. These adapt to the perceived risk level, making them harder for automated tools but easy for humans.&lt;/p&gt;

&lt;h3&gt;
  
  
  JavaScript Execution Challenges
&lt;/h3&gt;

&lt;p&gt;These challenges verify the environment supports full JavaScript execution and browser APIs. Examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Checking DOM manipulation behavior&lt;/li&gt;
&lt;li&gt;Requiring accurate execution of cryptographic or timing-based operations&lt;/li&gt;
&lt;li&gt;Creating dynamic elements that must be interpreted in a real browser&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Bots running in incomplete or emulated environments fail these checks.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Constant Evolution of Bots and Defenses
&lt;/h2&gt;

&lt;p&gt;Anti-bot engineering is a continuous arms race. As detection methods improve, attackers adapt with better browser automation tools, real-device spoofing, residential proxy networks, human-assisted solving, and AI-driven interaction patterns.&lt;/p&gt;

&lt;p&gt;Anti-bot systems must evolve continuously—updating signals, tuning thresholds, combining heuristics with learned models. Static defenses don't last long. Layered and adaptive ones do.&lt;/p&gt;

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

&lt;p&gt;Modern anti-bot systems operate as a layered security pipeline—analyzing network signals, device characteristics, behavior patterns, and environmental clues to distinguish real users from sophisticated automation. No single technique stands alone. Effective defenses combine reputation data, fingerprinting, behavioral modeling, and adaptive challenges.&lt;/p&gt;

&lt;p&gt;Understanding what happens behind the scenes demystifies why requests get flagged, why CAPTCHAs appear, and why bot mitigation is more complex than blocking IP ranges or checking user agents. Bots evolve quickly. Defending against them requires systems that evolve just as fast.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>browser</category>
      <category>playwright</category>
    </item>
    <item>
      <title>Balancing Speed and UX: Making Reasoning AI Work for Users</title>
      <dc:creator>Nikola Balic</dc:creator>
      <pubDate>Sun, 09 Feb 2025 00:00:00 +0000</pubDate>
      <link>https://forem.com/daytona/balancing-speed-and-ux-making-reasoning-ai-work-for-users-28h5</link>
      <guid>https://forem.com/daytona/balancing-speed-and-ux-making-reasoning-ai-work-for-users-28h5</guid>
      <description>&lt;p&gt;Large Language Models (LLMs) are advancing beyond simple parameter scaling, incorporating complex architectures like mixtures of experts and enhanced reasoning capabilities.&lt;/p&gt;

&lt;p&gt;Model makers such as OpenAI, Anthropic, Mistral, Google, and even DeepSeek are progressively releasing these reasoning models, which are now considered state-of-the-art (SOTA). These models excel at tackling complex, multi-step tasks, enabling solutions to challenges that were previously out of reach.&lt;/p&gt;

&lt;p&gt;However, this advancement comes with a significant user experience (UX) challenge: &lt;strong&gt;increased response times.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Power and Limitations of Reasoning Models
&lt;/h2&gt;

&lt;p&gt;Reasoning models offer substantial benefits by providing detailed, accurate answers to intricate problems.&lt;/p&gt;

&lt;p&gt;For example, while a standard LLM might succinctly answer, "The capital of France is Paris," a reasoning model would elaborate on the reasoning process: "Let me think. I remember learning in school that Paris is a major city in France. It's known for things like the Eiffel Tower, the Louvre museum, and the Seine River..."&lt;/p&gt;

&lt;p&gt;This enhanced capability is invaluable for tasks such as debugging complex code, solving advanced mathematical problems, and navigating intricate dependencies.&lt;/p&gt;

&lt;p&gt;Recently, I encountered persistent errors related to Pydantic validations imposed by dependencies. While multiple models struggled with these issues, the o1-mini model resolved them on the first attempt.&lt;/p&gt;

&lt;p&gt;In such scenarios, the quality and reliability of the response outweighed the inconvenience of a longer wait time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The UX Challenge: Speed vs. Quality
&lt;/h2&gt;

&lt;p&gt;Despite their superior performance, reasoning models introduce latency due to the additional computational steps required for complex reasoning.&lt;/p&gt;

&lt;p&gt;Users today expect immediate feedback, and any noticeable delay can be perceived as a weakness or inefficiency in the system. This perception poses a significant UX challenge: &lt;strong&gt;how to deliver high-quality, accurate responses without compromising on speed.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instantaneous interactions have become the norm in digital communications, and users are likely to abandon or lose trust in tools that introduce delays, even if those delays result in better outcomes.&lt;/p&gt;

&lt;p&gt;Balancing the need for quick responses with the demand for detailed, accurate information is crucial for the widespread adoption of reasoning models.&lt;/p&gt;

&lt;h2&gt;
  
  
  Leveraging Smart Model Routing
&lt;/h2&gt;

&lt;p&gt;One effective strategy to address this challenge is &lt;strong&gt;smart model routing&lt;/strong&gt;. This approach dynamically selects the most appropriate model based on the complexity of the user's query:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Simple Queries&lt;/strong&gt; : For straightforward tasks such as summarization, translation, or basic question-answering, faster, less resource-intensive models can be employed. These models provide instant responses, ensuring a seamless user experience.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Complex Tasks&lt;/strong&gt; : When faced with intricate problems that require deep reasoning, the system can route the query to more powerful reasoning models. Although these models may take slightly longer to respond, the accuracy and depth of their outputs justify the additional wait time.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Smart model routing ensures users receive a tailored balance of speed and intelligence, enhancing overall satisfaction while maintaining problem-solving quality.&lt;/p&gt;

&lt;h2&gt;
  
  
  Integrating Advanced Tools for Enhanced Workflows
&lt;/h2&gt;

&lt;p&gt;In addition to model routing, integrating specialized tools can further mitigate UX concerns associated with reasoning models. &lt;a href="https://github.com/daytonaio/sdk" rel="noopener noreferrer"&gt;&lt;strong&gt;Daytona SDK&lt;/strong&gt;&lt;/a&gt;&lt;a href="https://github.com/daytonaio/sdk" rel="noopener noreferrer"&gt;&lt;/a&gt;exemplifies how tool integration can enhance AI workflows:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ephemeral Environments&lt;/strong&gt; : Daytona SDK allows AI workflows or agents to create temporary, full-fledged environments—similar to throwaway laptops—for executing any piece of code. This capability enables models to handle tasks requiring real-time computation without significant delays.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Tool Adaptability&lt;/strong&gt; : Agents can develop their own tools or install and invoke existing ones, providing flexibility in addressing a wide range of challenges. This adaptability ensures that the system remains responsive and efficient even when leveraging powerful reasoning models.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By incorporating such tools, developers can create a more responsive user experience in their AI products and service that leverages the strengths of reasoning models without compromising on the perceived speed.&lt;/p&gt;

&lt;h2&gt;
  
  
  Future Directions: Combining Strategies for Optimal Performance
&lt;/h2&gt;

&lt;p&gt;The path forward involves integrating smart model routing with advanced toolsets like Daytona SDK. This combination can create a robust AI framework capable of:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Adaptive Responsiveness&lt;/strong&gt; : Seamlessly switching between models based on task complexity ensures optimal performance and user satisfaction.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Scalable Problem-Solving&lt;/strong&gt; : Leveraging specialized tools within ephemeral environments allows the system to tackle diverse challenges efficiently.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Enhanced User Trust&lt;/strong&gt; : Delivering accurate, high-quality responses without unacceptable delays builds user confidence in AI systems.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Tools to the Rescue
&lt;/h2&gt;

&lt;p&gt;The development of reasoning LLMs marks a significant advancement in AI, offering remarkable capabilities to solve complex problems. However, the associated increase in response times presents a UX challenge that cannot be overlooked.&lt;/p&gt;

&lt;p&gt;By implementing smart model routing and integrating powerful tools like Daytona SDK, it is possible to harness the full potential of reasoning models while maintaining the immediacy that users expect. Striking this balance is essential for advanced AI systems' continued adoption and success in real-world applications.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>sandbox</category>
      <category>agents</category>
      <category>ux</category>
    </item>
    <item>
      <title>How to Set Up Dev Environment on a Remote Machine</title>
      <dc:creator>Nikola Balic</dc:creator>
      <pubDate>Tue, 16 Apr 2024 00:00:00 +0000</pubDate>
      <link>https://forem.com/daytona/how-to-set-up-dev-environment-on-a-remote-machine-1fl4</link>
      <guid>https://forem.com/daytona/how-to-set-up-dev-environment-on-a-remote-machine-1fl4</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%2Fp9def33wobd7jdbhlwfw.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%2Fp9def33wobd7jdbhlwfw.png" alt=" " width="800" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this step-by-step guide, we'll walk you through setting up a dev environment with Daytona on a remote machine. Daytona is a powerful tool for creating and managing development environments on local or remote machines.&lt;/p&gt;

&lt;p&gt;In this example, we'll use an Azure ARM machine with 8 vCPUs, 16 GB of RAM, and 300 GB of storage. You can play around with different server specifications or utilize whatever is accessible to you, maybe a homelab machine or that server you have tucked away in a corner. This will affect the number of workspaces you can have concurrently and the overall user experience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TLDR:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prepare Remote Machine:&lt;/strong&gt; Install Docker and set permissions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Configure Daytona Target:&lt;/strong&gt; Add a remote machine as a target in Daytona.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Integrate Git Providers (Optional):&lt;/strong&gt; Add GitHub or other providers to Daytona.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Create and Access Workspace:&lt;/strong&gt; Use Daytona to create and open a workspace in VS Code.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Prerequisites:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Daytona daemon running on a local machine&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A remote machine with Docker installed&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SSH access to the remote machine&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A GitHub account with a personal access token&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 0: Set Up Daytona on Your Local Machine
&lt;/h2&gt;

&lt;p&gt;Before you can start using Daytona with a remote machine, you need to ensure that Daytona is properly set up on your local machine. If you haven't installed Daytona yet, don't worry! We've got you covered with a simple one-liner that will get you up and running in no time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Installing Daytona
&lt;/h3&gt;

&lt;p&gt;To install Daytona on your local machine, open a terminal and run the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(curl -sf -L https://download.daytona.io/daytona/install.sh | sudo bash) &amp;amp;&amp;amp; daytona server -d
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command will download the Daytona installation script from the official Daytona website and execute it using &lt;code&gt;sudo&lt;/code&gt; privileges. The script will guide you through the installation process, ensuring that all the necessary dependencies are installed and configured correctly.&lt;/p&gt;

&lt;h3&gt;
  
  
  Starting the Daytona Server
&lt;/h3&gt;

&lt;p&gt;Once the installation is complete, the command will automatically start the Daytona server in the background using the &lt;code&gt;-d&lt;/code&gt; flag. This means that you can continue using your terminal for other tasks while Daytona runs in the background.&lt;/p&gt;

&lt;p&gt;If you ever need to stop the Daytona server, you can do so by running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;daytona server stop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And to start it again, simply run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;daytona server start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Verifying the Installation
&lt;/h3&gt;

&lt;p&gt;To verify that Daytona is installed and running correctly on your local machine, you can run the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;daytona version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This command will display the currently installed version of Daytona, confirming that the installation was successful.&lt;/p&gt;

&lt;p&gt;With Daytona now set up on your local machine, you're ready to move on to the next step and prepare your remote machine for use with Daytona. In the following steps, we'll guide you through the process of installing Docker on the remote machine, configuring the necessary permissions, and adding the remote machine as a target in Daytona.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Prepare the Remote Machine
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://docs.docker.com/engine/install/" rel="noopener noreferrer"&gt;Install Docker&lt;/a&gt; on the remote machine if it's not already installed.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add your user to the &lt;a href="https://www.daytona.io/definitions/d/docker" rel="noopener noreferrer"&gt;Docker&lt;/a&gt; user group by running the following command:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo usermod -aG docker $USER
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Set the appropriate permissions for the Docker socket by running:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo chmod 666 /var/run/docker.sock
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2: Set Up the Target
&lt;/h2&gt;

&lt;p&gt;Daytona utilizes the concept of targets, allowing you to add remote machines for deploying and &lt;a href="https://www.daytona.io/definitions/d/development-environment-management-dem" rel="noopener noreferrer"&gt;managing development environments&lt;/a&gt;. By default, Daytona includes a Docker provider, enabling you to spin up environments on your local or remote machine inside Docker container.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Open the Daytona CLI and run &lt;code&gt;daytona server target list&lt;/code&gt; to view the available targets.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Set a new target by running &lt;code&gt;daytona server target set&lt;/code&gt; and selecting the desired provider (e.g., Azure).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide the necessary information, such as the IP address, username, and SSH key path.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Verify that the target was successfully added by running &lt;code&gt;daytona server target list&lt;/code&gt; again.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Step 3: Add Git Providers (Optional)
&lt;/h2&gt;

&lt;p&gt;This step is optional since you can simply paste the public Git URL to create a workspace from it.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;If you want to use your own &lt;a href="https://www.daytona.io/definitions/g/git" rel="noopener noreferrer"&gt;Git&lt;/a&gt; repositories directly with Daytona, you need to add a Git provider. We will use GitHub, but you can use GitLab, Bitbucket, Gitea, or Codeberg. You can also check our guide on &lt;a href="https://dev.to/nkko/comprehensive-guide-to-selecting-git-provider-4kmf-temp-slug-1383486"&gt;how to select Git provider&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Go to your GitHub settings and navigate to the Developer settings.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a personal access token with the necessary permissions (repositories access).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add the GitHub provider to Daytona using the generated access token and command &lt;code&gt;daytona git-providers add&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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%2Fwfhy5ed0kkqgf0sgsg1l.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%2Fwfhy5ed0kkqgf0sgsg1l.png" width="593" height="239"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Create a Workspace
&lt;/h2&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%2Fa6o5dg1kvbbq25wg0dte.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%2Fa6o5dg1kvbbq25wg0dte.png" width="761" height="487"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Run &lt;code&gt;daytona create&lt;/code&gt; to create a new workspace.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Choose the desired Git repository, by pasting the repo URL or selecting it from the list of your repositories, and select the target on which you wish to run your workspace.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Wait for Daytona to pull the necessary images and set up the workspace.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once the workspace is created, you can view it by running &lt;code&gt;daytona list&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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%2Frmgzi5rifn6i4burby6d.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%2Frmgzi5rifn6i4burby6d.png" width="800" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Open the Workspace in VS Code
&lt;/h2&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%2Fk8yq99ac57p2i5ix5ds0.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%2Fk8yq99ac57p2i5ix5ds0.png" width="800" height="536"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Set your preferred IDE by running &lt;code&gt;daytona ide&lt;/code&gt; and selecting VS Code. You can also use web IDE powered by OpenVSCode or any of the JetBrains IDEs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Run &lt;code&gt;daytona code&lt;/code&gt; to open the workspace in VS Code.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;VS Code will establish an SSH connection to the remote machine and set up the remote server.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once the connection is established, you can start working on your files within the workspace.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Step 6: Open the Workspace from a Development Container Specification (Optional)
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;If your workspace includes a dev container specification, you can rebuild the container from it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;VS Code will download the necessary images and start the container.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once the container is running, you can access the workspace and make changes on your code.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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%2Flq8twan57i12vf31t278.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%2Flq8twan57i12vf31t278.png" width="557" height="237"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Congratulations! You have successfully set up Daytona with a remote machine and created a workspace. You can now work on your projects seamlessly, whether locally or on a remote machine.&lt;/p&gt;

&lt;p&gt;If you encounter any issues or have further questions, feel free to contact the Daytona team in our Slack or add an issue to the &lt;a href="https://github.com/daytonaio/daytona" rel="noopener noreferrer"&gt;Daytona GitHub repository&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>guides</category>
      <category>howto</category>
      <category>daytona</category>
    </item>
    <item>
      <title>How We Missed #1 on Product Hunt but Still Won Big</title>
      <dc:creator>Nikola Balic</dc:creator>
      <pubDate>Fri, 29 Mar 2024 00:00:00 +0000</pubDate>
      <link>https://forem.com/daytona/how-we-missed-1-on-product-hunt-but-still-won-big-1gig</link>
      <guid>https://forem.com/daytona/how-we-missed-1-on-product-hunt-but-still-won-big-1gig</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%2Fxyxke2h47ct4zb4xlh8o.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%2Fxyxke2h47ct4zb4xlh8o.png" alt="Daytona on Product Hunt #2" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;When we decided to launch our open-source &lt;a href="https://www.daytona.io/definitions/d/development-environment-management-dem" rel="noopener noreferrer"&gt;dev environment management&lt;/a&gt; tool, &lt;a href="https://www.producthunt.com/posts/daytona" rel="noopener noreferrer"&gt;Daytona, on Product Hunt&lt;/a&gt;, we had no idea what we were getting ourselves into. With just a week to prepare, we began an unusual trip that normally requires weeks of strategic planning.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Launching on Product Hunt with just a week's notice, we faced challenges and learned valuable lessons about authenticity, engagement, and measuring success beyond vanity metrics. Despite missing the #1 spot, we still reaped significant benefits and discovered the true value of a Product Hunt launch.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Following our project's successful launch on GitHub as open-source under the Apache license, we were riding a wave of success. With stars in our eyes and a week to prepare, we dove headfirst into the world of Product Hunt launches. But here's the twist - we gave ourselves just one week to prepare. Crazy? Maybe. Educational? Definitely.&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%2Fvfcqixhpnvtf7uuljb1x.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%2Fvfcqixhpnvtf7uuljb1x.png" width="800" height="577"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Little did we know that our quest for Product Hunt glory would lead us down a path of epic struggle, valuable lessons, and ultimately, a newfound appreciation for the true value of launching on the platform.&lt;/p&gt;

&lt;p&gt;But, reaching &lt;a href="https://dev.to/daytona/how-to-write-a-4000-stars-github-readme-for-your-project-3167"&gt;5,000 GitHub stars&lt;/a&gt; in just three weeks secured us an engaged community and momentum, which we capitalized on to our advantage.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;It's not about the numbers or the vanity metrics – it's about the connections you make, the lessons you learn, and the impact you have on your community.&lt;/p&gt;

Ivan Burazin, CEO and founder of Daytona
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Debunking the Product Hunt Myths
&lt;/h2&gt;

&lt;p&gt;Let's begin by debunking a few widespread myths regarding Product Hunt.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;"You need a month to prepare for a Product Hunt launch."&lt;/strong&gt; - False. We did it in less than a week, and you can too. It's all about focus, determination, and a healthy dose of caffeine.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;"You need a fancy video and polished graphics."&lt;/strong&gt; - Nope. While great visuals help, what matters most is showcasing your product's value and engaging with the community. We prepared our materials by repurposing the assets already available in our team's Figma and reusing an &lt;a href="https://youtu.be/uL-TaEhvVwk" rel="noopener noreferrer"&gt;existing YouTube video&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;"You need to know someone to succeed."&lt;/strong&gt; - Absolutely not. We didn't have any insider connections, or hunters, just a genuine desire to share our project with the world.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Obstacles of Our Time-Constrained Product Hunt Launch
&lt;/h2&gt;

&lt;p&gt;Our accelerated approach came with its own set of challenges:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Limited Time for Preparation:&lt;/strong&gt; With only a week to prepare, we had to be laser-focused and prioritize our efforts.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Leveraging Existing Assets:&lt;/strong&gt; Instead of creating entirely new assets for the launch, we had to be resourceful and repurpose what we already had. This meant adapting our existing content, graphics, and messaging to fit the Product Hunt format and audience.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Building Buzz on Short Notice:&lt;/strong&gt; Typically, companies spend weeks or even months building anticipation for their Product Hunt launch. We had to compress this process into just a few days, which required a lot of creative thinking.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  How We Epically Failed to Reach #1 on Product Hunt
&lt;/h2&gt;

&lt;h3&gt;
  
  
  The Epic Failure:
&lt;/h3&gt;

&lt;p&gt;When our highly anticipated product launch on Product Hunt fell flat, it was a humbling and eye-opening experience. Here's three main reasons:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Underestimating the Competition:&lt;/strong&gt; We thought we had a killer product, a solid strategy, and enough caffeine to power a small nation. But we quickly learned that the competition on Product Hunt is no joke. We were up against some seriously impressive products and teams with deep pockets and even deeper connections. To make matters worse, we found ourselves competing with trendy AI startups popping up left and right, promising to revolutionize every industry.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Overestimating Our Influence:&lt;/strong&gt; We thought our existing community and open-source success would give us an advantage. Boy, were we wrong. Everything requires more effort than you might anticipate. Remember, communities are made up of individuals who can be forgetful or preoccupied with urgent matters of their own.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ignoring the Subtle Art of Upvote Hunting:&lt;/strong&gt; We naively believed that if we built it, they would come (and upvote). Little did we know that there's an entire art form dedicated to the subtle (and not-so-subtle) art of the deal on Product Hunt. We were like a bunch of amateurs trying to play chess against Hans Niemann.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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%2F5k0wprqfgjirrxqq8fvy.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%2F5k0wprqfgjirrxqq8fvy.png" width="800" height="331"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  The Brutal Honesty:
&lt;/h3&gt;

&lt;p&gt;Despite our best efforts, we ended up at #2 on Product Hunt. And you know what? It was one of the best "failures" we've ever experienced. Here's why:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Exposure, Exposure, Exposure:&lt;/strong&gt; We reached thousands of potential users, investors, and partners that we might never have reached otherwise.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Valuable Connections:&lt;/strong&gt; Through our launch, we connected with countless developers, entrepreneurs, and industry leaders who shared our passion for making development environments more accessible and efficient.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Lessons Learned:&lt;/strong&gt; Our "failure" taught us more about marketing, community building, and perseverance. We learned what works, what doesn't, and how to approach our next launch.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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%2Fjv8i8kivu13stbbff90e.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%2Fjv8i8kivu13stbbff90e.png" width="598" height="403"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  5 Key Benefits of Launching Your Dev Tool on Product Hunt
&lt;/h2&gt;

&lt;p&gt;The Value of Being #2 (or #3, or #4...): While the allure of being #1 on Product Hunt is undeniable, the true value lies in the exposure, connections, and lessons learned along the way. Here are five reasons why being #2 (or any other spot on the top 10 leaderboard) is still a massive win:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Widespread Exposure:&lt;/strong&gt; Despite being the second-ranking product, we were highlighted in Product Hunt's daily newsletter (top 10 gets in), which boasts an estimated reach of over 750,000 subscribers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Social Proof:&lt;/strong&gt; Being at the top on Product Hunt serves as a powerful social proof, validating your product's value and attracting potential users and investors.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Social Media Boost:&lt;/strong&gt; Due to our massive social media presence on the launch day, we saw a 50% increase in Twitter impressions and a 10% increase in followers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Multiplication Opportunities:&lt;/strong&gt; Top products on Product Hunt often catch the attention of other creators, journalists, and influencers, leading to potential additional coverage.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Community Engagement:&lt;/strong&gt; Topping the charts on Product Hunt can spark conversations and engagement within the tech community, providing valuable feedback and insights.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;And one bonus point: &lt;strong&gt;Bragging Rights&lt;/strong&gt; - Let's be honest – being able to say your product was ranked top on Product Hunt is a pretty cool feat.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Product Hunt Launch Day Frenzy
&lt;/h2&gt;

&lt;p&gt;On the day of the launch, the energy was palpable, like a scene straight out of a heist movie. Our team, was ready to jump on any opportunity to engage with the Product Hunt community. I, fueled by a steady drip of caffeine, was answering questions and comments with the speed of a speeding bullet. We even had a secret weapon: a stash of memes, ready to be deployed at a moment's notice, adding an element of playfulness to our interactions.&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%2Ff5cdwx7eocbjskglgree.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%2Ff5cdwx7eocbjskglgree.png" width="800" height="666"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Throughout the day, I dedicated 20 hours to responding to messages, comments, and publishing updates across our social media channels. Although exhausting, this experience taught me the invaluable lesson of being present and responsive during a product launch.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Worthy mention&lt;/strong&gt; — One of the great tools that helped us track our launch progress throughout the day was &lt;a href="https://hunted.space/" rel="noopener noreferrer"&gt;Hunted Space&lt;/a&gt;. It gave us a clearer understanding of how to understand the leaderboard mechanics and the fluctuations in upvotes.&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%2Fu9gjv7kcsg64b1rxrrha.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%2Fu9gjv7kcsg64b1rxrrha.png" width="800" height="737"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As the day drew to a close, we were left in the #3 spot, which left us perplexed for a few hours. Unbeknownst to us, one of the other products had gained an astounding number of upvotes in the final minutes, propelling them to the coveted #1 position. This sudden shift caught the attention of the watchful team at Product Hunt, who promptly investigated and corrected the anomaly in the upvote count.&lt;/p&gt;

&lt;p&gt;After the final tally, we were delighted to discover that we had safely landed in the second-place spot, earning the silver medal. This outcome was a testament to the hard work and dedication our team had poured into the launch, as well as the recognition from the Product Hunt community.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step-by-Step Launch Preparation Guide
&lt;/h2&gt;

&lt;p&gt;To those considering launching on Product Hunt, we encourage you to define success holistically, focus on authenticity, engage with the community, leverage your existing audience, and learn from the experience.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Set your launch date and commit to it, even if it is in two days. No backing out now!&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Gather your assets. Screenshots, GIFs, and a concise description of your product are essential.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Craft your pitch. Tell your story, highlight your product's unique value, and don't be afraid to show some personality.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Rally your troops. Notify your existing community about the upcoming launch and ask for their support.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Get some rest. Trust us, you'll need it.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Launch day: Buckle up and enjoy the ride! Block off some time in the team's calendar to ensure everyone participates in engaging with your social media posts, giving them an initial boost.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  One End Game Tip for Winning Product Hunt
&lt;/h2&gt;

&lt;p&gt;If you pushed me into a corner and forced me to share just one genuine tip, it would be this:&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Cross-promote like crazy:&lt;/strong&gt; Share your Product Hunt link on every relevant platform, from social media to industry forums. You never know where your next upvote will come from.&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%2Fmv6o8woh0mm2fjyxat8r.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%2Fmv6o8woh0mm2fjyxat8r.png" width="800" height="655"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Our Product Hunt Launch Adventure with Daytona Ends (for now)
&lt;/h2&gt;

&lt;p&gt;Launching on Product Hunt in just one week was a wild ride, but we wouldn't have it any other way. We learned valuable lessons that success isn't just about vanity metrics, but about the connections we make, the lessons we learn, and the impact we have on our community.&lt;/p&gt;

&lt;p&gt;So, if you're considering a Product Hunt launch, don't let the myths hold you back. Embrace the unconventional, stay true to yourself, and most importantly, have fun!&lt;/p&gt;

&lt;p&gt;Ready to Try Daytona? If you're a developer looking to streamline your development environment setup, head over to our &lt;a href="https://github.com/daytonaio/daytona" rel="noopener noreferrer"&gt;GitHub repository and give Daytona a try&lt;/a&gt;. We're excited to continue building this open-source tool alongside our growing community.&lt;/p&gt;

&lt;h2&gt;
  
  
  Where to Look for More Inspiration and Tips
&lt;/h2&gt;

&lt;p&gt;For more insights and inspiration on launching your product on Product Hunt, be sure to check out some of the fantastic resources we've read through while prepping our launch.&lt;/p&gt;

&lt;p&gt;We highly recommend the comprehensive guide by &lt;a href="https://www.producthunt.com/launch" rel="noopener noreferrer"&gt;Product Hunt&lt;/a&gt; themselves, which covers everything from crafting your launch strategy to engaging with the community.&lt;/p&gt;

&lt;p&gt;For a fresh perspective, don't miss the recent post by Steven Tey, detailing how his startup &lt;a href="https://dub.co/blog/product-hunt" rel="noopener noreferrer"&gt;&lt;strong&gt;Dub.co&lt;/strong&gt;&lt;/a&gt; achieved #1 Product of the Day and #1 Product of the Week. Steven shares his step-by-step playbook, emphasizing the importance of building a strong community, creating stellar launch assets, and staying engaged throughout the launch process.&lt;/p&gt;

&lt;p&gt;Also, for another firsthand account of achieving 'Product of the Day' with a dev tool, check out Daniel Bass's insights on growth tips and community engagement during &lt;a href="https://dev.to/gemanor/how-we-got-our-dev-tool-product-of-the-day-in-product-hunt-and-survived-3m76"&gt;&lt;strong&gt;Permit.io's&lt;/strong&gt;&lt;/a&gt; launch.&lt;/p&gt;

&lt;p&gt;Other noteworthy articles include &lt;a href="https://dev.to/ukutaht/how-not-to-launch-on-product-hunt-and-lessons-from-our-successful-launch-1ndj-temp-slug-2442558"&gt;&lt;strong&gt;Plausible's&lt;/strong&gt;&lt;/a&gt; honest account of their successful launch, &lt;a href="https://www.softr.io/blog/producthunt-launch" rel="noopener noreferrer"&gt;&lt;strong&gt;Softr's&lt;/strong&gt;&lt;/a&gt; tips for reaching the top, and the insightful behind-the-scenes look at &lt;a href="https://kleversuite.com/blog/post/product-hunt-launch-success" rel="noopener noreferrer"&gt;&lt;strong&gt;Klever Suite's&lt;/strong&gt;&lt;/a&gt; Product Hunt journey.&lt;/p&gt;

</description>
      <category>howto</category>
      <category>producthunt</category>
    </item>
    <item>
      <title>Daytona Goes Open Source: Embarking on a Bold New Journey</title>
      <dc:creator>Nikola Balic</dc:creator>
      <pubDate>Tue, 05 Mar 2024 00:00:00 +0000</pubDate>
      <link>https://forem.com/daytona/daytona-goes-open-source-embarking-on-a-bold-new-journey-4glk</link>
      <guid>https://forem.com/daytona/daytona-goes-open-source-embarking-on-a-bold-new-journey-4glk</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%2Fioy38cu4fbban68r69ne.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%2Fioy38cu4fbban68r69ne.png" alt=" " width="800" height="402"&gt;&lt;/a&gt;&lt;br&gt;
Daytona is leaping into the open source. It's a decision that feels akin to sending our beloved brainchild into the world, allowing it to grow beyond the confines of our aspirations.&lt;/p&gt;

&lt;p&gt;We've nurtured Daytona with love and dedication. But the time has come for us to share our creation with the community that has been the backbone of our industry. Today marks not just another product release, but a heartfelt invitation to developers everywhere to join us in shaping Daytona's future.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Why Open Source?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The decision to go open source stems from a simple truth: innovation thrives in collaboration. By opening up Daytona's codebase, we're inviting developers to co-create the future of development environments with us. The tools that shape our digital world will no longer be confined behind proprietary walls. Instead, they will be shaped by the people who use them, in full view of the community that needs them.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Why Now?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Since Daytona's inception, our primary goal has been to address the challenges that enterprises encounter with their development environments. We have concentrated our efforts on enhancing code security, scaling and orchestrating environments efficiently, and streamlining the experience for developers when initiating development environments. We take pride in the significant progress we have made in these areas.&lt;/p&gt;

&lt;p&gt;We recently began to wonder why this experience isn't shared by every developer across the globe. It's already 2024, yet setting up development environments still requires an average of at least 30 minutes and involves numerous steps. More often than not, developers encounter issues that impede their progress. We've discussed this in detail in a full article, which you can &lt;a href="https://dev.to/daytona/diy-guide-to-transform-any-machine-into-a-codespace-2a4g"&gt;read here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Our team quickly got to work. They skillfully extracted the core of Daytona, the &lt;a href="https://www.daytona.io/definitions/d/development-environment-management-dem" rel="noopener noreferrer"&gt;development environment manager&lt;/a&gt;, and transformed it into a standalone binary that is now freely accessible for anyone to use.&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%2Fz6bvqxcegnzhuajxqpru.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%2Fz6bvqxcegnzhuajxqpru.png" width="800" height="486"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;But, What Does It Do?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Daytona is a radically simple open-source development environment manager. With Daytona, you need only to execute a single command &lt;em&gt;&lt;code&gt;daytona create.&lt;/code&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Daytona automates the entire process: provisioning the instance, interpreting and applying the configuration, setting up prebuilds, establishing a secure VPN connection, securely connecting your local or a Web IDE, and assigning a fully qualified domain name to the development environment for easy sharing and collaboration.&lt;/p&gt;

&lt;p&gt;While this is the alpha release, it represents the first step towards realizing our vision of a completely automated development environment.&lt;/p&gt;

&lt;p&gt;As a developer, you can immediately start focusing on what matters most—your code.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Can I Do With It?
&lt;/h2&gt;

&lt;p&gt;Daytona can be downloaded and executed as a binary and you can just use it in your everyday life. Daytona is extendable by design, allowing you to create plugins that meet your specific needs. Moreover, it is genuinely open source under the Apache 2.0 license, providing you with unlimited freedom to modify and use Daytona as you see fit.&lt;/p&gt;

&lt;h2&gt;
  
  
  Promise of Open Source Project Sustainability
&lt;/h2&gt;

&lt;p&gt;Daytona, the company, already generates revenue with an expanded product lineup that addresses orchestration, scalability, and security needs, catering to large enterprises while also focusing on enhancing the developers' experience.&lt;/p&gt;

&lt;p&gt;Additionally, as previously noted, since Daytona is licensed under Apache 2.0, the community has the safeguard to create a fork should the project veer off course.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Join the Open Source Movement&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;We believe in a world where every developer can access the best tools, regardless of background or resources. By going open source, we're committing to that world. Whether you're an individual coder, part of a small startup, or leading a large enterprise team, &lt;strong&gt;Daytona is now your tool to shape as you see fit.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We invite you to join us on this journey. Contribute to the codebase, share your ideas, and help us build a tool that reflects the diverse needs of the global developer community.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Ready to Dive In?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Visit our GitHub repository (&lt;a href="https://github.com/daytonaio/daytona" rel="noopener noreferrer"&gt;https://github.com/daytonaio/daytona&lt;/a&gt;) to &lt;a href="https://github.com/daytonaio/daytona" rel="noopener noreferrer"&gt;&lt;strong&gt;start contributing today&lt;/strong&gt;&lt;/a&gt;, sign up for our newsletter updates, and follow our voyage on social media.&lt;/p&gt;

&lt;p&gt;The open source waters are warm, and the winds of change are favorable. Here's to the open source. Here's to Daytona—by developers, for developers.&lt;/p&gt;

</description>
      <category>opensource</category>
    </item>
    <item>
      <title>DIY Guide to Transform Any Machine into a Codespace</title>
      <dc:creator>Nikola Balic</dc:creator>
      <pubDate>Mon, 26 Feb 2024 00:00:00 +0000</pubDate>
      <link>https://forem.com/daytona/diy-guide-to-transform-any-machine-into-a-codespace-2a4g</link>
      <guid>https://forem.com/daytona/diy-guide-to-transform-any-machine-into-a-codespace-2a4g</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%2Fg8gr0v3nyfm4pildqf5p.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%2Fg8gr0v3nyfm4pildqf5p.png" alt="DIY Guide to Transform Any Machine into a Codespace" width="750" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Setting up any Dev Environment is usually painful, but the pain instantly doubles when you have to set it up on a remote machine. But why should you work on a remote machine?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;There are many reasons:&lt;/strong&gt; the size of the machine (for complex builds, dependencies, data locality, or running large ML/AI models), security, your employer needs the code in their data center, you're on the go with your iPad or Chromebook, or you're just tinkering with a Raspberry Pi.&lt;/p&gt;

&lt;p&gt;No matter your reason, we wanted to make an easy step-by-step guide to let you set up a standardized, collaborative, and secure dev environment – essentially giving you a Codespaces-like experience on any machine.&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%2F282cd9xi8k1kcdwd9c2e.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%2F282cd9xi8k1kcdwd9c2e.png" width="750" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Setting up a &lt;a href="https://www.daytona.io/definitions/r/remote-development-environment" rel="noopener noreferrer"&gt;remote development environment&lt;/a&gt; can streamline your workflow and enhance collaboration. Instead of relying on a proprietary service like &lt;a href="https://www.daytona.io/definitions/c/codespaces" rel="noopener noreferrer"&gt;Codespaces&lt;/a&gt;, this guide will walk you through the process of creating your own custom remote dev environment on a Linux server.&lt;/p&gt;

&lt;p&gt;There are many ways to go about it, but for this guide, we will assume you will use Visual Studio Code and leverage &lt;a href="https://www.daytona.io/definitions/d/docker" rel="noopener noreferrer"&gt;Docker&lt;/a&gt; &lt;a href="https://www.daytona.io/definitions/c/containerization" rel="noopener noreferrer"&gt;containers&lt;/a&gt; to isolate dependencies and services &lt;a href="https://www.daytona.io/definitions/c/containerization" rel="noopener noreferrer"&gt;needed&lt;/a&gt; for development.&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%2F0830de1286bcqqogg17f.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%2F0830de1286bcqqogg17f.png" width="717" height="348"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;To follow this guide and set up your own remote dev environment, you will need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A Linux server running Ubuntu 20.04+ with at least 2 GB of RAM and 2 CPU cores. This can be a virtual private server (VPS) from a cloud provider or maybe even a Raspberry Pi.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Admin/root access to the server to install software.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We will assume your local machine runs a MacOS or Linux variant (maybe even a WSL), if you are using Windows be sure to adapt some commands but everything should work as advertised.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A Visual Studio Code on your local machine.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Basic knowledge of command line interfaces and experience with Docker is helpful.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Some courage.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1a - Provision Linux Server
&lt;/h2&gt;

&lt;p&gt;First, you'll need to provision a Linux server that will host your remote development environment.&lt;/p&gt;

&lt;p&gt;While you can repurpose an existing server, starting fresh helps avoid conflicts. Provision an &lt;strong&gt;Ubuntu 20.04&lt;/strong&gt; server with &lt;strong&gt;at least 2 GB RAM and 2 CPU cores&lt;/strong&gt; from your preferred hosting provider.&lt;/p&gt;

&lt;p&gt;Many cloud providers like AWS, GCP, Azure, and DigitalOcean allow instant provisioning of Ubuntu VPS instances at reasonable prices. Some of them even provide a complimentary initial credit; for instance, Digital Ocean offers credit for the first 60 days.&lt;/p&gt;

&lt;p&gt;For example, Oracle offers a free-tier cloud account that allows you to utilize 4 cores ARM machine and up to 24GB of memory. Just prepare to be patient, as registering and setting up your account will require some effort.&lt;/p&gt;

&lt;p&gt;A Raspberry Pi also works well if you want to save costs and don't need significant compute resources. Install the latest Raspberry Pi OS (formerly Raspbian) on compatible Pi hardware. To be honest, we haven't attempted it, but if you decide to try it, please let us know.&lt;/p&gt;

&lt;p&gt;Once your Linux server is up and running, SSH into it to begin setup.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1b - Generate SSH Keys (optional)
&lt;/h2&gt;

&lt;p&gt;If you haven't already configured your &lt;a href="https://www.daytona.io/definitions/s/ssh" rel="noopener noreferrer"&gt;SSH&lt;/a&gt; keys, we'll need to create them to establish a secure connection to the remote server.&lt;/p&gt;

&lt;p&gt;Based on the remote server you're using, you'll need to prepare your &lt;a href="https://www.daytona.io/definitions/s/ssh-keys" rel="noopener noreferrer"&gt;SSH keys&lt;/a&gt; for the provisioning process so that you can input them into the dashboard of your preferred cloud provider. Alternatively, you can initially configure your server using a password and then add the SSH keys by following the instructions in the second section below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;### On your local machine:

# Open a terminal and generate a keypair:
ssh-keygen -t rsa

# Save the private and public keys in the default location.

# Copy the public key:
cat ~/.ssh/id_rsa.pub

### On the remote server:

# Log in and create an .ssh folder:
mkdir .ssh

# Create an authorized_keys file and paste your public key:
nano .ssh/authorized_keys

# Set permissions:
chmod 700 .ssh
chmod 600 .ssh/authorized_keys
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now, you can SSH into the server without a password using the private key.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh user@your-server-ip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fzx40tovnsdz2z8b6peqv.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%2Fzx40tovnsdz2z8b6peqv.png" width="500" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2 - Install Docker
&lt;/h2&gt;

&lt;p&gt;Since we will leverage Docker to isolate and run services needed for development, Docker Engine is essential. Follow the official &lt;a href="https://docs.docker.com/engine/install/ubuntu/" rel="noopener noreferrer"&gt;Docker install directions for Ubuntu&lt;/a&gt; to get up and running.&lt;/p&gt;

&lt;p&gt;With SSH set up, let's install Docker on the remote server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Update package lists
sudo apt update 

# Install Docker prerequisites
sudo apt install apt-transport-https ca-certificates curl software-properties-common

# Add Docker's GPG key 
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# Set up the Docker apt repository
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu focal stable" | sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null

# Install Docker
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Check it worked:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker --version
docker run hello-world
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This should successfully download a test container image and print a confirmation message. If the last command encounters a permission error, attempt to run it again using &lt;code&gt;sudo&lt;/code&gt; before the command.&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%2Fmk5sn8l84tdcj1u91cki.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%2Fmk5sn8l84tdcj1u91cki.png" width="800" height="486"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While optional, &lt;a href="https://www.daytona.io/definitions/d/docker-compose" rel="noopener noreferrer"&gt;Docker Compose&lt;/a&gt; makes working with multi-container apps much easier. We'll use it later to orchestrate our dev environment services.&lt;/p&gt;

&lt;p&gt;First things first, ensure Docker Compose is properly installed by confirming the version number.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker compose version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If that is not the case, &lt;a href="https://docs.docker.com/compose/install/linux/#install-using-the-repository" rel="noopener noreferrer"&gt;install Docker Compose&lt;/a&gt; it with the following commands.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt-get update
sudo apt-get install docker-compose-plugin
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Add your user to the &lt;code&gt;docker&lt;/code&gt; group by using a terminal to run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo usermod -aG docker $USER
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Please log out and then log back in to ensure that the changes to the settings are applied.&lt;/p&gt;

&lt;p&gt;Adding your username to the Docker group in a Linux system is a common practice to allow non-root users to run Docker commands without needing to use &lt;code&gt;sudo&lt;/code&gt; each time. By default, Docker requires elevated privileges, and running Docker commands as a regular user without proper permissions would result in permission-denied errors.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3 - Connect Visual Studio Code to Remote Environment
&lt;/h2&gt;

&lt;p&gt;To allow connecting to your remote dev environment from Visual Studio Code, we need to install &lt;a href="https://code.visualstudio.com/docs/remote/remote-overview" rel="noopener noreferrer"&gt;VS Code Server&lt;/a&gt;. The Visual Studio Code Server is a service designed to operate on a remote development environment, such as your cloud virtual machine (VM). This will run on the remote host and communicate with the VS Code client on our local machine.&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%2Fg3bzjec140j6qvexbeoe.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%2Fg3bzjec140j6qvexbeoe.png" width="800" height="257"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Back on our local machine, launch VS Code and install the &lt;a href="https://marketplace.visualstudio.com/items?itemName=ms-vscode-remote.remote-ssh" rel="noopener noreferrer"&gt;Remote - SSH extension&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Use the Command Palette (Ctrl/Cmd+Shift+P or F1) in VS Code to run &lt;strong&gt;Remote-SSH: Connect to Host...&lt;/strong&gt; and enter your server info &lt;code&gt;user@your-server-ip&lt;/code&gt; from the last step.&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%2Fs97d7cezxvyz8wnjo80m.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%2Fs97d7cezxvyz8wnjo80m.png" width="800" height="557"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once connected, VS Code will automatically install the VS Code Server on your remote machine.&lt;/p&gt;

&lt;p&gt;You now have full VS Code functionality on the remote server, you can open folders and work directly on the remote server!&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%2F1szrw7b7j0uozdau3erz.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%2F1szrw7b7j0uozdau3erz.png" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4 - Clone Sample Project
&lt;/h2&gt;

&lt;p&gt;With our base environment setup, let's clone &lt;a href="https://www.daytona.io/definitions/r/repository" rel="noopener noreferrer"&gt;the repository&lt;/a&gt; of a sample web project to use for development.&lt;/p&gt;

&lt;p&gt;Feel free to use your own project repository here if you already have code to work on. For our example, we will use &lt;a href="https://github.com/withastro/astro" rel="noopener noreferrer"&gt;the Astro web framework&lt;/a&gt; &lt;a href="https://www.daytona.io/definitions/g/git" rel="noopener noreferrer"&gt;git repository&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You can use the file explorer button and option to &lt;strong&gt;"Clone Repository"&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%2F4tutw30mtm9btqnlhxq3.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%2F4tutw30mtm9btqnlhxq3.png" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You will be prompted: &lt;strong&gt;"Cloning a repository in a Dev Container may execute arbitrary code."&lt;/strong&gt; to confirm.&lt;/p&gt;

&lt;p&gt;Or you could use the VS Code terminal and execute the commands directly.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Git clone the project 
git clone https://github.com/my-user/my-project.git  
# Change directory 
cd my-project
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open the project folder by clicking on the pop-up alert or using &lt;strong&gt;File &amp;gt; Open Folder&lt;/strong&gt; and select the folder you cloned previously.&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%2Fhvhigl5z9zpiz6axjsyr.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%2Fhvhigl5z9zpiz6axjsyr.png" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For the Astro repository, you will be offered to install a set of helpful extensions for your Visual Studio Code, such as language support for Astro, the Prettier code formatter, EditorConfig, and ESLint.&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%2Fu5uf6y0am398qmehpszy.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%2Fu5uf6y0am398qmehpszy.png" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5 - Standardizing Your Development Environment with Dev Container
&lt;/h2&gt;

&lt;p&gt;The Astro repository contains multiple &lt;a href="https://www.daytona.io/definitions/d/development-container" rel="noopener noreferrer"&gt;devcontainer.json&lt;/a&gt; files, enabling you to set up and run a &lt;a href="https://www.daytona.io/definitions/s/standardized-development-environment-sde" rel="noopener noreferrer"&gt;standardized development environment&lt;/a&gt; tailored to your needs. Whether you're contributing to the Astro project, contributing to documentation, or working within a particular framework like &lt;a href="https://www.daytona.io/definitions/r/react" rel="noopener noreferrer"&gt;React&lt;/a&gt;, these configurations facilitate a &lt;a href="https://www.daytona.io/definitions/d/developer-experience-devex" rel="noopener noreferrer"&gt;seamless development experience&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Understanding and Harnessing Dev Containers
&lt;/h3&gt;

&lt;p&gt;Development &lt;a href="https://containers.dev/" rel="noopener noreferrer"&gt;Containers&lt;/a&gt; is an open standard designed by Microsoft to enhance containers with content and settings tailored specifically for development purposes.&lt;/p&gt;

&lt;p&gt;Dev Containers are defined using &lt;code&gt;devcontainer.json&lt;/code&gt; files, which specify the environment's settings, extensions, and Docker configurations necessary for development. This approach ensures that all developers working on a project have a consistent set of tools and runtime environments, minimizing the "works on my machine" problem.&lt;/p&gt;

&lt;p&gt;Dev Containers will ensure a seamless development experience across different machines, similar to what one might expect from using a platform like Codespaces, but with the flexibility and control of a custom setup. This setup is particularly beneficial for collaborative projects or when working in diverse environments, as it abstracts the underlying system configurations and focuses on providing a unified development experience.&lt;/p&gt;

&lt;h3&gt;
  
  
  Dev Container Basic Example from Astro
&lt;/h3&gt;

&lt;p&gt;The following JSON snippet is an example of an &lt;a href="https://github.com/withastro/astro/blob/main/.devcontainer/basics/devcontainer.json" rel="noopener noreferrer"&gt;Astro Basics&lt;/a&gt; &lt;code&gt;devcontainer.json&lt;/code&gt; configuration.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "name": "Basics",
  "build": {
    "dockerfile": "../examples.Dockerfile"
  },

  "workspaceFolder": "/workspaces/astro/examples/basics",

  "portsAttributes": {
    "4321": {
      "label": "Application",
      "onAutoForward": "openPreview"
    }
  },

  "forwardPorts": [4321],

  "postCreateCommand": "pnpm install &amp;amp;&amp;amp; cd /workspaces/astro &amp;amp;&amp;amp; pnpm run build",

  "waitFor": "postCreateCommand",

  "postAttachCommand": {
    "Server": "pnpm start --host"
  },

  "customizations": {
    "codespaces": {
      "openFiles": ["src/pages/index.astro"]
    },
    "vscode": {
      "extensions": ["astro-build.astro-vscode", "esbenp.prettier-vscode"]
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's break down its components:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;build&lt;/code&gt;: Here, &lt;code&gt;"dockerfile": "../examples.Dockerfile"&lt;/code&gt; points to a Dockerfile relative to the location of the &lt;code&gt;devcontainer.json&lt;/code&gt; file. This Dockerfile contains instructions for building the Docker image that the development environment will use.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;portsAttributes&lt;/code&gt;: Defines attributes for ports used by the container. The configuration for port &lt;code&gt;4321&lt;/code&gt; includes the label "Application" and specifies that when this port is auto-forwarded, a preview should be opened automatically (&lt;code&gt;"onAutoForward": "openPreview"&lt;/code&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;forwardPorts&lt;/code&gt;: Lists the ports that should be forwarded from the container to the host machine, allowing access to services running inside the container.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;postCreateCommand&lt;/code&gt;: Specifies a command to run after the container is created but before a user connects. Here, it installs project dependencies using &lt;code&gt;pnpm install&lt;/code&gt;, then builds the project with &lt;code&gt;pnpm run build&lt;/code&gt;, ensuring the environment is ready for development.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;postAttachCommand&lt;/code&gt;: Defines commands to run after a user attaches to the container. This example specifies that the &lt;code&gt;Server&lt;/code&gt; should start using &lt;code&gt;pnpm start --host&lt;/code&gt;, preparing the Astro development server for use.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;customizations&lt;/code&gt;: Contains environment-specific customizations. Under &lt;code&gt;codespaces&lt;/code&gt;, it automatically opens the file &lt;code&gt;src/pages/index.astro&lt;/code&gt; upon starting, which is useful for getting straight to editing the main page. The &lt;code&gt;vscode&lt;/code&gt; section lists recommended extensions (&lt;code&gt;astro-build.astro-vscode&lt;/code&gt; for Astro support and &lt;code&gt;esbenp.prettier-vscode&lt;/code&gt; for code formatting with Prettier) to enhance the development experience within VS Code.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each part of this configuration ensures that the development environment is tailored to the project's needs, from the Docker build process to the setup and ready state of the development server, including the developer's workspace setup in Visual Studio Code.&lt;/p&gt;

&lt;h3&gt;
  
  
  Open Project in Dev Container
&lt;/h3&gt;

&lt;p&gt;To open your project folder in a dev container:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Open the command palette again.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select &lt;strong&gt;"Remote-Containers: Open Folder in Container..."&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Choose your project folder.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&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%2F7hbvz5pb817b2q2f2izv.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%2F7hbvz5pb817b2q2f2izv.png" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;VS Code will start the dev container, install extensions, and connect automatically.&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%2Fpdihb70fu4q3up1097z1.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%2Fpdihb70fu4q3up1097z1.png" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The setup time for your development environment will vary based on the configuration specified in your devcontainer.json file, so anticipate a short wait. While prebuilds can often mitigate this delay, that is a subject better suited for a separate discussion.&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%2Fslv9ok8b6tcx7db8i7w6.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%2Fslv9ok8b6tcx7db8i7w6.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You now have a fully featured, standardized remote development environment accessible through VS Code on your local machine!&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: Run Preview Dev Server
&lt;/h2&gt;

&lt;p&gt;In VS Code, once the container is ready, and if the dev container of your choice didn't run the server, open a new terminal within VS Code and start your application.&lt;/p&gt;

&lt;p&gt;You can execute a command to start the preview if your project is web-based. In the case of our Astro project, the command is as follows. However, your specific command may vary.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pnpm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fjxx8rapm8vojtkap6krv.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%2Fjxx8rapm8vojtkap6krv.png" width="800" height="600"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 7 - Securely Share and Expose Your Projects on the Internet Behind a Domain
&lt;/h2&gt;

&lt;p&gt;To share your environment or collaborate with others, we can expose services securely over the internet. There are reverse proxy services that allow this to function without a public IP and even behind a firewall. For instance, in our example, we are using &lt;a href="https://ngrok.com/" rel="noopener noreferrer"&gt;ngrok&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;First, retrieve your ngrok authentication token from the &lt;a href="https://dashboard.ngrok.com/get-started/your-authtoken" rel="noopener noreferrer"&gt;ngrok dashboard&lt;/a&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%2Fp8r55vhhza466axrvhnz.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%2Fp8r55vhhza466axrvhnz.png" width="800" height="317"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://ngrok.com/docs/getting-started/" rel="noopener noreferrer"&gt;Install Ngrok&lt;/a&gt; from their site, and authenticate it with your account auth token:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Download and extract Ngrok  
curl -s https://ngrok-agent.s3.amazonaws.com/ngrok.asc | \
  sudo tee /etc/apt/trusted.gpg.d/ngrok.asc &amp;gt;/dev/null &amp;amp;&amp;amp; \
  echo "deb https://ngrok-agent.s3.amazonaws.com buster main" | \
  sudo tee /etc/apt/sources.list.d/ngrok.list &amp;amp;&amp;amp; \
  sudo apt update &amp;amp;&amp;amp; sudo apt install ngrok

# Add authtoken 
ngrok config add-authtoken &amp;lt;TOKEN&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To give internet access to our app container from earlier at port 4321, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ngrok http 4321
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copy the ngrok tunnel URL provided in the output.&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%2Frayrur1b4f8pkat6vggz.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%2Frayrur1b4f8pkat6vggz.png" width="749" height="295"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Your application should now be running and accessible via the Ngrok tunnel URL.&lt;/p&gt;

&lt;p&gt;Paste the Ngrok tunnel URL into your browser to access your application. If you encounter a connection refused error, ensure that the necessary port is open on your server's firewall.&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%2Fivf3aced9ll79lrs6svb.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%2Fivf3aced9ll79lrs6svb.png" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To maintain a consistent URL for each ngrok session, set up a static domain via your dashboard. Once you've created it, you can instruct the ngrok agent to utilize this domain using the --domain flag. Begin by halting the current ngrok process with Ctrl+C, and then restart ngrok to apply the changes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ngrok http 4321 --domain jumpy-red-mollusk.ngrok-free.app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you prefer to limit access to your application, you can easily implement authentication with ngrok without modifying your app. For instance, if you use the Google account &lt;a href="mailto:alan@example.com"&gt;alan@example.com&lt;/a&gt;, you can restrict access to yourself alone by executing ngrok with the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ngrok http 4321 --oauth=google --oauth-allow-email=alan@example.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When someone attempts to use your app, they must sign in using Google, and access will be exclusively permitted to your account. Please be aware that each time you restart ngrok without using the --domain flag, your app's URL will change.&lt;/p&gt;

&lt;p&gt;If you wish to go a step further, ngrok also enables the &lt;a href="https://ngrok.com/docs/guides/how-to-set-up-a-custom-domain/" rel="noopener noreferrer"&gt;use of your own custom domain&lt;/a&gt;. By leveraging CNAME records, ngrok hosts an endpoint on your custom domain and offers comprehensive management of the TLS certificate lifecycle on your behalf.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 8 - Code on the Go with a Web IDE on Any Device (optional)
&lt;/h2&gt;

&lt;p&gt;After setting up your application and ensuring it's accessible via Ngrok, you might want to take advantage of the &lt;a href="https://www.daytona.io/definitions/o/openvscode-server" rel="noopener noreferrer"&gt;OpenVSCode Server&lt;/a&gt;, an open-source project licensed under MIT and maintained by Gitpod, for a full &lt;a href="https://www.daytona.io/definitions/c/cloud-ide" rel="noopener noreferrer"&gt;web IDE&lt;/a&gt; experience, which allows you to run a web version of VS Code on your server and access it through your web browser.&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%2F1xjr6t84wrbzyqfxv5kk.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%2F1xjr6t84wrbzyqfxv5kk.png" width="752" height="499"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here's how to set it up and run it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Start the OpenVSCode Server&lt;/strong&gt; : Within your remote server, &lt;a href="https://github.com/gitpod-io/openvscode-server" rel="noopener noreferrer"&gt;install the OpenVSCode Server&lt;/a&gt; by running the following Docker command.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker run -it --init -p 3000:3000 -v "$(pwd):/home/workspace:cached" gitpod/openvscode-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Configure Inbound Port Rules&lt;/strong&gt; : To access the OpenVSCode Server, you need to configure the network settings to allow traffic on the port it's running on. If you're using a service like Azure, navigate to the network settings and set an inbound port rule to allow TCP traffic on port 3000. Ensure that you review the firewall configurations on your server, utilizing tools such as ufw or iptables.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Test the Connection&lt;/strong&gt; : Once the port is open, try accessing &lt;code&gt;http://remote_server_ip:3000&lt;/code&gt; in your web browser. Replace &lt;code&gt;remote_server_ip&lt;/code&gt; with your server's actual IP address. If you encounter a security warning about the connection not being private (which may happen in some browsers like Chrome), try using a different browser like Safari that may not present this issue. Please note that configuring HTTPS falls outside the scope of this guide.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Access web IDE VS Code&lt;/strong&gt; : If everything is configured correctly, you should see the OpenVSCode Server interface in your browser. You can now access your project straight from the Docker image without additional configuration.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now, you'll have a powerful, browser-based web IDE to access from anywhere, making your development process even more flexible and accessible.&lt;/p&gt;

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

&lt;p&gt;Congratulations! You've successfully set up your own fully-featured remote development environment without being locked into a proprietary platform!&lt;/p&gt;

&lt;p&gt;You can now develop directly inside a container, ensuring a consistent development stack isolated from your local environment. With Ngrok, you have also secured your development environment with a tunnel to be shared with your team for collaboration.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key aspects included:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Provisioning a Linux server to host your infrastructure&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Installing Docker Engine and Docker Compose to define environments&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Getting Visual Studio Code Server running to enable remote coding&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Using Docker containers to encapsulate infrastructure dependencies&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Adding security through SSH, HTTPS encryption, authentication&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Scripting setup steps to allow automation and portability&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Exposing services securely over the internet with Ngrok&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can now develop from anywhere using this robust, self-managed environment tailored to your needs!&lt;/p&gt;

&lt;h3&gt;
  
  
  Some additional pointers:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Commit the &lt;code&gt;.devcontainer&lt;/code&gt; folder to source control to share with the team.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use Docker Compose for multi-service applications.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Install the Remote - Containers extension to use dev containers locally.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Read the docs of each tool we have used for more advanced configuration and troubleshooting.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Remember to delete any temporary accounts or services you no longer need to maintain security and avoid unnecessary charges.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let me know if you have any other questions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 9 - Can we automate this?
&lt;/h2&gt;

&lt;p&gt;This is the process you'll undergo for setting up each remote development environment you create, and it's no simple task.&lt;/p&gt;

&lt;p&gt;As an engineer, you might often find yourself thinking, "Could I automate this task with some scripts?" While the answer is yes to some extent, it's important to remember that any modifications you make will necessitate script updates. Eventually, you may find that you have to perform the task manually once more.&lt;/p&gt;

&lt;p&gt;For consistency and portability across projects, we can automate the process using provisioning scripts.&lt;/p&gt;

&lt;p&gt;First, create a setup script &lt;code&gt;setup.sh&lt;/code&gt; that executes our past commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#!/bin/bash

# Add Docker's official GPG key
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# Add Docker repository
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null

# Update and upgrade the system packages
sudo apt update &amp;amp;&amp;amp; sudo apt upgrade -y

# Install necessary packages for Docker installation
sudo apt install apt-transport-https ca-certificates curl software-properties-common -y

# Install Docker Engine, CLI, and containerd
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin -y

# Add current user to the Docker group to run Docker commands without sudo
sudo usermod -aG docker ${USER}

# Print Docker version to verify installation
docker --version

# Install and configure Ngrok
echo "Installing Ngrok..."
curl -s https://ngrok-agent.s3.amazonaws.com/ngrok.asc | \
  sudo tee /etc/apt/trusted.gpg.d/ngrok.asc &amp;gt;/dev/null &amp;amp;&amp;amp; \
  echo "deb https://ngrok-agent.s3.amazonaws.com buster main" | \
  sudo tee /etc/apt/sources.list.d/ngrok.list &amp;amp;&amp;amp; \
  sudo apt update &amp;amp;&amp;amp; sudo apt install ngrok

echo "Please enter your Ngrok auth token (You can find it on your Ngrok dashboard):"
read NGROK_AUTH_TOKEN
ngrok config add-authtoken $NGROK_AUTH_TOKEN
echo "Ngrok installed and configured."

# Install OpenVSCode Server using Docker
echo "Installing OpenVSCode Server..."
docker run -d --init -p 3000:3000 -v "/workspace:/home/workspace:cached" gitpod/openvscode-server
echo "OpenVSCode Server is running on port 3000. Access it at http://your_server_ip:3000"

# VS Code Server installation instructions
echo "To connect Visual Studio Code to this remote environment:"
echo "1. Install the Remote - SSH extension in VS Code on your local machine."
echo "2. Use the Command Palette in VS Code to run 'Remote-SSH: Connect to Host...' and enter this server's SSH credentials."

echo "Setup complete. Please log out and back in for group changes to take effect."
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run the script:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Copy the script above into a file named &lt;code&gt;setup.sh&lt;/code&gt; on the server.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make the script executable with &lt;code&gt;chmod +x setup.sh&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Execute the script with &lt;code&gt;./setup.sh&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Consider wrapping them into a simple CLI tool to simplify further.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Frankly, the situation is quite chaotic. The script is horrible and unlikely to function effectively because it requires customization to fit the particular system in question. Moreover, it doesn't address the routine tasks and interactions with repositories, workspaces, and the public preview, among other elements.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Perhaps there's a better way.&lt;/p&gt;

&lt;h2&gt;
  
  
  Follow Daytona on GitHub
&lt;/h2&gt;

&lt;p&gt;Stay tuned for the imminent launch of &lt;a href="https://github.com/daytonaio" rel="noopener noreferrer"&gt;Daytona on GitHub&lt;/a&gt;, our open-source project designed to automate development environment management. The aim to save developers and their teams substantial time by seamlessly standardizing dev environments across any machine, solving this challenge once and for all.&lt;/p&gt;

&lt;p&gt;Join us in our mission to transform and accelerate the development process.&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%2F09se4n687dffse57dab5.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%2F09se4n687dffse57dab5.png" width="500" height="701"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>codespaces</category>
      <category>howto</category>
      <category>diy</category>
      <category>guide</category>
    </item>
    <item>
      <title>Redefining Success in the Engineering Organization</title>
      <dc:creator>Nikola Balic</dc:creator>
      <pubDate>Fri, 16 Feb 2024 00:00:00 +0000</pubDate>
      <link>https://forem.com/daytona/redefining-success-in-the-engineering-organization-3e4b</link>
      <guid>https://forem.com/daytona/redefining-success-in-the-engineering-organization-3e4b</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%2F0rrgax5uawifg4v1ra88.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%2F0rrgax5uawifg4v1ra88.png" alt=" " width="800" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Over the past decade, the image of the lone “rockstar” coder has become pervasive in engineering culture. The rockstar represents the pinnacle of achievement – a virtuoso developer capable of single-handedly architecting complex systems and cranking out flawless code at superhuman speeds. This archetype holds powerful sway in the minds of many engineers, shaping identities and perceptions of success.&lt;/p&gt;

&lt;p&gt;But as tech leaders, we must look honestly at the implications of idolizing this myth:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;What behaviors and mindsets does it promote or suppress?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How might it impact diversity, collaboration, and sustainability in our organizations?&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Are we setting realistic expectations or inadvertently fostering burnout and imposter syndrome?&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At Daytona, we’ve worked to redefine engineering success by creating an environment optimized for developer empowerment. Through this experience, I believe sustainable high performance requires abandoning the rockstar model for a more nuanced definition – one rooted in collaboration, continuous learning, and resilience.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Collaboration, rather than solitary effort, is frequently the source of genuine innovation.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;
  
  
  The Allure and Risks of the Rockstar Engineer
&lt;/h1&gt;

&lt;p&gt;The trope of the rockstar coder has been glamorized in media, perpetuated through industry hype, and stubbornly persists in engineering culture. Qualities typically associated with this image include raw technical brilliance, an anti-social streak, extremely long hours in intense solitary focus, and often shunning documentation or “boring” tasks.&lt;/p&gt;

&lt;p&gt;This archetype holds undeniable allure – the software magnate crafting ingenious code in a feverish haze of Red Bull and brilliance. Their heroic efforts seem to singlehandedly save the day. It’s a narrative that fuels many engineers' aspirations and egos.&lt;/p&gt;

&lt;p&gt;But this myth also carries significant downsides at both individual and organizational levels. Internalizing it can fuel anxiety and burnout as developers stretch themselves thin trying to live up to unrealistic expectations. It encourages siloed work and discourages collaboration or mentoring. It often dismisses the less glamorous but crucial work of documenting systems, reviewing code, or interviewing users. The rockstar attitude also tends to disdain entry-level tasks beneath their abilities – depriving newcomers of mentoring and growth opportunities.&lt;/p&gt;

&lt;p&gt;This mindset rewards raw individual performance over sustainability, diversity, or team success. It inhibits the cross-pollination of skills and institutional knowledge sharing vital for organizational resiliency. Ultimately, the lone rockstar represents a high-risk, low-scalability model. Their abilities become single points of failure and bottlenecks as systems grow more complex.&lt;/p&gt;

&lt;p&gt;So, how can leaders reshape engineering culture to move past this limiting myth?&lt;/p&gt;

&lt;h1&gt;
  
  
  Redefining Success as a Team Sport
&lt;/h1&gt;

&lt;p&gt;Transitioning from the rockstar model requires reorienting from individual heroics toward collaborative team success.&lt;/p&gt;

&lt;p&gt;This starts with the reconceptualization of projects as complex, multifaceted endeavors that draw on diverse skill sets. A healthy engineering culture values specialists ranging from user researchers to security auditors and generalist coders. It recognizes documentation, QA processes, and &lt;a href="https://www.daytona.io/definitions/d/devops" rel="noopener noreferrer"&gt;DevOps&lt;/a&gt; as integral to delivering robust, scalable systems.&lt;/p&gt;

&lt;p&gt;With this breadth of contributors, stellar outcomes become team achievements earned through coordination. We must assess performance based on aligned cross-functional metrics versus raw individual output. Shared ownership and collective responsibility should be instilled at all levels.&lt;/p&gt;

&lt;p&gt;Incentive structures also require rethinking. Rewarding &lt;a href="https://dev.to/nkko/beyond-metrics-unlocking-true-developer-potential-35po-temp-slug-391246"&gt;individual metrics&lt;/a&gt; like lines of code can incentivize destructive practices like copy-pasted code or cruft accumulation. Consider incentives for cross-training, mentorship, documenting systems, or volunteering for unglamorous tasks that advance the project. Make collaboration and knowledge sharing part of performance reviews.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;We tend to underestimate the value of simplicity in solutions, mistakenly equating complexity with superiority.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Platforms like Daytona enable the transition toward team success by removing tedious configuration and maintenance tasks. &lt;a href="https://dev.to/nkko/the-power-of-automation-in-software-development-53ca-temp-slug-835914"&gt;Automating&lt;/a&gt; these distractions immerses developers in collaboration and core engineering work. Streamlined coordination frees attention toward higher-order team dynamics that enable breakthrough innovations.&lt;/p&gt;

&lt;h1&gt;
  
  
  Embracing Continuous Learning and Growth
&lt;/h1&gt;

&lt;p&gt;Sustainable excellence requires continuous skills development, not just innate genius. The myth of the 10x rockstar coder rests on the idea of innate brilliance – that mastery stems from raw talent rather than practice. But engineering evolves rapidly – today’s hot skill fades into obsolescence within a few years. The lone coding cowboys of yore stranded themselves on soon-outdated islands of expertise.&lt;/p&gt;

&lt;p&gt;Organizations seeking sustained excellence foster a culture of continuous learning and growth. With support for conferences, online courses, and skill-stretching assignments, veteran engineers avoid becoming dinosaurs. Regular retention-focused training and mentorship opportunities are crucial for upskilling staff and transferring institutional knowledge.&lt;/p&gt;

&lt;p&gt;Rotational programs allowing developers to shift across focus areas prevent siloed knowledge and cultivate empathy between teams. Hackathons, open-source Fridays, and casual skill shares encourage enriching side projects and serendipitous discoveries.&lt;/p&gt;

&lt;p&gt;Daytona’s automated dev environment provisioning helps enable continuous learning. Spinning up &lt;a href="https://www.daytona.io/definitions/d/disposable-environments" rel="noopener noreferrer"&gt;sandboxed environments&lt;/a&gt; for experimentation allows risk-free tinkering. Quick reproducibility makes replicating and debugging learning scenarios faster. Built-in &lt;a href="https://dev.to/nkko/10-tips-how-to-boost-collaboration-as-a-developer-424k-temp-slug-6679546"&gt;collaboration capabilities&lt;/a&gt; support interactive training across locations.&lt;/p&gt;

&lt;h1&gt;
  
  
  Rewarding Resilience and Grit
&lt;/h1&gt;

&lt;p&gt;Sustainable excellence requires resilience and grit. The rockstars’ apparent one-shot success hides their dependence on fickle inspiration. But true engineering prowess reveals itself when persevering through protracted debug cycles, integrating complex legacy systems, or grinding through regulations.&lt;/p&gt;

&lt;p&gt;Resilience emerges as a theme across many high-performing teams. MIT research found the highest-achieving software teams were often internally mediocre at cooperation or technical skills. Their advantage lies in sheer grit to push through challenges. Members leaned on and learned from each other during demoralizing setbacks.&lt;/p&gt;

&lt;p&gt;Leaders should assess performance under adversity – how developers respond to tangled dependencies or tight deadlines reveals character. Reward signs of resilience include carefully considering alternative approaches, seeking help appropriately, and implementing post-mortems.&lt;/p&gt;

&lt;p&gt;Part of resilience involves minimizing needless adversity in the first place. Daytona’s development environment automation reduces frustrations from manual configuration and repetitive tasks. Its integrated tools remove &lt;a href="https://dev.to/daytona/designing-developer-workspaces-for-flow-state-2bpi-temp-slug-4758249"&gt;painful context-switching&lt;/a&gt;. The platform aims to amplify human potential by eliminating unnecessary self-imposed obstacles.&lt;/p&gt;

&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;Redefining engineering success requires examining assumptions and incentives permeating tech culture today. The mythic rockstar represents an antiquated archetype mismatched to the complexity of modern systems—sustainable excellence springs from collaborative teamwork, continuous learning, and resilience when facing inevitable challenges.&lt;/p&gt;

&lt;p&gt;As leaders, we shape culture through the metrics, processes, and narratives we endorse. Daytona offers a &lt;a href="https://www.daytona.io/definitions/d/development-environment-management-dem" rel="noopener noreferrer"&gt;development environments management&lt;/a&gt; platform designed to bring out the best in engineering teams beyond individual heroics. Our automated environments empower developers with the space and support structure to reach new levels of productivity and innovation.&lt;/p&gt;

&lt;p&gt;The future belongs not to the lone coding cowboys but to the empowered, cross-trained engineering teams equipped to tackle exponentially growing complexity. By redefining success beyond outdated myths, leaders can foster cultures where every contributor can creatively thrive, and organizations can sustainably excel.&lt;/p&gt;

</description>
      <category>success</category>
      <category>imposter</category>
      <category>rockstar</category>
    </item>
    <item>
      <title>You Are Overthinking Startup Hiring</title>
      <dc:creator>Nikola Balic</dc:creator>
      <pubDate>Wed, 14 Feb 2024 10:05:35 +0000</pubDate>
      <link>https://forem.com/nibzard/you-are-overthinking-startup-hiring-4pgh</link>
      <guid>https://forem.com/nibzard/you-are-overthinking-startup-hiring-4pgh</guid>
      <description>&lt;h2&gt;
  
  
  I. The Problem: Seeking Diamonds But Finding Cubic Zirconia
&lt;/h2&gt;

&lt;p&gt;The thrusters are rumbling. The countdown has begun. &lt;/p&gt;

&lt;p&gt;Your startup rocket ship is ready to blast off into the stratosphere, prepared to soar past the competition. But who will navigate the controls, monitor the engines, and chart the course to those distant stars? Certainly not the seasoned astronauts from NASA or hotshot pilots with fancy degrees. &lt;/p&gt;

&lt;p&gt;No, for this wild ride, you need a &lt;strong&gt;scrappy, daring crew&lt;/strong&gt; with sharp instincts, quick wits, and brave hearts beating for adventure.&lt;/p&gt;

&lt;p&gt;Yet finding these gems is harder than spotting diamonds glinting in the rough. &lt;/p&gt;

&lt;p&gt;Despite your best mining efforts, your hiring screens often turn up cubic zirconia — candidates with credentials sparkling but &lt;strong&gt;inner fire lacking&lt;/strong&gt;. They may boast the polish and pedigree you sought on paper, but fail to thrive in your scrappy startup environment. &lt;/p&gt;

&lt;p&gt;So, how do you uncover the real diamonds?&lt;/p&gt;

&lt;h2&gt;
  
  
  II. Flipping the Script: Assess Attitude Over Aptitude
&lt;/h2&gt;

&lt;p&gt;Rather than judging polish or prior experience, seek out the &lt;em&gt;self-starters&lt;/em&gt; and &lt;strong&gt;diligent doers&lt;/strong&gt;, those who carved their own trails because the beaten path looked boring. &lt;/p&gt;

&lt;p&gt;Find thoughtful minds not constrained by shoulds and woulds but led by their own internal compass. While lacking the CV shine, they have knowledge hard won from wrestling real problems, emerging smarter and tougher from the tussle.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;You have your way. I have my way. As for the right way, the correct way, and the only way, it does not exist.—Nietzsche&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So, how to identify these diamonds glinting just under the surface?&lt;/p&gt;

&lt;p&gt;First, watch how they tell their tales, highlighting their grit, creativity, and ingenuity. Do they describe meeting challenges with scrappy solutions, mustering the motivation to push projects over the finish line when others wavered? Listen for how they connected the dots in fresh ways, with more &lt;strong&gt;visionary vista&lt;/strong&gt; than narrow focus.&lt;/p&gt;

&lt;p&gt;Second, listen for their vision, that &lt;strong&gt;spark of originality&lt;/strong&gt; that drives them. Is it coherent and considered or a mere fantasy? Can they articulate how past choices and interests have informed their outlook?&lt;/p&gt;

&lt;p&gt;Third, check their chassis for dents and cracks. They should bear some battle scars but not be battered beyond repair. A healthy chip on the shoulder can provide powerful fuel.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Score attitude over aptitude. Skills can be learned but mindset is harder to instill.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  III. The Rare Rebels: Why They're Worth the Work
&lt;/h2&gt;

&lt;p&gt;These diamonds in the rough are not as rare as the Hope Diamond, but they glimmer with special brilliance. Once aboard your rocket ship, they will take pressure and polish beautifully, forming the &lt;strong&gt;heart of your crew&lt;/strong&gt;. Their daring and dedication makes them invaluable in startups.&lt;/p&gt;

&lt;p&gt;Yet being so singular, they are accustomed to charting their own course. After all, they carved their own unconventional path rather than following the herd. So attracting them takes insight into what makes them tick.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The only way to deal with an unfree world is to become so absolutely free that your very existence is an act of rebellion.—Camus&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;First, recognize you are competing against their own inner drive and ambition. They are used to wrestling their own demons and dragons. Make sure your mission excites them as much as their personal goals. Appeal to their &lt;strong&gt;appetite for adventure&lt;/strong&gt; and audacity.&lt;/p&gt;

&lt;p&gt;Second, acknowledge you cannot motivate them. They propel themselves. Offer fuel and direction but let their engines run hot on their own spark. Stoke their fire with challenges to conquer and autonomy to chart their own trajectories.&lt;/p&gt;

&lt;p&gt;Third, actively affirm their attitudes and approaches. These diamonds are used to being misunderstood, dismissed as too raw. Continually reinforce that you value their &lt;strong&gt;originality and fresh thinking&lt;/strong&gt; as assets.&lt;/p&gt;

&lt;p&gt;In short, do not try to polish or improve these rare gems. Let their sharp edges glint. Help them shine brighter by removing roadblocks and clearing the path for them to charge ahead. Feed their fire and follow their fearless lead to the stars.&lt;/p&gt;

&lt;h2&gt;
  
  
  IV. The Final Countdown: Making It Work With These Rare Rebels
&lt;/h2&gt;

&lt;p&gt;Once you have these audacious diamonds aboard, how do you retain them for the long haul? With care and feeding of their independent spirits.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Man is condemned to be free; because once thrown into the world, he is responsible for everything he does.—Sartre&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;First, &lt;strong&gt;give them ownership and autonomy&lt;/strong&gt; suited to their appetite. They left the safe but boring beaten paths to find freedom on your rocket ship. Let them take the controls at times and choose creative ways to contribute.&lt;/p&gt;

&lt;p&gt;Second, &lt;strong&gt;help them help themselves&lt;/strong&gt;. Guide their growth but resist over-managing. Lend support dismantling obstacles and provide resources for them to build their skills. Mentor lightly to supplement their self-motivation.&lt;/p&gt;

&lt;p&gt;Third, &lt;strong&gt;keep your ear to the ground&lt;/strong&gt;. Listen closely for signs of frustration and fading engagement. Nip restlessness in the bud by revisiting their goals and remixing their roles. Head off departure by showing there is still space to soar within your startup.&lt;/p&gt;

&lt;p&gt;Finally, &lt;strong&gt;align values and validate their vision&lt;/strong&gt;. Beyond thrills, these diamonds seek meaning. Link their quest to your mission. Show how their daring and dedication helps achieve shared goals. Let them spark big ideas and blaze new trails to the target.&lt;/p&gt;

&lt;h2&gt;
  
  
  V. Final Boarding Call
&lt;/h2&gt;

&lt;p&gt;The startup launch clock is ticking. Soon that rocket ship will sail skyward with or without you. So stop overthinking and start seeking the fire within your candidates. Never mind the lack of credentials. Someone with the right stuff will shine through. Once aboard, these audacious diamonds will take your startup into the stratosphere and beyond.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Everything we hear is an opinion, not a fact. Everything we see is a perspective, not the truth.—Marcus Aurelius&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Who needs seasoned astronauts when you have raw rebels ready to chart the course to the stars? All aboard!&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Score attitude over aptitude. Skills can be learned but mindset is harder to instill.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>startup</category>
      <category>hiring</category>
      <category>remote</category>
    </item>
    <item>
      <title>Streamlining DevOps with Earthly and Daytona</title>
      <dc:creator>Nikola Balic</dc:creator>
      <pubDate>Fri, 22 Dec 2023 00:00:00 +0000</pubDate>
      <link>https://forem.com/daytona/streamlining-devops-with-earthly-and-daytona-5fch</link>
      <guid>https://forem.com/daytona/streamlining-devops-with-earthly-and-daytona-5fch</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%2F375tpw6dm6smt76325z2.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%2F375tpw6dm6smt76325z2.jpeg" alt="Streamlining DevOps with Earthly and Daytona" width="800" height="402"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This guide will walk you through creating a Docker environment using Earthly and DevContainer. We'll begin by setting up a Docker file to utilize Ubuntu's snapshot repositories, then explore how to build images for different architectures. Finally, we'll integrate Earthly for streamlined builds and testing, and set up a development container for a complete development environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Utilizing Ubuntu Snapshot Repositories
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Open your Daytona workspace.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a Docker file to access Ubuntu snapshot repositories, which allow you to use a specific snapshot of Ubuntu packages from a certain date.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Define the snapshot date in the &lt;code&gt;config.toml&lt;/code&gt; file. For example, set it to November 5, 2023.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In your Docker file, instruct it to fetch packages from the Ubuntu snapshot as of the specified date and update the sources list accordingly.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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%2Fvbt6h2ani1fou05tyxa0.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%2Fvbt6h2ani1fou05tyxa0.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Building for Multiple Architectures
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;To support both x86 and ARM architectures, use Docker's buildx feature.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Execute the Docker buildx command, specifying platforms for AMD and ARM.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Incorporate variables into the build process to manage different configurations.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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%2Fqrmqcmv3ihpekxhcnixn.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%2Fqrmqcmv3ihpekxhcnixn.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Simplifying with Earthly
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Instead of separate Docker and make files, combine your configuration into one Earthly file.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Set global variables for the build date and snapshot in the Earthly file.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use the Earthly file to build your Docker target and add a simple smoke test to verify package installation.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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%2F6v2oopda16q43x85nsq5.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%2F6v2oopda16q43x85nsq5.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Setting Up DevContainer
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Start with an Ubuntu Jammy base for your DevContainer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Configure environment variables to pass GitHub credentials and set up Docker and Earthly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ensure the DevContainer includes necessary extensions for make, Docker, and Earthly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Automate login to GitHub registry upon starting the DevContainer.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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%2Fm8xyh606nryqdb2oy9ly.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%2Fm8xyh606nryqdb2oy9ly.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing and Building with Earthly
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Verify Earthly installation by running a test command.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Observe Earthly's build process, which includes pulling the base image and updating package lists.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Push the completed build to your repositories using the Earthly push command.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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%2F0bjrolzw41cycqi9sc3m.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%2F0bjrolzw41cycqi9sc3m.png" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Advantages of Using Earthly
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Earthly caches your builds, making subsequent builds faster.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A single Earthly file simplifies the build and test process.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Integration with DevContainer provides a ready-to-use development environment with all necessary tools installed.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Code and Full Tutorial on YouTube
&lt;/h2&gt;

&lt;p&gt;For those interested in exploring the code and configurations discussed in this guide, the Git repository is available at &lt;a href="https://github.com/metcalfc/snapshot-base" rel="noopener noreferrer"&gt;https://github.com/metcalfc/snapshot-base&lt;/a&gt;. Additionally, to see these steps in action, you can view the &lt;a href="https://www.youtube.com/watch?v=zQ5XbnSnhn4" rel="noopener noreferrer"&gt;full video tutorial on YouTube&lt;/a&gt;, which provides a comprehensive walkthrough of the entire process.&lt;/p&gt;

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

&lt;p&gt;By following these steps, you can set up a Docker environment that leverages the power of Earthly and DevContainer. This setup allows for efficient management of Docker builds, streamlined testing, and a fully equipped development container, ensuring a smooth and productive workflow.&lt;/p&gt;

</description>
      <category>guides</category>
    </item>
    <item>
      <title>Harnessing AI through Standardization and Isolation</title>
      <dc:creator>Nikola Balic</dc:creator>
      <pubDate>Thu, 30 Nov 2023 00:00:00 +0000</pubDate>
      <link>https://forem.com/daytona/harnessing-ai-through-standardization-and-isolation-4k4c</link>
      <guid>https://forem.com/daytona/harnessing-ai-through-standardization-and-isolation-4k4c</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%2Fol4b13dc38sow9d6iyby.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%2Fol4b13dc38sow9d6iyby.png" alt=" " width="600" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Rapid AI development promises enormous opportunities, yet fragmented tools and environments often hinder capturing their full potential. What if developers didn’t need to waste precious time battling configurations and compatibility issues? How can teams accelerate innovation given skills gaps and disjointed systems? Enter &lt;a href="https://www.daytona.io/definitions/standardized-development-environment-sde" rel="noopener noreferrer"&gt;Standardized Development Environments (SDEs)&lt;/a&gt;—the key to transforming workspaces into unmatched AI &lt;a href="https://www.daytona.io/definitions/isolation" rel="noopener noreferrer"&gt;sandboxes&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In this guide, we'll explore how SDEs, by encouraging standardization and streamlining setup, can foster innovation in AI application development. We’ll also demonstrate how integrating popular tools like Chroma vector database and &lt;a href="https://openai.com/" rel="noopener noreferrer"&gt;OpenAI&lt;/a&gt; &lt;a href="https://platform.openai.com/docs/introduction" rel="noopener noreferrer"&gt;API&lt;/a&gt; within SDEs can further enhance productivity and creativity. The result is the ultimate AI playground, ready for developers to unleash their skills and shape the future.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TL;DR&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sitemap Fetching and Parsing: Automates retrieval and analysis of sitemap XML from websites to extract URLs.&lt;/li&gt;
&lt;li&gt;Content Extraction and Storage: Downloads web page content and stores it in Chroma, a flexible database system.&lt;/li&gt;
&lt;li&gt;AI-Powered Search: Leverages OpenAI's embedding functions for smart content retrieval within Chroma.&lt;/li&gt;
&lt;li&gt;Response Generation: Creates response based on prompts and search results, using latest OpenAI's GPT-4 model.&lt;/li&gt;
&lt;li&gt;GitHub Repo link: &lt;a href="https://github.com/nkkko/ai-sandbox-demo" rel="noopener noreferrer"&gt;https://github.com/nkkko/ai-sandbox-demo&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If privacy is your priority, taking advantage of the security and isolation offered by Standardized Development Environments (SDEs) is advisable. In such cases, you can use local models and sentence transformers. The workspace I've set up is equipped with 12 GB of memory and 4 virtual CPUs, which should be sufficient to run a 7-billion-parameter model at reading speed. However, my example will utilize OpenAI's services for simplicity and improved performance.&lt;/p&gt;

&lt;p&gt;Before diving into the integration of AI with SDEs, it's crucial to grasp the need for AI sandbox and to understand foundational concepts of SDEs and &lt;a href="https://containers.dev/" rel="noopener noreferrer"&gt;Dev Containers&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Importance of a Sandbox for AI Projects
&lt;/h2&gt;

&lt;p&gt;In the rapidly evolving landscape of artificial intelligence, the ability to experiment safely and efficiently is paramount. A sandbox environment serves as an essential incubator for innovation, providing AI developers with a controlled and flexible space to build and test their projects. Here's why a sandbox is a crucial tool for any AI endeavor:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Risk-Free Experimentation&lt;/strong&gt; : AI development often involves trial and error, and a sandbox offers a risk-free zone where you can explore new ideas without affecting production systems. This freedom to experiment encourages creativity and can lead to AI functionality and performance breakthroughs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Realistic Testing Conditions&lt;/strong&gt; : Sandboxes can simulate real-world conditions, allowing you to observe how your AI behaves under various scenarios. This realistic testing ensures your AI solutions are robust, scalable, and ready for deployment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Rapid Prototyping&lt;/strong&gt; : Speed is a competitive advantage in AI development. Sandboxes facilitate rapid prototyping, enabling you to iterate on concepts and refine your models quickly. This agility accelerates the development cycle and helps bring AI applications to market faster.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Learning and Development&lt;/strong&gt; : Sandboxes are educational playgrounds for newcomers and seasoned professionals. They provide an opportunity to learn new technologies, frameworks, and languages in a practical, hands-on manner, essential for staying current in AI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resource Optimization&lt;/strong&gt; : AI projects can be resource-intensive. Sandboxes allow you to allocate resources dynamically, optimizing usage and reducing costs. This efficient resource management is critical, especially when working with complex models and large datasets.&lt;/p&gt;

&lt;p&gt;In summary, a sandbox is more than just a development tool—it's an essential part of the AI ecosystem that supports innovation, learning, and growth. Whether you're a solo developer or part of a large team, a sandbox is the foundation upon which you can build the future of AI.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem of Fragmented Environments
&lt;/h2&gt;

&lt;p&gt;Developing AI applications is challenging enough without managing half-broken tools and dependencies. Unfortunately, this is the reality for many developers struggling with:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Inconsistencies:&lt;/strong&gt; Different machines, OS versions, and ad-hoc configurations lead to errors and delays. Collaborating with teams also becomes tricky.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Error: Module X version mismatch 
(expected 1.1.0, got 1.0.2)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Onboarding Issues:&lt;/strong&gt; Getting others up to speed on a project's tools and setup is time-consuming and frustrating.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;New Dev: How do I get this project running locally?
Senior Dev: Oh boy, just follow this 12 step guide...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Security &amp;amp; Compliance Risks:&lt;/strong&gt; Following best practices around vulnerabilities and regulations becomes difficult across fragmented environments.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lack of Portability:&lt;/strong&gt; Projects that depend on specific machines or OS configurations aren't easily portable or sharable across teams.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wasted Time:&lt;/strong&gt; Hours spent debugging environment issues is time lost building innovative applications.&lt;/p&gt;

&lt;p&gt;SDEs address these problems through standardization, saving developers hours of configuration headaches so they can focus on creating.&lt;/p&gt;

&lt;h2&gt;
  
  
  Introducing the Power of Standardized Dev Envs and modern DEM Platforms
&lt;/h2&gt;

&lt;p&gt;SDEs are more than just tools - they represent a philosophy that champions consistency and efficiency. By providing standardized configurations, SDEs allow developers to dive right into coding without worrying about environment setups. This uniformity becomes especially important in regulated industries like finance, healthcare, etc. where strict governance policies need adherence alongside security.&lt;/p&gt;

&lt;p&gt;SDEs provide predefined configurations encompassing everything from dependencies and versions to security policies and tooling rules. This standardization brings immense advantages over traditional virtualized environments by traveling with code across devices. Unlike ephemeral containers, SDEs persist tools, credentials, and settings critical for long-term governance. By codifying best practices instead of reinventing the wheel, SDEs give developers instant access to compliant systems where they can simply code.&lt;/p&gt;

&lt;p&gt;SDEs may be manually created or defined through a declarative specification. In the case of &lt;a href="https://www.daytona.io/definitions/development-container" rel="noopener noreferrer"&gt;Development Containers&lt;/a&gt;, the environment specifications are encapsulated in a devcontainer.json file. This enables consistency across different machines while retaining flexibility to update configurations.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Role of Development Environment Management
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://www.daytona.io/definitions/development-environment-management-dem" rel="noopener noreferrer"&gt;DEM&lt;/a&gt; platforms like &lt;a href="https://www.daytona.io/" rel="noopener noreferrer"&gt;Daytona&lt;/a&gt; takes the SDE approach further through automating creation, management and optimization of these standardized environments. It balances developer productivity with compliance requirements by:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Managing configurations, access controls &amp;amp; workflows from a central system&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Automating provisioning and deployment of tools/languages&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enforcing security standards through predefined policies&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By using Daytona, teams can boost collaboration and innovation within a secure, consistent sandbox.&lt;/p&gt;

&lt;p&gt;A Standardized Development Environment (SDE) provides consistent tools and configurations tailored to a project’s specific needs. The environment encompasses everything from software dependencies and versions to security policies and tooling rules.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Benefits of SDEs
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Portability&lt;/strong&gt; - The environment travels with code across devices.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Collaboration&lt;/strong&gt; - Teams use the same dependencies and tools.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Onboarding&lt;/strong&gt; - New developers spin up instantly with no setup.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Compliance&lt;/strong&gt; - Standardization facilitates best practices.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Consistency&lt;/strong&gt; - Eliminates half-broken tooling across machines.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Efficiency&lt;/strong&gt; - Less downtime from environment issues.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;By providing predefined workspaces, SDEs allow developers to go from zero to coding in minutes. For AI innovation to flourish, minimizing tooling distractions is essential.&lt;/p&gt;

&lt;h2&gt;
  
  
  Unleashing Innovation with RAG and Vector Databases
&lt;/h2&gt;

&lt;p&gt;Retrieval Augmented Generation (RAG) unites the generative power of language models with the precision of information retrieval, enabling the creation of nuanced, contextually accurate content.&lt;/p&gt;

&lt;p&gt;Generative models like GPT excel in creating coherent text for tasks such as text completion and question answering. However, they may struggle with vague prompts or limited data, leading to less reliable outputs.&lt;/p&gt;

&lt;p&gt;Conversely, retrieval models are adept at sourcing exact answers from large databases, essential for chatbots and search functionalities. Yet, they lack the creative dynamism of generative models, being restricted to predefined responses.&lt;/p&gt;

&lt;p&gt;Vector databases complement this duo by streamlining the retrieval process, quickly aligning queries with pertinent information. The fusion of RAG and vector databases thus forges systems that are both creative and precise, enhancing content generation capabilities.&lt;/p&gt;

&lt;h2&gt;
  
  
  Integrating OpenAI for embeddings creation and generative functionalities
&lt;/h2&gt;

&lt;p&gt;As AI capabilities continue rapidly advancing, developers are eager to test the limits of generative models like GPT-4 and GPT-4 Turbo (gpt-4-1106-preview). Yet high costs, unpredictable outputs, and difficult tooling often restrain the exploration process.&lt;/p&gt;

&lt;p&gt;By providing easy-to-use APIs instead of complex tooling, OpenAI lowers the barrier to leveraging innovations like completions and embeddings. Integrating OpenAI via user-friendly calls unlocks capabilities making applications smarter and more creative.&lt;/p&gt;

&lt;p&gt;By leveraging OpenAI in combination with a vector database, developers gain access to state-of-the-art AI with minimized overhead. Specifically, the OpenAI API enables:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Content Generation&lt;/strong&gt; : Automated generation of text matching specified tones, styles, and topics with the state of the art models such as GPT-4 turbo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Code Completion&lt;/strong&gt; : Suggestions of relevant code snippets and examples using various tools such as Copilot, Tabnine, Phind or Continue.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Search &amp;amp; Filtering&lt;/strong&gt; : Relevant document retrieval via semantic similarity rankings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Data Labeling&lt;/strong&gt; : Automated classification, entity extraction, and sentiment analysis.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Image Generation&lt;/strong&gt; : Creative images matching textual descriptions using DALL-E 3.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Demo: Setting Up Your AI Playground
&lt;/h2&gt;

&lt;p&gt;Up to this point, we've explored the conceptual advantages of integrating Standardized Development Environments (SDEs), Chroma, and OpenAI. What does this look like in a real-world scenario? Let's introduce our demo project—an AI application that showcases the rapid prototyping enabled by this combination.&lt;/p&gt;

&lt;p&gt;The project utilizes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Dev Container Specification&lt;/strong&gt; - Dev Containers are configured via a &lt;code&gt;devcontainer.json&lt;/code&gt; file, which automates the setup of your development environment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Chroma&lt;/strong&gt; - For storage, indexing, and embedding-based semantic search with the help of embedding functions (all-MiniLM-L6-v2 or OpenAI text-embedding-ada-002 with enormous 1536 dimension vectors).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;OpenAI&lt;/strong&gt; - To generate new writings matching specified topics and content fetched from the vector database.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Understanding the AI Demo Project
&lt;/h3&gt;

&lt;p&gt;Our demo project showcasing AI integration with popular developer tools. Here's an overview of what it does:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Web Content Extraction&lt;/strong&gt; : Automatically extracts text and metadata from web page sitemap.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Storage and Search&lt;/strong&gt; : Stores the extracted content in a vector database (Chroma) and enables intelligent search.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AI Generation&lt;/strong&gt; : Uses Large Language Model (LLM) to generate articles new writing in relation to the stored content context.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It utilizes standardized development environments (SDEs) to allow collaborators to instantly replicate the setup and start using it our contributing to the project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Preparing for Installation
&lt;/h2&gt;

&lt;p&gt;Before beginning, ensure you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;An SDE that supports Dev Container Specification, such as Daytona.io.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Python version 3.10 or later.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;An OpenAI API key (optional).&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Installation Steps
&lt;/h2&gt;

&lt;p&gt;Set up your environment using one of the following methods:&lt;/p&gt;

&lt;h3&gt;
  
  
  Using an SDE:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Navigate to your preferred SDE, such as Daytona.io or a cloud IDE.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Point the SDE to the project's &lt;a href="https://github.com/nkkko/ai-sandbox-demo" rel="noopener noreferrer"&gt;Git repository URL&lt;/a&gt;: &lt;code&gt;https://github.com/nkkko/ai-sandbox-demo&lt;/code&gt;. Or use a shorthand &lt;code&gt;https://yourdaytonainstance.com/#https://github.com/nkkko/ai-sandbox-demo&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;That's it! The IDE will automatically build a container with all dependencies based on the &lt;code&gt;.devcontainer&lt;/code&gt; config.&lt;/p&gt;

&lt;h3&gt;
  
  
  Manual Setup:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Clone the repository to your machine.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create virtual Python environment using venv or conda.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Install the required packages by running:&lt;code&gt;pip install -r requirements.txt&lt;/code&gt;Alternatively, execute:&lt;code&gt;pip install openai chromadb python-dotenv bs4 argparse lxml&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Resolve the issues with your environment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create an &lt;code&gt;.env&lt;/code&gt; file and insert your &lt;code&gt;OPENAI_API_KEY&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Choice of Embedding Model
&lt;/h3&gt;

&lt;p&gt;It is important to note that after you clone and run the repository you need to set up the &lt;code&gt;.env&lt;/code&gt; file with your &lt;code&gt;OPENAI_API_KEY&lt;/code&gt; in case you would prefer to use their embeddings.&lt;/p&gt;

&lt;p&gt;Notably, as others have shown model's dimension size does not strongly predict its performance. Several models with fewer dimensions than text-embedding-ada-002's 1536 show similar levels of performance. For example, &lt;a href="https://supabase.com/" rel="noopener noreferrer"&gt;Supabase&lt;/a&gt; noted that when maintaining a constant accuracy@10 of 0.99, pgvector with &lt;a href="https://huggingface.co/sentence-transformers/all-MiniLM-L6-v2" rel="noopener noreferrer"&gt;all-MiniLM-L6-v2&lt;/a&gt; outperformed &lt;strong&gt;text-embedding-ada-002&lt;/strong&gt; by 78%.&lt;/p&gt;

&lt;h3&gt;
  
  
  Example Usage
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Content Harvesting:&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;python populate.py https://examples.com/sitemap.xml --n 100 --ef openai
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This extracts 100 pages from the site's sitemap into Chroma using OpenAI embeddings.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Semantic Search:&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;python search.py "SDE best practices" --n 3 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Finds the 3 most relevant pages on SDE best practices using vector similarity.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;AI Generation:&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;python write.py "How can SDE improve productivity" --s "Software Development" --n 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Generates an entire article on the prompt while referring to the top search result from the database for context.&lt;/p&gt;

&lt;h3&gt;
  
  
  Main Components of the Demo Project
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;populate.py&lt;/code&gt;: Extracts content from a website's sitemap and saves to the database.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;search.py&lt;/code&gt;: Intelligently searches the database content.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;write.py&lt;/code&gt;: Generates articles using the database content.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;SynthSpyder.py&lt;/code&gt;: Core module with main logic.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;db/&lt;/code&gt;: Chroma storage and utilities.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;.devcontainer/&lt;/code&gt;: Configuration for standalone environments.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;.env&lt;/code&gt;: Stores your OpenAI API key.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Why We Chose Chroma for Our Vector Database
&lt;/h3&gt;

&lt;p&gt;Chroma's simplicity and user-friendly approach made it the standout choice for our AI Demo Project. Its straightforward APIs facilitate quick integration, allowing our team to prioritize feature development. Moreover, Chroma's innovative design, optimized for high-dimensional vector data, ensures efficient and accurate searches, which are vital for our project's NLP capabilities.&lt;/p&gt;

&lt;p&gt;Additionally, Chroma offers the flexibility of local hosting, with options for both persistent and in-memory databases, catering to our project's scalability and performance needs. Its compatibility with advanced AI tools, such as LangChain and OpenAI, enables us to harness the full spectrum of AI technology effectively.&lt;/p&gt;

&lt;p&gt;Designed specifically for high-dimensional vector data, Chroma simplifies storing, managing, and searching knowledge for cutting-edge AI applications. Its intuitive SDKs, robust production-ready deployment options, and specialized focus on embedding-powered features make Chroma a standout for innovation.&lt;/p&gt;

&lt;p&gt;Out-of-the-box, Chroma handles critical functions like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Vector embedding of text&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Metadata storage&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Efficient ANN search&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Document storage&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Query embedding&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Relevance ranking&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Chroma also shines through usability and scalability. Its intuitive SDKs and integrations facilitate rapid prototyping, while the &lt;a&gt;production-ready&lt;/a&gt; server application easily handles growth.&lt;/p&gt;

&lt;h2&gt;
  
  
  Putting It All Together
&lt;/h2&gt;

&lt;p&gt;By encapsulating the runtime toolchain into portable Dev Containers, adding a vector database like Chroma into the mix, and harnessing generative algorithms from OpenAI, developers can focus purely on building intelligently. Platforms like Daytona further accelerate this by managing provisioning and security of these SDEs at scale across teams.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1 - Structuring the Dev Container
&lt;/h2&gt;

&lt;p&gt;A dev container is structured using a &lt;code&gt;devcontainer.json&lt;/code&gt; file that defines its Docker container and customize it for a particular project. Here is an example config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "name": "AI Sandbox Demo",
  "build": {
    "dockerfile": "Dockerfile"
  },
  "features": {
    "ghcr.io/devcontainers/features/github-cli:1": {
      "installDirectlyFromGitHubRelease": true,
      "version": "latest"
    },
    "ghcr.io/devcontainers/features/sshd:1": {
      "version": "latest"
    },
    "ghcr.io/devcontainers-contrib/features/mypy:2": {
      "version": "latest"
    }
  },
  "postCreateCommand": "pip install -r requirements.txt",
  "customizations": {
    "vscode": {
      "extensions": [
        "ms-python.python",
      ]
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It allows configuring Docker build instructions, tools/languages to install, and IDE customizations for the project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2 - How to use Chroma as your embeddings vector database
&lt;/h2&gt;

&lt;p&gt;Here is sample code to index and search documents with Chroma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import chromadb

# Initialize ChromaDB Client
chroma_client = chromadb.Client()

# Create a collection 
collection = chroma_client.create_collection(
  name="articles",
  embedding_function="all-mpnet-base-v2" 
)

# Index documents
collection.upsert(
  documents=["Text content..."],
  metadatas=[{"url": "http://example.com/article"}]  
)

# Search documents
results = collection.query(
  query_texts=["search keywords"],
  n_results=5  
)

print(results['documents']) 
print(results['metadatas'])
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This simplicity enables rapid development of AI prototypes on top of Chroma.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3 - Populating the Database
&lt;/h2&gt;

&lt;p&gt;With our dev environment ready, let's start using the demo scripts to extract and store web content.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;populate.py&lt;/code&gt; script handles content ingestion. To start, we need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A website sitemap URL&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;(Optional) OpenAI API key for enhanced ML search (free trial and somestarting credits are available)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's walk through the script:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sitemap_url = "https://example.com/sitemap.xml" 

import SynthSpyder

# Fetch, parse and process sitemap asynchronously 
await SynthSpyder.process_sitemap(sitemap_url)  

# Saves content to ChromaDB collection
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This illustrates the simplicity of the content pipeline. Under the hood, it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Fetches sitemap XML.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Extracts listed URLs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Downloads each page.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Scrapes main text content.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Stores in the database including metadata like the page URL.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Our database is now populated with structured web content ready for search and analysis!&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4 - Searching Content with AI
&lt;/h2&gt;

&lt;p&gt;With a collection of content ingested, we can leverage AI search capabilities.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;search.py&lt;/code&gt; script allows queries against the database:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;search_query = "Self driving cars" 

import SynthSpyder

# Search the database collection
results = SynthSpyder.search(search_query)  

# Results contain text snippets and metadata 
print(results)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By default, this uses approximate nearest-neighbor search provided by the Chroma vector database.&lt;/p&gt;

&lt;p&gt;For semantic search, we can enable OpenAI embeddings:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;results = SynthSpyder.search(query, ef_name="openai") 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This showcases how SDEs allow us to easily swap out components like ML models.&lt;/p&gt;

&lt;p&gt;Now let's generate some articles!&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5 - Querying GPT-4 within the set context from vector database
&lt;/h2&gt;

&lt;p&gt;The API can be easily installed and imported into any Python environment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip install openai 

import openai

openai.api_key = "sk-..."

response = openai.Completion.create(
  engine="text-davinci-003",
  prompt="Hello world in Python",
  max_tokens=5
)

print(response["choices"][0]["text"])
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This simplicity of integration with SDEs allows focusing efforts on creating intelligent applications rather than hassling with dependencies.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;write.py&lt;/code&gt; script ties together our content pipeline:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Query Chroma to fetch context around a topic&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Feed context into GPT-4 to generate a unique response&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;query = "Self driving cars"
prompt = "Write an article about self driving cars" 

import SynthSpyder

# Fetch related content from the database
context = SynthSpyder.search_context(query)

prompt += f"\n\nContext:\n{context}"

# Generate the article
article = SynthSpyder.write(prompt)  

print(article)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And we have an AI-generated article personalized to our database content!&lt;/p&gt;

&lt;p&gt;The standardized environment enabled us to easily:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Spin up a reproducible dev container&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ingest and store web content&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Build an AI search pipeline&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Integrate GPT-4 to generate articles&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This demonstrates the power of SDEs as sandboxes for innovating with modern data tools and AI systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Opportunities for Improvements
&lt;/h2&gt;

&lt;p&gt;To optimize and improve our project, we could:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Deploy a local Large Language Model (LLM) to enhance data privacy.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Introduce a configurable option in the &lt;code&gt;.env&lt;/code&gt; file to select different OpenAI models, allowing for flexible model switching.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enable the selection of the embedding function within the &lt;code&gt;.env&lt;/code&gt; file instead of passing it as an argument every time.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Support the use of multiple collections for diverse data management and cross-collection search.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Develop a user-friendly web interface with Flask or a comparable framework to simplify interaction with the system.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Future of AI lies in Standardization
&lt;/h2&gt;

&lt;p&gt;As our demo illustrates, SDEs uniquely remove friction from the development process, saving developers hours upon hours. This compounds over the course of a project’s lifespan, enabling teams to achieve exponentially more through unlocked innovation capabilities. These environments turn "What if?" questions into "Why not!" breakthroughs. The only limit is your ambition.&lt;/p&gt;

&lt;p&gt;Certainly, the rate at which AI development is evolving demands environments focused on flexibility and experimentation support. Only through standardization can developers hope to keep pace and push boundaries further.&lt;/p&gt;

&lt;p&gt;In embracing the SDE approach, organizations also invest in their own future competitiveness within the AI landscape. Those still bogged down by fragmented tools will struggle to attract top talent and innovate quickly enough to compete. To encourage ingenuity, establishing a culture rooted in productivity and consistency is essential.&lt;/p&gt;

&lt;p&gt;The next epoch of AI promises to stretch our imaginations beyond what is currently possible. But to reach this full potential, developers need environments tailor-built to support their ambitions. SDEs standardized using templates, containerization, and automation fill this need perfectly.&lt;/p&gt;

&lt;p&gt;So whether you're an AI enthusiast eager to experiment, a seasoned veteran pursuing the next big innovation, or a team manager focused on supercharging productivity SDEs are the ultimate sandbox. Offering uniformity but not rigidity, they pave the way for scaling creativity quickly.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The future of AI has arrived. Are your environments ready to handle it?&lt;/em&gt;&lt;/p&gt;

</description>
      <category>chroma</category>
      <category>openai</category>
      <category>api</category>
      <category>sde</category>
    </item>
  </channel>
</rss>
