<?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: Brian Douglas</title>
    <description>The latest articles on Forem by Brian Douglas (@bdougieyo).</description>
    <link>https://forem.com/bdougieyo</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%2F19970%2F6dc0f11e-a4da-4762-aed8-11f70143d31b.jpeg</url>
      <title>Forem: Brian Douglas</title>
      <link>https://forem.com/bdougieyo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/bdougieyo"/>
    <language>en</language>
    <item>
      <title>OpenClaw in a Box</title>
      <dc:creator>Brian Douglas</dc:creator>
      <pubDate>Sat, 21 Mar 2026 22:59:08 +0000</pubDate>
      <link>https://forem.com/bdougieyo/openclaw-in-a-box-269n</link>
      <guid>https://forem.com/bdougieyo/openclaw-in-a-box-269n</guid>
      <description>&lt;p&gt;An OpenClaw agent deleted 200+ emails from Meta's AI alignment director's inbox while ignoring her commands to stop. She had to run to her Mac to kill the process. Context window compaction dropped the safety constraint that said "ask before acting."&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-2025774069124399363-731" src="https://platform.twitter.com/embed/Tweet.html?id=2025774069124399363"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-2025774069124399363-731');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=2025774069124399363&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;No network boundary. No kill switch beyond reaching the machine. No recording of what the agent saw or why it ignored the stop command.&lt;/p&gt;

&lt;p&gt;I built openclaw-in-a-box to make that scenario impossible. It runs OpenClaw inside a stereOS VM with Tapes as the flight recorder.&lt;/p&gt;

&lt;p&gt;Last month ago I wrote about running OpenClaw on exe.dev with Discord. That post was about getting started safely on someone else's ephemeral VM. This project takes it further: you own the sandbox, you own the telemetry, and the whole thing is declarative and version-controlled.&lt;/p&gt;


&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/bdougieyo/setting-up-openclaw-on-exedev-with-discord-27n" class="crayons-story__hidden-navigation-link"&gt;Setting Up OpenClaw on exe.dev with Discord&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/bdougieyo" class="crayons-avatar  crayons-avatar--l  "&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%2F19970%2F6dc0f11e-a4da-4762-aed8-11f70143d31b.jpeg" alt="bdougieyo profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/bdougieyo" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Brian Douglas
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Brian Douglas
                
              
              &lt;div id="story-author-preview-content-3220101" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/bdougieyo" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2F19970%2F6dc0f11e-a4da-4762-aed8-11f70143d31b.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Brian Douglas&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/bdougieyo/setting-up-openclaw-on-exedev-with-discord-27n" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Feb 2&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/bdougieyo/setting-up-openclaw-on-exedev-with-discord-27n" id="article-link-3220101"&gt;
          Setting Up OpenClaw on exe.dev with Discord
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/llm"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;llm&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/coding"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;coding&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/bdougieyo/setting-up-openclaw-on-exedev-with-discord-27n" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/raised-hands-74b2099fd66a39f2d7eed9305ee0f4553df0eb7b4f11b01b6b1b499973048fe5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;29&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/bdougieyo/setting-up-openclaw-on-exedev-with-discord-27n#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              3&lt;span class="hidden s:inline"&gt; comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            5 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


&lt;h2&gt;
  
  
  The sandbox
&lt;/h2&gt;

&lt;p&gt;stereOS locks the agent down. Network egress allowlist means the agent can only reach APIs you explicitly permit. Gmail, Anthropic, npm. Nothing else. If the agent tries to curl somewhere unexpected, the network layer blocks it. This isn't application-level filtering. It's at the VM's network stack.&lt;/p&gt;

&lt;p&gt;Secrets live in tmpfs, never written to disk, gone the moment the VM stops. Auto-teardown after 2 hours. If you walk away, credentials don't linger. The agent doesn't keep running overnight.&lt;/p&gt;

&lt;p&gt;One &lt;code&gt;jcard.toml&lt;/code&gt; file defines the entire sandbox. Resources, network policy, secrets, timeout. Reproducible, auditable, version-controlled.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="py"&gt;mixtape&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"opencode-mixtape:latest"&lt;/span&gt;
&lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"openclaw-in-a-box"&lt;/span&gt;

&lt;span class="nn"&gt;[network]&lt;/span&gt;
&lt;span class="py"&gt;mode&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"nat"&lt;/span&gt;
&lt;span class="py"&gt;egress_allow&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="s"&gt;"api.anthropic.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"openclaw.ai"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s"&gt;"gmail.googleapis.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"oauth2.googleapis.com"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="s"&gt;"registry.npmjs.org"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="nn"&gt;[timeout]&lt;/span&gt;
&lt;span class="py"&gt;duration&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"2h"&lt;/span&gt;

&lt;span class="nn"&gt;[secrets]&lt;/span&gt;
&lt;span class="py"&gt;ANTHROPIC_API_KEY&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"${ANTHROPIC_API_KEY}"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  The flight recorder
&lt;/h2&gt;

&lt;p&gt;Tapes sits between the agent and the LLM as a transparent proxy, capturing every request and response to SQLite with hash chains. No instrumentation. No SDK. It records at the network layer.&lt;/p&gt;

&lt;p&gt;When the Meta incident happened, there was no way to replay the agent's reasoning. Why did it start deleting? What did the compacted context look like? At what point did it lose the safety constraint? Without a recording, all you have is the outcome: 200 emails gone.&lt;/p&gt;

&lt;p&gt;With Tapes you get the full prompt, the full response, token counts, timestamps. Content-addressed so the sequence is tamper-evident. If the agent miscategorizes an email, you replay the tape. Every prompt, every response, every decision.&lt;/p&gt;

&lt;p&gt;The difference between "200 emails gone, no idea why" and a complete forensic replay.&lt;/p&gt;
&lt;h2&gt;
  
  
  The architecture
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────────────────────────────┐
│  stereOS VM  (NixOS · 2 CPU · 4 GiB)       │
│                                             │
│  tapes proxy (:8080)                        │
│    ▲ intercepts all LLM traffic             │
│    ▼                                        │
│  openclaw gateway (:18789)                  │
│    ├── Claude API (via Tapes proxy)         │
│    ├── gog CLI → Gmail API                  │
│    └── skills/gmail-triage/SKILL.md         │
│                                             │
│  egress: anthropic, gmail, npm only         │
│  secrets: tmpfs (never on disk)             │
│  timeout: 2h auto-teardown                  │
└─────────────────────────────────────────────┘
       │
       │  shared mount (persists across restarts)
       ▼
  .mb/tapes/tapes.sqlite    agent black box
  .openclaw/                agent config
  output/                   INBOX_REPORT.md
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  The skill
&lt;/h2&gt;

&lt;p&gt;The triage logic is a Markdown file. No code. The agent reads it, understands the rules, and executes them using the gog CLI for Gmail access.&lt;/p&gt;

&lt;p&gt;It classifies messages into four categories: newsletter, receipt, action needed, FYI. Newsletters get archived. Receipts get labeled and archived. Action items get starred. FYI messages get marked as read.&lt;/p&gt;

&lt;p&gt;Safety constraints baked into the skill: never delete messages, never send replies. If a message can't be confidently classified, leave it unread. Change the categories, add new ones, tighten the constraints. It's all prose.&lt;/p&gt;
&lt;h2&gt;
  
  
  Running it
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/papercomputeco/openclaw-in-a-box
&lt;span class="nb"&gt;cd &lt;/span&gt;openclaw-in-a-box
mb up
mb ssh openclaw-in-a-box
bash /workspace/scripts/install.sh
bash /workspace/scripts/start.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;The install script handles Node.js, OpenClaw CLI, Tapes CLI, and the gog CLI for Gmail access. OAuth setup for Gmail is a one-time step on the host. After that, &lt;code&gt;mb up&lt;/code&gt; and &lt;code&gt;start.sh&lt;/code&gt; is all you need between sessions.&lt;/p&gt;
&lt;h2&gt;
  
  
  What you get from the recordings
&lt;/h2&gt;

&lt;p&gt;Query the black box directly to see the agent's reasoning:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;sqlite3 .mb/tapes/tapes.sqlite &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="s2"&gt;"SELECT role, substr(content, 1, 200) FROM nodes ORDER BY created_at DESC LIMIT 4"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;assistant | Here's your inbox triage for the last 2 days (20 threads):
           ## Needs Attention
           - State DMV: Complete your application
           - Team standup invite: Tuesday 9am PDT...
user      | [tool_result]
assistant | [tool_input: gog gmail messages list ...]
user      | /gmail-triage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Read bottom to top. The user invoked &lt;code&gt;/gmail-triage&lt;/code&gt;, the agent called gog to list messages, received the results, then produced the classification. Every step is captured.&lt;/p&gt;

&lt;p&gt;Over time the recordings become training data. Analyze 100 triage sessions to find where the skill definition falls short. Which email categories does the agent struggle with? Which prompts produce better classification? The black box isn't just for incident response. It's how agents get better between runs.&lt;/p&gt;

&lt;p&gt;When you're done, &lt;code&gt;mb destroy openclaw-in-a-box&lt;/code&gt;. Secrets gone. VM gone. The only thing that survives is the tape.&lt;/p&gt;

&lt;p&gt;Go try it.&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/papercomputeco" rel="noopener noreferrer"&gt;
        papercomputeco
      &lt;/a&gt; / &lt;a href="https://github.com/papercomputeco/openclaw-in-a-box" rel="noopener noreferrer"&gt;
        openclaw-in-a-box
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Secure, sandboxed OpenClaw agents with full telemetry.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;openclaw-in-a-box&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;Run OpenClaw in a &lt;a href="https://stereos.ai" rel="nofollow noopener noreferrer"&gt;stereOS&lt;/a&gt; VM with &lt;a href="https://tapes.dev" rel="nofollow noopener noreferrer"&gt;Tapes&lt;/a&gt; telemetry.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Get Started&lt;/h2&gt;
&lt;/div&gt;

&lt;p&gt;Paste this into Claude Code, OpenCode, or any coding harness:&lt;/p&gt;

&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;Set up openclaw-in-a-box from https://github.com/papercomputeco/openclaw-in-a-box — clone the repo and follow SKILL.md to get me running with a secure OpenClaw setup
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;The agent clones the repo, checks your environment, asks which integrations you want, and walks you through setup.&lt;/p&gt;

Manual setup
&lt;p&gt;Prerequisites: &lt;a href="https://github.com/papercomputeco/masterblaster" rel="noopener noreferrer"&gt;Master Blaster&lt;/a&gt; (&lt;code&gt;mb&lt;/code&gt; CLI) and &lt;code&gt;ANTHROPIC_API_KEY&lt;/code&gt; exported.&lt;/p&gt;
&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;git clone https://github.com/papercomputeco/openclaw-in-a-box
&lt;span class="pl-c1"&gt;cd&lt;/span&gt; openclaw-in-a-box
&lt;span class="pl-k"&gt;export&lt;/span&gt; ANTHROPIC_API_KEY=&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;sk-ant-...&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt;
mb up
mb ssh openclaw-in-a-box
bash /workspace/scripts/install.sh   &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; first time&lt;/span&gt;
bash /workspace/scripts/start.sh&lt;/pre&gt;

&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Integrations&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;The VM comes pre-configured for three integrations. Set up whichever ones you need -- the agent loads all available skills at startup.&lt;/p&gt;

&lt;p&gt;&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;br&gt;
&lt;thead&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;th&gt;Integration&lt;/th&gt;
&lt;br&gt;
&lt;th&gt;Setup Guide&lt;/th&gt;
&lt;br&gt;
&lt;th&gt;What It Does&lt;/th&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;/thead&gt;
&lt;br&gt;
&lt;tbody&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;&lt;a href="https://github.com/papercomputeco/openclaw-in-a-box/quickstart/gmail/" rel="noopener noreferrer"&gt;Gmail Triage&lt;/a&gt;&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;Google OAuth + &lt;code&gt;gog&lt;/code&gt; CLI&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;Archive newsletters, label receipts, flag action items&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;tr&gt;
&lt;br&gt;
&lt;td&gt;&lt;a href="https://github.com/papercomputeco/openclaw-in-a-box/quickstart/github/" rel="noopener noreferrer"&gt;GitHub Org Triage&lt;/a&gt;&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;
&lt;br&gt;
&lt;code&gt;GH_TOKEN&lt;/code&gt; + &lt;code&gt;gh&lt;/code&gt; CLI&lt;/td&gt;
&lt;br&gt;
&lt;td&gt;Flag stale PRs, blocked issues, release&lt;/td&gt;
&lt;br&gt;
&lt;/tr&gt;
&lt;br&gt;
&lt;/tbody&gt;
&lt;br&gt;
&lt;/table&gt;&lt;/div&gt;…&lt;/p&gt;
&lt;/div&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/papercomputeco/openclaw-in-a-box" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;h1&gt;
  
  
  aiagents #opensource #security
&lt;/h1&gt;

</description>
      <category>openclaw</category>
      <category>agents</category>
      <category>security</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Setting Up OpenClaw on exe.dev with Discord</title>
      <dc:creator>Brian Douglas</dc:creator>
      <pubDate>Mon, 02 Feb 2026 06:11:52 +0000</pubDate>
      <link>https://forem.com/bdougieyo/setting-up-openclaw-on-exedev-with-discord-27n</link>
      <guid>https://forem.com/bdougieyo/setting-up-openclaw-on-exedev-with-discord-27n</guid>
      <description>&lt;p&gt;I'll be honest—when I first heard about Clawdbot (now rebranded as OpenClaw) a few weeks back, I had that immediate security alarm going off in my head. An AI agent running with Discord permissions, making API calls, potentially accessing who knows what? As someone who's spent years in developer experience, the threat model here was... concerning.&lt;/p&gt;

&lt;p&gt;But then I started seeing folks in the community actually using it—spinning up Digital Ocean droplets, deploying to Railway.&lt;/p&gt;

&lt;p&gt;So I decided to try it, but on my terms: isolated, observable, and disposable. Which is why I chose exe.dev, but this can work on the platform of your choice.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why exe.dev?
&lt;/h2&gt;

&lt;p&gt;I've known about exe.dev for months—it's this clever service that gives you ephemeral VMs that you can spin up and tear down instantly. Perfect for experiments you're not 100% sure about. If OpenClaw does something weird or I misconfigure something, I just nuke the VM and start fresh. No damage to my local machine, no persistent infrastructure to maintain.&lt;/p&gt;

&lt;p&gt;Think of it as a playground where mistakes are cheap.&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%2Fwwbe7rivz4uzcmpk0c9n.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%2Fwwbe7rivz4uzcmpk0c9n.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;💡 Pro Tip: Add Telemetry from Day One&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Before you start, consider adding &lt;a href="https://tapes.dev" rel="noopener noreferrer"&gt;tapes&lt;/a&gt; as a proxy layer. It records every API call OpenClaw makes, giving you visibility into prompts, token usage, and agent behavior. The &lt;a href="https://tapes.dev/guides/openclaw/" rel="noopener noreferrer"&gt;official guide&lt;/a&gt; has details, or follow the optional setup in Step 7 below. Trust me—you'll want this data when debugging why your agent did something unexpected.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  What You'll Need
&lt;/h2&gt;

&lt;p&gt;Before we dive in, grab these:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An &lt;a href="https://exe.dev" rel="noopener noreferrer"&gt;exe.dev&lt;/a&gt; account&lt;/li&gt;
&lt;li&gt;A Discord bot token from the &lt;a href="https://discord.com/developers/applications" rel="noopener noreferrer"&gt;Discord Developer Portal&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;An Anthropic API key if you want to use Claude (optional, but recommended)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Fast Path: Using the Template
&lt;/h2&gt;

&lt;p&gt;Here's where exe.dev really shines. They have an OpenClaw template that handles most of the setup:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Navigate to &lt;a href="https://exe.new/openclaw" rel="noopener noreferrer"&gt;exe.new/openclaw&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Drop in your API keys when prompted&lt;/li&gt;
&lt;li&gt;Let Shelley (exe.dev's setup assistant) do the heavy lifting&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I'm going to walk you through the manual setup though, because understanding what's actually happening is half the value here.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Manual Route (More Learning, Same Result)
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Create Your VM
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ssh exe.dev new
&lt;span class="c"&gt;# You'll get a VM name like: curious-tesla-8432&lt;/span&gt;
ssh curious-tesla-8432.exe.xyz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You're now inside an Ubuntu VM that exists just for you, accessible from anywhere.&lt;/p&gt;

&lt;h3&gt;
  
  
  Install OpenClaw
&lt;/h3&gt;

&lt;p&gt;This is surprisingly straightforward:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Get the system ready&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get update
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; git curl jq ca-certificates openssl nginx

&lt;span class="c"&gt;# Install OpenClaw via their script&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://openclaw.bot/install.sh | bash

&lt;span class="c"&gt;# Run the onboarding (we're skipping interactive prompts)&lt;/span&gt;
openclaw onboard &lt;span class="nt"&gt;--non-interactive&lt;/span&gt; &lt;span class="nt"&gt;--accept-risk&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That &lt;code&gt;--accept-risk&lt;/code&gt; flag made me pause. It's OpenClaw's way of acknowledging that yes, you're running an AI agent with real permissions. I appreciate the directness.&lt;/p&gt;

&lt;h3&gt;
  
  
  Configure Nginx as a Reverse Proxy
&lt;/h3&gt;

&lt;p&gt;OpenClaw runs on port 18789 internally, but we want to access it via standard web ports. This is where nginx comes in.&lt;/p&gt;

&lt;p&gt;Edit &lt;code&gt;/etc/nginx/sites-enabled/default&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight nginx"&gt;&lt;code&gt;&lt;span class="k"&gt;server&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;80&lt;/span&gt; &lt;span class="s"&gt;default_server&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="s"&gt;[::]:80&lt;/span&gt; &lt;span class="s"&gt;default_server&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="mi"&gt;8000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kn"&gt;listen&lt;/span&gt; &lt;span class="s"&gt;[::]:8000&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;server_name&lt;/span&gt; &lt;span class="s"&gt;_&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="kn"&gt;location&lt;/span&gt; &lt;span class="n"&gt;/&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_pass&lt;/span&gt; &lt;span class="s"&gt;http://127.0.0.1:18789&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_http_version&lt;/span&gt; &lt;span class="mf"&gt;1.1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;# WebSocket support - crucial for real-time updates&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Upgrade&lt;/span&gt; &lt;span class="nv"&gt;$http_upgrade&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Connection&lt;/span&gt; &lt;span class="s"&gt;"upgrade"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;# Standard proxy headers&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;Host&lt;/span&gt; &lt;span class="nv"&gt;$host&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Real-IP&lt;/span&gt; &lt;span class="nv"&gt;$remote_addr&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Forwarded-For&lt;/span&gt; &lt;span class="nv"&gt;$proxy_add_x_forwarded_for&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_set_header&lt;/span&gt; &lt;span class="s"&gt;X-Forwarded-Proto&lt;/span&gt; &lt;span class="nv"&gt;$scheme&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

        &lt;span class="c1"&gt;# Long timeouts for agent tasks that might run a while&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_read_timeout&lt;/span&gt; &lt;span class="s"&gt;86400s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="kn"&gt;proxy_send_timeout&lt;/span&gt; &lt;span class="s"&gt;86400s&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Apply the changes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl restart nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Connect Your Discord Bot
&lt;/h3&gt;

&lt;p&gt;Now for the fun part. Edit &lt;code&gt;~/.openclaw/openclaw.json&lt;/code&gt; and add your Discord credentials:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"channels"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"discord"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"enabled"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"token"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"YOUR_DISCORD_BOT_TOKEN"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart the gateway to pick up the changes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw gateway restart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The Pairing Dance (This Tripped Me Up)
&lt;/h2&gt;

&lt;p&gt;When I first tried to access the dashboard, I got this cryptic message:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;disconnected (1008): pairing required&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Turns out OpenClaw uses a device pairing system to prevent unauthorized access. Smart, but not immediately obvious.&lt;/p&gt;

&lt;p&gt;Here's how to fix it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# See what's waiting for approval&lt;/span&gt;
openclaw devices list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll see something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Pending:
  - id: abc123
    browser: Chrome
    requested: 2 minutes ago
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Approve it:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw devices approve abc123
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now refresh your browser. You should be connected.&lt;/p&gt;

&lt;h2&gt;
  
  
  Access Your Dashboard
&lt;/h2&gt;

&lt;p&gt;Your OpenClaw dashboard lives at:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://&amp;lt;vm-name&amp;gt;.exe.xyz/?token=&amp;lt;your-gateway-token&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Find your token in &lt;code&gt;~/.openclaw/openclaw.json&lt;/code&gt; under &lt;code&gt;gateway.auth.token&lt;/code&gt;. I bookmarked this URL because I reference it constantly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Verify Everything Works
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw health
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should see confirmation that Discord is connected and your agents are running:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Discord: ok (@yourbotname)
Agents: main (default)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is your health check. Anytime something feels off, run this first.&lt;/p&gt;

&lt;h2&gt;
  
  
  Optional: Route Through Tapes for Observability
&lt;/h2&gt;

&lt;p&gt;Here's where my Continue background kicks in. I want to see what API calls OpenClaw is making, so I route everything through &lt;a href="https://github.com/anthropics/anthropic-tools" rel="noopener noreferrer"&gt;tapes&lt;/a&gt;—Anthropic's proxy tool for inspecting and recording API interactions.&lt;/p&gt;

&lt;p&gt;Start tapes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;tapes serve &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--provider&lt;/span&gt; anthropic &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--upstream&lt;/span&gt; &lt;span class="s2"&gt;"https://api.anthropic.com"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--proxy-listen&lt;/span&gt; &lt;span class="s2"&gt;"0.0.0.0:8080"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--sqlite&lt;/span&gt; &lt;span class="s2"&gt;"./tapes.db"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Update &lt;code&gt;~/.openclaw/openclaw.json&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"providers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"anthropic"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"baseUrl"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http://localhost:8080"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart: &lt;code&gt;openclaw gateway restart&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Now every Claude API call is logged to &lt;code&gt;tapes.db&lt;/code&gt;. You can inspect prompts, responses, token usage—everything. This level of observability is crucial when you're evaluating AI tooling.&lt;/p&gt;

&lt;h2&gt;
  
  
  Things That Surprised Me
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;The pairing system actually works well&lt;/strong&gt; - Once I understood it, I appreciated having explicit device approval&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Config persistence is fragile&lt;/strong&gt; - Some OpenClaw commands will overwrite your config. Always backup &lt;code&gt;~/.openclaw/openclaw.json&lt;/code&gt; before running setup commands&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It's genuinely useful&lt;/strong&gt; - Having a Discord bot that can reason about context and execute tasks is different from slash commands or simple bots&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Troubleshooting Guide
&lt;/h2&gt;

&lt;h3&gt;
  
  
  "pairing required" won't go away
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw devices list
openclaw devices approve &amp;lt;&lt;span class="nb"&gt;id&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Refresh your browser after approving.&lt;/p&gt;

&lt;h3&gt;
  
  
  Discord shows offline
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Double-check your bot token in the config&lt;/li&gt;
&lt;li&gt;Verify the bot was added to your server with the right permissions&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;openclaw doctor&lt;/code&gt; for diagnostics&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Gateway won't start
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;openclaw gateway status  &lt;span class="c"&gt;# Check what's wrong&lt;/span&gt;
openclaw logs           &lt;span class="c"&gt;# See error details&lt;/span&gt;
openclaw gateway restart &lt;span class="c"&gt;# Try restarting&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Quick Reference Commands
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Command&lt;/th&gt;
&lt;th&gt;What It Does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;openclaw health&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Connection status check&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;openclaw devices list&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Show paired/pending devices&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;openclaw devices approve &amp;lt;id&amp;gt;&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Approve a new device&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;openclaw gateway restart&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Restart the gateway process&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;openclaw doctor&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Run full diagnostics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;openclaw logs&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;View gateway logs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Running OpenClaw on exe.dev turned out to be the perfect middle ground. I got to experiment with AI agents in Discord without compromising my local environment, and I could observe everything happening via tapes. &lt;/p&gt;

&lt;p&gt;Is it production-ready for your use case? That depends on what you're building. But as a tool for understanding how autonomous AI agents operate, how they handle context, and what the developer experience looks like? It's been genuinely educational.&lt;/p&gt;

&lt;p&gt;The security concerns I had initially? Still valid. But now they're informed concerns rather than fear-based ones. And that's the difference between avoiding technology and understanding its tradeoffs.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Guide based on OpenClaw 2026.1.29 running on exe.dev. If you try this and run into issues, reach out—I'm probably debugging the same thing.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>coding</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Brian Douglas</dc:creator>
      <pubDate>Tue, 26 Aug 2025 22:29:36 +0000</pubDate>
      <link>https://forem.com/bdougieyo/-3eda</link>
      <guid>https://forem.com/bdougieyo/-3eda</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/babblebey/continuous-ai-a-simple-introduction-3k10" class="crayons-story__hidden-navigation-link"&gt;Continuous AI: A Simple Introduction&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/babblebey" class="crayons-avatar  crayons-avatar--l  "&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%2F375884%2Fb6668e67-9ac0-4982-b6c3-742564bd4242.png" alt="babblebey profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/babblebey" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Olabode Lawal-Shittabey
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Olabode Lawal-Shittabey
                
              
              &lt;div id="story-author-preview-content-2789479" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/babblebey" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&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%2F375884%2Fb6668e67-9ac0-4982-b6c3-742564bd4242.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Olabode Lawal-Shittabey&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/babblebey/continuous-ai-a-simple-introduction-3k10" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Aug 26 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/babblebey/continuous-ai-a-simple-introduction-3k10" id="article-link-2789479"&gt;
          Continuous AI: A Simple Introduction
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/ai"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;ai&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/softwaredevelopment"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;softwaredevelopment&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/llm"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;llm&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/softwareengineering"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;softwareengineering&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/babblebey/continuous-ai-a-simple-introduction-3k10" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;6&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/babblebey/continuous-ai-a-simple-introduction-3k10#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              2&lt;span class="hidden s:inline"&gt; comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            4 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>ai</category>
      <category>softwaredevelopment</category>
      <category>llm</category>
      <category>softwareengineering</category>
    </item>
    <item>
      <title>The Building Blocks of an AI Coding Assistant</title>
      <dc:creator>Brian Douglas</dc:creator>
      <pubDate>Wed, 26 Mar 2025 18:03:08 +0000</pubDate>
      <link>https://forem.com/bdougieyo/the-building-blocks-of-an-ai-coding-assistant-2m28</link>
      <guid>https://forem.com/bdougieyo/the-building-blocks-of-an-ai-coding-assistant-2m28</guid>
      <description>&lt;p&gt;In my &lt;a href="https://bdougie.substack.com/p/youre-doing-ai-coding-all-wrong" rel="noopener noreferrer"&gt;latest newsletter&lt;/a&gt;, I ranted about how most developers approach AI coding assistants wrong. &lt;/p&gt;

&lt;p&gt;We're treating these tools like magic boxes instead of understanding their components. Today, I’ll dive into what makes a coding assistant work, using continue.dev—an open-source platform changing our view on AI coding tools. I'll break down the seven essential building blocks.&lt;/p&gt;

&lt;p&gt;As I shared in my &lt;a href="https://bdougie.substack.com/p/youre-doing-ai-coding-all-wrong" rel="noopener noreferrer"&gt;newsletter&lt;/a&gt;, my Go programming journey was transformed by leveraging these building blocks. When I started with Go, I struggled with its idioms and best practices. But by creating a customized coding assistant that indexes official documentation and enforces idiomatic patterns, I’ve dramatically accelerated my learning. What used to take hours now happens seamlessly.&lt;/p&gt;

&lt;p&gt;I’m focusing on the Continue coding assistant because it’s the first I’ve used with this paradigm.&lt;/p&gt;

&lt;h2&gt;
  
  
  Breaking Down the AI Coding Assistant
&lt;/h2&gt;

&lt;p&gt;If you've followed my work, you know I'm passionate about demystifying dev tools. The problem with most AI coding approaches is developers expect too much ("AI do my job") or too little ("it's just fancy autocomplete"). The reality lies in between, and understanding the building blocks helps us use these tools effectively.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://docs.continue.dev/hub/blocks/block-types#models" rel="noopener noreferrer"&gt;Models&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Models specify Large Language Models (LLMs) and other deep learning models for roles in the open-source IDE extension like Chat, Autocomplete, Edit, Embed, Rerank, etc. Explore available models on &lt;a href="https://hub.continue.dev/explore/models" rel="noopener noreferrer"&gt;the hub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Continue supports &lt;a href="https://docs.continue.dev/customize/model-providers" rel="noopener noreferrer"&gt;many model providers&lt;/a&gt; like Anthropic, OpenAI, Gemini, Ollama, Amazon Bedrock, Azure, xAI, DeepSeek, and more. Models can have roles such as chat, edit, apply, autocomplete, embed, and rerank. Read more about roles &lt;a href="https://docs.continue.dev/customize/model-roles" rel="noopener noreferrer"&gt;here&lt;/a&gt;. View &lt;a href="https://docs.continue.dev/yaml-reference#models" rel="noopener noreferrer"&gt;models&lt;/a&gt; in the YAML Reference for details.&lt;/p&gt;

&lt;p&gt;The key advantage is running your assistant locally with Ollama. Check out Chad's article on &lt;a href="https://blog.continue.dev/using-ollama-with-continue-a-developers-guide/" rel="noopener noreferrer"&gt;leveraging Ollama and Gemma 3&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://docs.continue.dev/hub/blocks/block-types#context" rel="noopener noreferrer"&gt;Context​&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Context blocks define a provider referenced in Chat with @ to pull data from external sources like files, URLs, Jira, Confluence, and GitHub issues. &lt;a href="https://hub.continue.dev/explore/context" rel="noopener noreferrer"&gt;Explore context provider blocks&lt;/a&gt; on the hub.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;context&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;go-docs&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Go Documentation&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Official Go programming language documentation&lt;/span&gt;
    &lt;span class="na"&gt;sources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;web&lt;/span&gt;
        &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://golang.org/doc/&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;web&lt;/span&gt;
        &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://golang.org/doc/effective_go&lt;/span&gt;

  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;go-stdlib&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Go Standard Library&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Go standard library documentation&lt;/span&gt;
    &lt;span class="na"&gt;sources&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
      &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;web&lt;/span&gt;
        &lt;span class="na"&gt;url&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://pkg.go.dev/std&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With this setup, reference Go documentation in chats using &lt;code&gt;@go-docs&lt;/code&gt; or access the standard library with &lt;code&gt;@go-stdlib&lt;/code&gt;. This has greatly boosted my productivity when writing Go code, as mentioned in my &lt;a href="https://bdougie.substack.com/p/youre-doing-ai-coding-all-wrong" rel="noopener noreferrer"&gt;AI coding newsletter&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Learn about context providers &lt;a href="https://docs.continue.dev/yaml-reference#context" rel="noopener noreferrer"&gt;here this guide here&lt;/a&gt; and create your own with. Find the config.yaml spec for context.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://docs.continue.dev/hub/blocks/block-types#docs" rel="noopener noreferrer"&gt;Docs​&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Docs are blocks pointing to documentation sites, indexed locally for reference using @Docs in Chat. &lt;a href="https://hub.continue.dev/explore/docs" rel="noopener noreferrer"&gt;Explore docs&lt;/a&gt; on the hub.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;See my docs example in the rules section.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://docs.continue.dev/hub/blocks/block-types#mcp-servers" rel="noopener noreferrer"&gt;MCP Servers&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Model Context Protocol (MCP) servers are popular, and Continue has had this as a primitive for some time. MCP is a standard for building and sharing language model tools, defined in mcpServers blocks. &lt;a href="https://hub.continue.dev/explore/mcp" rel="noopener noreferrer"&gt;Explore MCP Servers&lt;/a&gt; on the hub.&lt;/p&gt;

&lt;p&gt;MCP is the new AI buzzword, with many usage examples.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://docs.continue.dev/hub/blocks/block-types#rules" rel="noopener noreferrer"&gt;Rules​&lt;/a&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Rules blocks are instructions your custom AI code assistant always considers. The contents are inserted into the system message for all Chat requests. Explore rules on the hub.
rules:
  - id: effective-go
    name: Effective Go Guidelines
    description: Rules for writing idiomatic Go code
    content: |
      When writing or reviewing Go code, adhere to these Effective Go principles:
      1. Use proper error handling with explicit error returns
      2. Prefer composition over inheritance
      3. Follow Go naming conventions (CamelCase for exported, camelCase for internal)
      4. Use interfaces for abstraction and testing
      5. Use the standard library effectively
      6. Implement proper concurrency patterns with goroutines and channels
      7. Write clear and concise comments for exported functions
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I've complemented this by indexing the official Effective Go documentation.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;docs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Effective Go&lt;/span&gt;
    &lt;span class="na"&gt;version&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;0.0.1&lt;/span&gt;
    &lt;span class="na"&gt;schema&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;v1&lt;/span&gt;
    &lt;span class="na"&gt;startUrl&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;https://go.dev/doc/effective_go&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This setup ensures my coding assistant follows Go best practices and can reference official guidelines. As I mention in my newsletter, domain-specific rules enhance AI-generated code relevance.&lt;/p&gt;

&lt;p&gt;Learn more in the &lt;a href="https://docs.continue.dev/customize/deep-dives/rules" rel="noopener noreferrer"&gt;rules deep dive&lt;/a&gt;, and see in the YAML Reference for details.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://docs.continue.dev/hub/blocks/block-types#prompts" rel="noopener noreferrer"&gt;Prompts&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Prompts blocks are reusable prompts for chat, useful for repetitive or complex tasks. &lt;a href="https://hub.continue.dev/explore/prompts" rel="noopener noreferrer"&gt;Explore prompts&lt;/a&gt; on the hub.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;prompts&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;go-hype-beast&lt;/span&gt;
    &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Go Hype Beast&lt;/span&gt;
    &lt;span class="na"&gt;description&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;A prompt for idiomatic Go code assistance&lt;/span&gt;
    &lt;span class="na"&gt;prompt&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
      &lt;span class="s"&gt;You are a Golang programming assistant. Help developers write clean, idiomatic, efficient Go code by following these best practices:&lt;/span&gt;

      &lt;span class="s"&gt;1. Use gofmt for consistent formatting.&lt;/span&gt;
      &lt;span class="s"&gt;2. Follow Go naming conventions:&lt;/span&gt;
         &lt;span class="s"&gt;• CamelCase for exported names, camelCase for unexported.&lt;/span&gt;
         &lt;span class="s"&gt;• Avoid stuttering in package names (e.g., vectordb.New() not vectordb.NewVectorDB()).&lt;/span&gt;
         &lt;span class="s"&gt;• Name interfaces as "doers" (e.g., Reader, Writer).&lt;/span&gt;
      &lt;span class="s"&gt;3. Write clear, concise code:&lt;/span&gt;
         &lt;span class="s"&gt;• Keep functions small and focused.&lt;/span&gt;
         &lt;span class="s"&gt;• Use meaningful names.&lt;/span&gt;
         &lt;span class="s"&gt;• Limit line length, but don't obsess.&lt;/span&gt;
      &lt;span class="s"&gt;4. Handle errors explicitly:&lt;/span&gt;
         &lt;span class="s"&gt;• Check and handle errors immediately.&lt;/span&gt;
         &lt;span class="s"&gt;• Avoid panic.&lt;/span&gt;
      &lt;span class="s"&gt;5. Use Go's concurrency features:&lt;/span&gt;
         &lt;span class="s"&gt;• Goroutines for concurrency.&lt;/span&gt;
         &lt;span class="s"&gt;• Channels for communication.&lt;/span&gt;
      &lt;span class="s"&gt;6. Optimize for readability and maintainability:&lt;/span&gt;
         &lt;span class="s"&gt;• Explain "why" in comments.&lt;/span&gt;
         &lt;span class="s"&gt;• Use defer for cleanup.&lt;/span&gt;
      &lt;span class="s"&gt;7. Leverage Go's type system:&lt;/span&gt;
         &lt;span class="s"&gt;• Use structs for related data.&lt;/span&gt;
         &lt;span class="s"&gt;• Implement interfaces implicitly.&lt;/span&gt;
      &lt;span class="s"&gt;8. Follow idiomatic Go patterns:&lt;/span&gt;
         &lt;span class="s"&gt;• Prefer composition over inheritance.&lt;/span&gt;
         &lt;span class="s"&gt;• Use slices over arrays when possible.&lt;/span&gt;
      &lt;span class="s"&gt;9. Optimize performance:&lt;/span&gt;
         &lt;span class="s"&gt;• Use efficient data structures and algorithms.&lt;/span&gt;
         &lt;span class="s"&gt;• Profile and benchmark when necessary.&lt;/span&gt;
      &lt;span class="s"&gt;10. Ensure code safety and security:&lt;/span&gt;
          &lt;span class="s"&gt;• Use go vet and golint.&lt;/span&gt;
          &lt;span class="s"&gt;• Avoid global variables when possible.&lt;/span&gt;

      &lt;span class="s"&gt;When providing code examples, adhere to these principles and explain your recommendations. For style decisions, refer to the Go Style Guide and Effective Go documentation.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The "Go Hype Beast" prompt ensures my coding assistant provides idiomatic Go code suggestions following best practices. It transforms the assistant into a specialized Go expert, understanding the language philosophy. Combined with Effective Go documentation, it creates a powerful Go development environment.&lt;/p&gt;

&lt;p&gt;Prompt blocks share the same syntax as &lt;a href="https://docs.continue.dev/customize/deep-dives/prompt-files" rel="noopener noreferrer"&gt;prompt files&lt;/a&gt; but differ in two key ways:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Prompt blocks can't use context providers.&lt;/li&gt;
&lt;li&gt;They're stored in config.yaml, not .continue/prompts.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Find the config.yaml spec for prompts &lt;a href="https://docs.continue.dev/yaml-reference#prompts" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;a href="https://docs.continue.dev/hub/blocks/block-types#data" rel="noopener noreferrer"&gt;Data​&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Data blocks send development data to chosen destinations, useful for analysis, insights, or model fine-tuning. Learn more about development data &lt;a href="https://docs.continue.dev/customize/deep-dives/development-data" rel="noopener noreferrer"&gt;here&lt;/a&gt; and explore data block examples &lt;a href="https://hub.continue.dev/explore/data" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Configure data destinations in the &lt;a href="https://docs.continue.dev/yaml-reference#data" rel="noopener noreferrer"&gt;data&lt;/a&gt; section of config.yaml.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why This Matters
&lt;/h2&gt;

&lt;p&gt;The block-based approach isn't just technical; it fundamentally shifts how we view AI coding assistants. Instead of a mysterious code generator, it offers a transparent, customizable toolset.&lt;/p&gt;

&lt;p&gt;This modular approach allows you to:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Customize your assistant for specific languages or frameworks.&lt;/li&gt;
&lt;li&gt;Swap components as better models emerge.&lt;/li&gt;
&lt;li&gt;Understand how the assistant makes suggestions.&lt;/li&gt;
&lt;li&gt;Build trust through transparency.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  The Future is Composable
&lt;/h2&gt;

&lt;p&gt;I'm thrilled by continue.dev's alignment with the Unix philosophy: tools should excel at one task and integrate via simple interfaces. By breaking down the assistant into seven blocks—Models, Context, Docs, MCP Servers, Rules, Prompts, and Data—continue.dev enables specialized assistants for diverse tasks.&lt;/p&gt;

&lt;p&gt;Want a Python refactoring whiz? Combine retrieval blocks that understand Python idioms with transformation blocks for refactoring. Need documentation help? Mix generation blocks with retrieval blocks tailored to your team's style guide.&lt;/p&gt;

&lt;h2&gt;
  
  
  Build Your Own Assistant
&lt;/h2&gt;

&lt;p&gt;The power of continue.dev is that it puts you in control. Instead of relying on commercial assistants, you can create the perfect assistant by combining these seven building blocks. Understanding them is crucial for an AI coding assistant that truly boosts your workflow.&lt;/p&gt;

&lt;p&gt;If you prefer not to start from scratch, remix mine from my Continue profile:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hub.continue.dev/bdougie" rel="noopener noreferrer"&gt;https://hub.continue.dev/bdougie&lt;/a&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>llm</category>
      <category>coding</category>
    </item>
    <item>
      <title>Measuring Successful Communities in Open Source</title>
      <dc:creator>Brian Douglas</dc:creator>
      <pubDate>Thu, 25 Apr 2024 07:00:00 +0000</pubDate>
      <link>https://forem.com/opensauced/measuring-successful-communities-in-open-source-4ep9</link>
      <guid>https://forem.com/opensauced/measuring-successful-communities-in-open-source-4ep9</guid>
      <description>&lt;h2&gt;
  
  
  Open Source Insights
&lt;/h2&gt;

&lt;p&gt;There is no community tool that will replace building meaningful connections. Working in open source can be challenging to track and measure. Identifying what is success in a project can be hand-wavy and is sometimes met with a focus on the wrong metric. Organizations like the CHAOSS give us a lot of metrics, but no direction. There is currently no definitive statement on what success looks like in open source, but I have a few opinions to share. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://oss.fyi/remix" rel="noopener noreferrer"&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%2Fkpb2blef4sev1xx1mdxb.png" alt="data on the react-router" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://oss.fyi/remix" rel="noopener noreferrer"&gt;oss.fyi/remix&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In a recent talk I gave on discovering unconventional metrics, I outlined the overlooked metrics of new outside contributors and company representation.  &lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/V91M6vs11RY"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h3&gt;
  
  
  New issues show interest
&lt;/h3&gt;

&lt;p&gt;One key indicator of a thriving open source project is a consistent influx of new contributors opening issues. When a project regularly attracts new participants who are willing to invest their time in reporting bugs, suggesting improvements, or requesting features, it demonstrates the project's vitality and relevance to a growing community. &lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/0MeGKxjv3P4"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;The Kubernetes project learned this first hand 10 years ago (this July) when they saw several issues opened by Red Hat employees. Find that story in my conversation with Brendan Burns here.&lt;/p&gt;

&lt;p&gt;This cohort of engaged users, who may eventually become code contributors or long-term maintainers, is essential for the sustainability and growth of the project. By tracking the number of issues created by new authors over time, open source maintainers can gauge the success of their community-building efforts and the overall health of their project.&lt;/p&gt;

&lt;h3&gt;
  
  
  Open Source Contributors Metrics
&lt;/h3&gt;

&lt;p&gt;It is not enough to track issues; tracking how issues are uniquely created by outside contributors play a role in the success of a project. These individuals, who are not part of the core development team, represent connected companies and communities with an interest in the project. Their contributions help to enhance the project's functionality, usability, and accessibility. Moreover, outside contributors serve as ambassadors for the project, spreading awareness and attracting new users and developers to the community. By leaning into this metric, open source maintainers can ensure the long-term viability and impact of their project.&lt;/p&gt;

&lt;p&gt;The chart below highlights confidence for stargazers and forkers in the top 8 most popular JavaScript projects.&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%2F7fr6s5rl44h7qeiv9ujo.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%2F7fr6s5rl44h7qeiv9ujo.png" alt="contributor confidence" width="800" height="412"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A metrics we are testing internally now is the “Contributor Confidence,” the ability for an individual to contribute more than once. Open source generally over indexes on &lt;a href="https://opensauced.pizza/blog/good-first-issues-dont-exist" rel="noopener noreferrer"&gt;good first issues&lt;/a&gt;, but following the journey through repeat contributions tells a better story for health.&lt;/p&gt;

&lt;h3&gt;
  
  
  Tracking Success
&lt;/h3&gt;

&lt;p&gt;Open source is the bedrock for so many developing tools and companies, it would be paramount to figure this out so we can see the continued growth from the projects we depend on. &lt;/p&gt;

&lt;p&gt;Tools focused on measuring community tend to focus on drive-by interactions like forks and comments but rarely give a sense of what impact the project is providing. Now with the &lt;a href="https://www.crowd.dev/post/crowd-dev-acquired-by-the-linux-foundation" rel="noopener noreferrer"&gt;acquisitions of crowd.dev&lt;/a&gt; and &lt;a href="https://orbit.love/blog/orbit-is-joining-postman" rel="noopener noreferrer"&gt;orbit.love&lt;/a&gt; last week, I could not be more proud and validated that the path we are on for sustaining open source through meaningful metrics is needed more than ever. &lt;/p&gt;

&lt;p&gt;By focusing on open source projects, we're able to provide specialized insights that cut through the noise to give you the information you need for an impactful open source project.&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%2F3fqtaztd9njbr7ycdc1w.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%2F3fqtaztd9njbr7ycdc1w.png" alt="coming soon dashboard" width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Remember open source feels better when done together. Explore OpenSauced to discover how you can measure. Follow our &lt;a href="https://opensauced.pizza/changelog" rel="noopener noreferrer"&gt;changelog&lt;/a&gt; for updates as we ship more metrics to our workspaces. &lt;/p&gt;

</description>
      <category>opensource</category>
      <category>community</category>
    </item>
    <item>
      <title>Growth Hacking Killed GitHub Stars</title>
      <dc:creator>Brian Douglas</dc:creator>
      <pubDate>Wed, 10 Apr 2024 23:28:12 +0000</pubDate>
      <link>https://forem.com/opensauced/growth-hacking-killed-github-stars-40on</link>
      <guid>https://forem.com/opensauced/growth-hacking-killed-github-stars-40on</guid>
      <description>&lt;p&gt;In 2023, I had a chat with Max Stoiber, CEO of Stellate, on &lt;a href="https://www.youtube.com/watch?v=zccUlq1As1o" rel="noopener noreferrer"&gt;a podcast to learn about his early success on GitHub&lt;/a&gt;. His first open-source project, &lt;a href="http://react-boilerplate/react-boilerplate" rel="noopener noreferrer"&gt;react-boilerplate/react-boilerplate&lt;/a&gt;, gained a whopping 10k stars in just one weekend after appearing on the homepage of Hacker News. This success led Max to drop out of university and create several other popular open-source projects, including &lt;a href="https://github.com/styled-components/styled-components" rel="noopener noreferrer"&gt;styled-components&lt;/a&gt;. This library accelerates the process of building styles in React components.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/zccUlq1As1o"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Nowadays, the number of projects hitting 10k stars is more common, inflating the overall number of GitHub Stars. Presently, GitHub has over 100 million users, but back when React Boilerplate started, GitHub had fewer than 10 million users. Getting 10k stars on a project seemed impossible, but with 10x the amount of users, the value of the GitHub Star has suffered from inflation. &lt;/p&gt;

&lt;p&gt;Looking back in 2023, the biggest projects with the highest star growth can attribute these star events to intentional marketing. Landing on the front page of Hacker News is still challenging, but tweeting your project's social card can return similar results. The industry has changed a lot in the last 10 years, and where there was a time when open source was driven by weekend code sessions, today open source is fueled by sustainable sponsorship and venture capital. This is not entirely a bad thing, as it provides a sustainable future for the biggest projects we get to use and love. &lt;/p&gt;

&lt;p&gt;The challenge in this new reality is defining what is worth looking at and whether GitHub Stars are still relevant for discovering projects worth your time. Correlating the best metric to identify projects to invest your time in depends on who has the biggest reach in a community. This seems contrary to how open source started and marks a shift in how we think about success in open source moving forward. These high growth moments are now indicators of big events like appearing on a subreddit or getting mentioned by a developer influencer on YouTube. &lt;/p&gt;

&lt;p&gt;A popular site to see your star growth is star-history and it has become a standard for sharing your GitHub Star growth hacking journey. They also link a post on "&lt;a href="https://star-history.com/blog/playbook-for-more-github-stars" rel="noopener noreferrer"&gt;how to get more github stars.&lt;/a&gt;"&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/livecycle" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__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%2Forganization%2Fprofile_image%2F6511%2Fb7b80edd-2953-4dda-a9b2-90acf961448d.png" alt="Livecycle" width="800" height="800"&gt;
      &lt;div class="ltag__link__user__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%2F847384%2F8a9fc103-37e9-43b5-a8cd-274c2362d153.jpeg" alt="" width="800" height="800"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/livecycle/the-detailed-creative-playbook-for-more-github-stars-5fo5" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;The (Detailed &amp;amp; Creative) Playbook for Getting More GitHub Stars&lt;/h2&gt;
      &lt;h3&gt;Zevi Reinitz for Livecycle ・ Aug 14 '23&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#opensource&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#github&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#showdev&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#tutorial&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;Some notable projects with Star events in the last year include godot, daytona, plane, and zed. &lt;/p&gt;

&lt;h3&gt;
  
  
  Growth Hacking With GitHub Stars
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;godot/gotengine&lt;/strong&gt; capitalized on the Unity announcement on September 12th, of 2023, with their own announcements. At that time, they had been working on their tool for some time and already had a community they tapped into to share their open source alternative game engine. &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%2Fboo9bqkzg4xygv707w28.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%2Fboo9bqkzg4xygv707w28.png" alt="godot stars" width="800" height="307"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(note this chart is available on &lt;a href="https://oss.fyi/godot/" rel="noopener noreferrer"&gt;oss.fyi/godot&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;zed-industries/zed&lt;/strong&gt;, the successor to the atom editor built in rust, coordinated the launch for their repo with friends and trusted acquaintances to create a star event that registers as the edge of the graph. That, indeed, is a vertical line if I ever saw one. &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%2Fcfmtc4pjvo4aroa6d7wt.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%2Fcfmtc4pjvo4aroa6d7wt.png" alt="zed data" width="800" height="554"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;daytonaio/daytona&lt;/strong&gt;, a self hosted cloud developer environment, learn from its predecessors to become the most starred project for a few days. &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%2Fighylueofk3uh0a2nuyv.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%2Fighylueofk3uh0a2nuyv.png" alt="daytona data" width="800" height="554"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Finally, &lt;strong&gt;makeplane/plane&lt;/strong&gt; came into some heat when they posted their chart with unnamed competitors. The stars are valid, and the result of conscientious growth hacking. &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%2Fvexh6kgc4dwgf327ym1m.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%2Fvexh6kgc4dwgf327ym1m.png" alt="makeplane" width="800" height="534"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The open source community does not like to be sold and asking for a star is a low effort way for makers to grow and engage a community through open source. With that said, there are still a lot of open source maintainers and contributors who prefer not to participate in the process of growth hacking to gain GitHub Stars, and a lot of pushback came from engineers who built their careers on growing open source differently.&lt;/p&gt;

&lt;p&gt;The Plane team wrote up outlining their growth hacking journey in a follow up post to the &lt;a href="https://x.com/planepowers/status/1703627427946311832?s=20" rel="noopener noreferrer"&gt;original tweet&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1703627427946311832-751" src="https://platform.twitter.com/embed/Tweet.html?id=1703627427946311832"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1703627427946311832-751');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1703627427946311832&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(Read about their journey to 20k stars &lt;a href="https://plane.so/blog/how-we-got-to-20k-github-stars" rel="noopener noreferrer"&gt;here&lt;/a&gt;.)&lt;/em&gt; &lt;/p&gt;

&lt;h3&gt;
  
  
  The Problem with Open Source Star Inflation
&lt;/h3&gt;

&lt;p&gt;Now that we have established that stars are the metric for growth hacking, what is the metric for showing the project's health? In our opinion at OpenSauced, there is not one metric but a few and you can start aligning alongside stars. &lt;/p&gt;

&lt;p&gt;There is no doubt that thanks to growth hacking we are seeing GitHub Star hyper-inflation. Now, with currency inflation, it is encouraged to find alternative places to store your assets. Still, with GitHub being the home for open source, I don’t imagine a new stargazing like currency showing up anytime soon.&lt;/p&gt;

&lt;p&gt;Stars are not quite a representation of adoption, but if we look closer, we could correlate a combination of metrics to tell a bigger story:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Commit velocity is a quick way to see a project’s activity.&lt;/li&gt;
&lt;li&gt;Stars are a quick way to see early interest, but there is no correlation.
&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%2Fdtm74s7hwlf86fct7cq7.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%2Fdtm74s7hwlf86fct7cq7.png" alt="commits and stars" width="800" height="352"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;_Above is a star and commit velocity charts in grafana for the makeplane/plane project. &lt;br&gt;
_&lt;br&gt;
There is a shift happening in open source, and I think it would be unfair to not recognize the folks that built projects that made this ecosystem, the same ecosystem that makes it so easy to become an overnight (over a few months) success.  &lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/0MeGKxjv3P4"&gt;
&lt;/iframe&gt;
&lt;br&gt;
In a conversation with &lt;a&gt;Brendan Burns on that same podcast&lt;/a&gt;, I learned that early Kubernetes used issue counts to measure interest and pull requests to assess adoption. Taking it a step further, you can see a correlation from forks to stars.&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%2Fnuwproghduvxgasqrz2j.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%2Fnuwproghduvxgasqrz2j.png" alt="stars and forks" width="800" height="356"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The chart above is the correlation between stars and forks.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Based on my conversation with Brendan this correlates to adoption and when you really dig in you will find that with plane being so new, their contributions made exclusively form plane from employees, with the exception of one contribution from a developer member of the French Government. Perhaps a sign of adoption starting with them.&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%2Fdv68dw25lizordjw7e4d.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%2Fdv68dw25lizordjw7e4d.png" alt="contributors for plane" width="800" height="429"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The logical next step is to examine contributions from organizations and determine if there's a solid star-to-PR pipeline. If you're keen on monitoring your star-to-PR pipeline, consider setting up a workspace on OpenSauced to begin uncovering valuable engagement insights.&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%2Fwvikzjlfpeub5u85bww4.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%2Fwvikzjlfpeub5u85bww4.png" alt="growth hack workspace" width="800" height="448"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(&lt;a href="https://oss.fyi/growthhack" rel="noopener noreferrer"&gt;oss.fyi/growthhack&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;As the open source landscape evolves and GitHub Stars continue to inflate, it's essential for developers and contributors to consider multiple metrics when evaluating the health and success of a project. &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%2Fq9i9s41jjufqz8yatspp.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%2Fq9i9s41jjufqz8yatspp.png" alt="engagement metrics" width="800" height="105"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;By looking at commit velocity, issue counts, pull requests, and forks alongside stars, we can better understand a project's adoption and overall value. Let's continue to support the open-source community by focusing on meaningful contributions and nurturing authentic engagement, ensuring that we maintain the integrity that makes open source so special.&lt;/p&gt;

&lt;p&gt;If you have some metrics you feel are a better focus on measuring open source success, consider leaving us some &lt;a href="http://oss.fyi/feedback" rel="noopener noreferrer"&gt;feedback&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>github</category>
    </item>
    <item>
      <title>AI Grant Traction in OSS Startups</title>
      <dc:creator>Brian Douglas</dc:creator>
      <pubDate>Fri, 02 Feb 2024 01:35:19 +0000</pubDate>
      <link>https://forem.com/opensauced/ai-grant-traction-in-oss-startups-20aa</link>
      <guid>https://forem.com/opensauced/ai-grant-traction-in-oss-startups-20aa</guid>
      <description>&lt;p&gt;Last year Nat Friedman and Daniel Gross kicked off the AI Grant and have incubated 60 companies with the pre-seed and seed funding. &lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1752831181677305952-390" src="https://platform.twitter.com/embed/Tweet.html?id=1752831181677305952"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1752831181677305952-390');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1752831181677305952&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;Applications are open once again and I was curious to see what open source projects benefited from participating in the previous batches. My thesis is that open source provides an organic opportunity for growth and traction for AI startups. &lt;/p&gt;

&lt;p&gt;This list was put together by tracking all public GitHub organizations that took AI Grant funding on OpenSauced. There I was able to quickly see project activity and which projects have an open source developer community alongside that matches up with the traction and engagement.&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%2Fz1i1c5dzlegobxgd1gqd.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%2Fz1i1c5dzlegobxgd1gqd.png" alt="insight page on opensauced" width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The OpenSauced AI Grant recipient list is public and viewable &lt;a href="https://oss.fyi/aigrant" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Rowy
&lt;/h2&gt;

&lt;p&gt;You know, Rowy is open-source, and it's not just for developers. I always tell this story when I start working with new engineering teams. I once built an entire database for my employer's marketing site using Google Docs and a bunch of code. Only later did I discover that companies were offering this as a service - they're called CMSs! Thankfully, I survived my over-engineering days, and now there's an even better solution: using a spreadsheet-like interface to manage a database without even realizing it.&lt;/p&gt;

&lt;p&gt;What's cool about Rowy is that it opens up your database to the rest of your team since they probably already know how to use a spreadsheet. Low-code tools are getting more popular by the day, and Rowy stands out by using GPT-3 to generate projects and workflows.&lt;/p&gt;

&lt;p&gt;Not too long ago, Rowy launched BuildShip, which takes things up a notch by helping users create workflows for no-code tools. You might think that no-code tools come with limitations and lock-ins, but BuildShip is here to change that. It's compatible with over a million npm packages and offers one-click deployment options to various cloud platforms like AWS and Azure.&lt;/p&gt;

&lt;p&gt;Rowy has been around for a few years and it looks like the majority of the recent contributions still mostly come from their cofounders (marked in OpenSauced as maintainers), but it seems like they have decent traction with over 5k stars and almost 500 forks. &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%2F2m4i9dexqf6t0rnbldwp.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%2F2m4i9dexqf6t0rnbldwp.png" alt="rowy contributors on opensauced" width="800" height="187"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While searching through their GitHub repo, I saw they engage the community by allowing them to upvote items on the &lt;a href="https://roadmap.rowy.io/roadmap" rel="noopener noreferrer"&gt;roadmap&lt;/a&gt;. This seems like a clever way to build a highly engaged userbase, and it shows. &lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/rowyio" rel="noopener noreferrer"&gt;
        rowyio
      &lt;/a&gt; / &lt;a href="https://github.com/rowyio/rowy" rel="noopener noreferrer"&gt;
        rowy
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Low-code backend platform. Manage database on spreadsheet-like UI and build cloud functions workflows in JS/TS, all in your browser.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;a href="https://www.rowy.io/" rel="nofollow noopener noreferrer"&gt;
&lt;img width="100%" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F307298%2F218350866-cfd7c011-2247-4074-8b1d-06c26a4d0b96.png"&gt;
&lt;/a&gt;
&lt;div class="markdown-heading"&gt;
&lt;h4 class="heading-element"&gt;
✨ Airtable-like UI for managing database ✨ Build any automation, with or without code ✨
&lt;/h4&gt;
&lt;/div&gt;
&lt;p&gt;
Connect to your database and create Cloud Functions in low-code - without leaving your browser.&lt;br&gt;
Focus on building your apps
Low-code for Firebase and Google Cloud
&lt;/p&gt;

&lt;div&gt;
&lt;p&gt;&lt;a href="https://discord.gg/fjBugmvzZP" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/21db54dacec974142766acff6d7413b8eb8b64fa5a3fd5c14fef4ba0a131e3f6/68747470733a2f2f646362616467652e76657263656c2e6170702f6170692f7365727665722f666a4275676d767a5a50" alt="Rowy Discord"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;
    &lt;a href="http://www.rowy.io" rel="nofollow noopener noreferrer"&gt;&lt;b&gt;Website&lt;/b&gt;&lt;/a&gt; •
    &lt;a href="http://docs.rowy.io" rel="nofollow noopener noreferrer"&gt;&lt;b&gt;Documentation&lt;/b&gt;&lt;/a&gt; •
    &lt;a href="https://discord.gg/fjBugmvzZP" rel="nofollow noopener noreferrer"&gt;&lt;b&gt;Chat with us&lt;/b&gt;&lt;/a&gt; • 
    &lt;a href="https://twitter.com/rowyio" rel="nofollow noopener noreferrer"&gt;&lt;b&gt;Twitter&lt;/b&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/rowyio/rowy/commits/rc" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/f16e3c41fc0ec0202f070e6a9a431f1bd2e4bcd72ef6814b75a0bf0e6ff3d3d5/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6173742d636f6d6d69742f726f7779696f2f726f77792f7263" alt="Last commit"&gt;&lt;/a&gt;
&lt;a href="https://github.com/rowyio/rowy/stargazers/" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/2cf27c3158dc59ff2ba02e03a4f03cfd934aaeecaf8f63bd60ac90ed28cccc6b/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f73746172732f726f7779696f2f726f7779" alt="GitHub stars"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Live Demo 🛝&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;💥 Explore Rowy on &lt;a href="https://demo.rowy.io/" rel="nofollow noopener noreferrer"&gt;live demo playground&lt;/a&gt; 💥&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features ✨&lt;/h2&gt;

&lt;/div&gt;


  
    
    

    &lt;span class="m-1"&gt;20211004-RowyWebsite.mp4&lt;/span&gt;
    
  

  

  


&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Powerful spreadsheet interface for Firestore&lt;/h3&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;CMS for Firestore&lt;/li&gt;
&lt;li&gt;CRUD operations&lt;/li&gt;
&lt;li&gt;Bulk import or export data - csv, json, tsv&lt;/li&gt;
&lt;li&gt;Sort and filter by row values&lt;/li&gt;
&lt;li&gt;Lock, Freeze, Resize, Hide and Rename columns&lt;/li&gt;
&lt;li&gt;Multiple views for the same collection&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Automate with cloud functions and ready made extensions&lt;/h3&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Build cloud functions workflows on field level data changes
&lt;ul&gt;
&lt;li&gt;Use any NPM modules or APIs&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Connect to your favourite tool with pre-built code blocks or create your own

&lt;ul&gt;
&lt;li&gt;SendGrid, Algolia, Twilio, Bigquery and more&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Rich and flexible data fields&lt;/h3&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://docs.rowy.io/field-types/supported-fields" rel="nofollow noopener noreferrer"&gt;30+&lt;/a&gt;…&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/rowyio/rowy" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Stats from the repo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⭐ 5.5k&lt;/li&gt;
&lt;li&gt;👀 58&lt;/li&gt;
&lt;li&gt;Forks: 457&lt;/li&gt;
&lt;li&gt;License: Apache-2.0&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Replicate
&lt;/h2&gt;

&lt;p&gt;Replicate allows you to run machine learning models using a cloud API without needing to be an expert in machine learning or infrastructure management. You can run open-source models published by others, or package and publish your own, either publicly or privately. The great part is that many of these models are open-source on GitHub, making it an excellent resource for learning.&lt;/p&gt;

&lt;p&gt;Think of cogs as GitHub repositories that you host on Replicate for private or public use in your projects. Managing and hosting ML models can take several paths, most of which require a strong background in MLOps, which can be intimidating for beginners.&lt;/p&gt;

&lt;p&gt;With Replicate, you can explore hosted cogs and easily integrate them into your project with just a few lines of code. I highly recommend browsing through some hosted models for inspiration for your AI side project.&lt;br&gt;
Explore some hosted replicate cogs&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%2Fcxamidl8jkfpxhh0xync.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%2Fcxamidl8jkfpxhh0xync.png" alt="replicate contributors on opensauced" width="800" height="298"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A number of the example cogs are made from &lt;a href="https://app.opensauced.pizza/user/zeke?tab=contributions" rel="noopener noreferrer"&gt;Zeke&lt;/a&gt; the founding Designer at Replicate.  Thanks to cog model, the approach towards contribution to the Replicate open source project is really approachable and will be a driving force for more users adopting shared models on their platform. &lt;/p&gt;

&lt;p&gt;The secret sauce for a lot of open source is making the project extensible and cogs are proving that model. Their community is growing fast and onboarding new hosted cogs every day, some with up to 100k runs. &lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/replicate" rel="noopener noreferrer"&gt;
        replicate
      &lt;/a&gt; / &lt;a href="https://github.com/replicate/cog" rel="noopener noreferrer"&gt;
        cog
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Containers for machine learning
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Cog: Containers for machine learning&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;Cog is an open-source tool that lets you package machine learning models in a standard, production-ready container.&lt;/p&gt;
&lt;p&gt;You can deploy your packaged model to your own infrastructure, or to &lt;a href="https://replicate.com/" rel="nofollow noopener noreferrer"&gt;Replicate&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Highlights&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;📦 &lt;strong&gt;Docker containers without the pain.&lt;/strong&gt; Writing your own &lt;code&gt;Dockerfile&lt;/code&gt; can be a bewildering process. With Cog, you define your environment with a &lt;a href="https://github.com/replicate/cog#how-it-works" rel="noopener noreferrer"&gt;simple configuration file&lt;/a&gt; and it generates a Docker image with all the best practices: Nvidia base images, efficient caching of dependencies, installing specific Python versions, sensible environment variable defaults, and so on.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;🤬️ &lt;strong&gt;No more CUDA hell.&lt;/strong&gt; Cog knows which CUDA/cuDNN/PyTorch/Tensorflow/Python combos are compatible and will set it all up correctly for you.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;✅ &lt;strong&gt;Define the inputs and outputs for your model with standard Python.&lt;/strong&gt; Then, Cog generates an OpenAPI schema and validates the inputs and outputs with Pydantic.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;🎁 &lt;strong&gt;Automatic HTTP prediction server&lt;/strong&gt;: Your model's types are used…&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/replicate/cog" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;Stats from the repo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⭐ 6.4k&lt;/li&gt;
&lt;li&gt;👀 62&lt;/li&gt;
&lt;li&gt;Forks: 434&lt;/li&gt;
&lt;li&gt;License: Apache-2.0&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Chroma
&lt;/h2&gt;

&lt;p&gt;Every time we've experienced a major shift in computing - from mainframes to PCs, the web, mobile devices, and the cloud - we've seen the birth of a new software stack. In this latest stack, AI takes charge of the application logic layer. It's programmed using natural language, and it's incredibly flexible. But there's more to the story than just logic - we can't forget about memory.&lt;/p&gt;

&lt;p&gt;To handle the memory, storage, and state layers, we need a completely new approach: AI programmable memory. This goes beyond simply storing and fetching information; it actually determines what info is accessible to the AI. This is crucial for making AI systems reliable, controllable, easy to understand, and safe.&lt;/p&gt;

&lt;p&gt;Enter Vector Databases: these specialized databases are designed to efficiently store, manage, and work with high-dimensional vector data. They're not like your traditional databases with tables or documents - instead, Vector Databases use mathematical representations of data points in multi-dimensional space. This makes searching and retrieving information faster and more accurate, especially when dealing with huge data sets or complex queries.&lt;/p&gt;

&lt;p&gt;By taking advantage of advanced indexing and search algorithms, Vector Databases boost the performance and scalability of AI applications. They're an essential ingredient for developing next-gen AI systems, and that's where Chroma comes in. It's a Vector Database that lets users create LLMs (Language Learning Models) to power intuitive AI experiences for their users.&lt;/p&gt;

&lt;p&gt;I recently sat down with one of the Chroma founders to discuss their unique position in the space and how they stand out from other solutions.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/BqKUOKMkdic"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Their secret sauce seems to make vector searching and building knowledge bases accessible. Not only do they work in Python, a well-known language for AI/ML, but they also have JavaScript and Rust SDKs supported by the community. &lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/chroma-core" rel="noopener noreferrer"&gt;
        chroma-core
      &lt;/a&gt; / &lt;a href="https://github.com/chroma-core/chroma" rel="noopener noreferrer"&gt;
        chroma
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      the AI-native open-source embedding database
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;
  &lt;a href="https://trychroma.com" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F891664%2F227103090-6624bf7d-9524-4e05-9d2c-c28d5d451481.png" alt="Chroma logo"&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
    &lt;b&gt;Chroma - the open-source embedding database&lt;/b&gt;. &lt;br&gt;
    The fastest way to build Python or JavaScript LLM apps with memory
&lt;/p&gt;

&lt;p&gt;
  &lt;a href="https://discord.gg/MMeYNTmh3x" rel="nofollow noopener noreferrer"&gt;
      &lt;img src="https://camo.githubusercontent.com/01d211f1d40f089b71a8c5586ecec74afc4c7fa422e6d34f8810552125592faf/68747470733a2f2f696d672e736869656c64732e696f2f646973636f72642f313037333239333634353330333739353734323f63616368655365636f6e64733d33363030" alt="Discord"&gt;
  &lt;/a&gt; |
  &lt;a href="https://github.com/chroma-core/chroma/blob/master/LICENSE" rel="noopener noreferrer"&gt;
      &lt;img src="https://camo.githubusercontent.com/0b63d0200a41fb43c1c31141910688f8fada098562d7e8361f6672e8c683c216/68747470733a2f2f696d672e736869656c64732e696f2f7374617469632f76313f6c6162656c3d6c6963656e7365266d6573736167653d41706163686520322e3026636f6c6f723d7768697465" alt="License"&gt;
  &lt;/a&gt; |
  &lt;a href="https://docs.trychroma.com/" rel="nofollow noopener noreferrer"&gt;
      Docs
  &lt;/a&gt; |
  &lt;a href="https://www.trychroma.com/" rel="nofollow noopener noreferrer"&gt;
      Homepage
  &lt;/a&gt;
&lt;/p&gt;

&lt;div class="highlight highlight-source-shell notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;pip install chromadb &lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; python client&lt;/span&gt;
&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; for javascript, npm install chromadb!&lt;/span&gt;
&lt;span class="pl-c"&gt;&lt;span class="pl-c"&gt;#&lt;/span&gt; for client-server mode, chroma run --path /chroma_db_path&lt;/span&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;The core API is only 4 functions (run our &lt;a href="https://colab.research.google.com/drive/1QEzFyqnoFxq7LUGyP1vzR4iLt9PpCDXv?usp=sharing" rel="nofollow noopener noreferrer"&gt;💡 Google Colab&lt;/a&gt; or &lt;a href="https://replit.com/@chroma/Chroma-Pluggable-knowledge-for-AI?v=1" rel="nofollow noopener noreferrer"&gt;Replit template&lt;/a&gt;):&lt;/p&gt;
&lt;div class="highlight highlight-source-python notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;&lt;span class="pl-k"&gt;import&lt;/span&gt; &lt;span class="pl-s1"&gt;chromadb&lt;/span&gt;
&lt;span class="pl-c"&gt;# setup Chroma in-memory, for easy prototyping. Can add persistence easily!&lt;/span&gt;
&lt;span class="pl-s1"&gt;client&lt;/span&gt; &lt;span class="pl-c1"&gt;=&lt;/span&gt; &lt;span class="pl-s1"&gt;chromadb&lt;/span&gt;.&lt;span class="pl-c1"&gt;Client&lt;/span&gt;()
&lt;span class="pl-c"&gt;# Create collection. get_collection, get_or_create_collection, delete_collection also available!&lt;/span&gt;
&lt;span class="pl-s1"&gt;collection&lt;/span&gt; &lt;span class="pl-c1"&gt;=&lt;/span&gt; &lt;span class="pl-s1"&gt;client&lt;/span&gt;.&lt;span class="pl-c1"&gt;create_collection&lt;/span&gt;(&lt;span class="pl-s"&gt;"all-my-documents"&lt;/span&gt;)

&lt;span class="pl-c"&gt;# Add docs to the collection. Can also update and delete. Row-based API coming soon!&lt;/span&gt;
&lt;span class="pl-s1"&gt;collection&lt;/span&gt;.&lt;span class="pl-c1"&gt;add&lt;/span&gt;(
    &lt;span class="pl-s1"&gt;documents&lt;/span&gt;&lt;span class="pl-c1"&gt;=&lt;/span&gt;[&lt;span class="pl-s"&gt;"This is document1"&lt;/span&gt;, &lt;span class="pl-s"&gt;"This is document2"&lt;/span&gt;], &lt;span class="pl-c"&gt;# we handle tokenization, embedding, and indexing automatically. You can skip that and add your own embeddings as well&lt;/span&gt;
    &lt;span class="pl-s1"&gt;metadatas&lt;/span&gt;&lt;span class="pl-c1"&gt;=&lt;/span&gt;[{&lt;span class="pl-s"&gt;"source"&lt;/span&gt;: &lt;span class="pl-s"&gt;"notion"&lt;/span&gt;&lt;/pre&gt;…
&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/chroma-core/chroma" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;Stats from the repo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⭐ 10.8k&lt;/li&gt;
&lt;li&gt;👀 73&lt;/li&gt;
&lt;li&gt;Forks: 882&lt;/li&gt;
&lt;li&gt;License: Apache-2.0&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Submit to the AI Grant
&lt;/h2&gt;

&lt;p&gt;Gaining traction for startups can be even more challenging than building a project. Securing funding and exposure creates a win-win situation, and these projects have all benefited from being accessible to the open-source community. My thesis on open-source is validated as AI startups gain significant traction by making their projects open and extending them to the community.&lt;/p&gt;

&lt;p&gt;If you are considering building or launching an AI project in 2024, I recommend considering &lt;a href="https://aigrant.com/" rel="noopener noreferrer"&gt;submitting for the AI Grant before the deadline&lt;/a&gt;, February 16th. I wasn’t able to cover all open source projects that received a grant, but here a few more worth checking out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/runpod" rel="noopener noreferrer"&gt;RunPod&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/HumeAI" rel="noopener noreferrer"&gt;Hume&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/Coframe/coffee" rel="noopener noreferrer"&gt;Coframe&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And if you like to see the longer list of previous open source submissions checkout &lt;a href="https://oss.fyi/aigrant" rel="noopener noreferrer"&gt;oss.fyi/aigrant&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Resume Driven Contributions</title>
      <dc:creator>Brian Douglas</dc:creator>
      <pubDate>Thu, 25 Jan 2024 17:23:00 +0000</pubDate>
      <link>https://forem.com/opensauced/resume-driven-contributions-31ed</link>
      <guid>https://forem.com/opensauced/resume-driven-contributions-31ed</guid>
      <description>&lt;p&gt;10 years ago my open source journey started with an email to a maintainer because I really wanted to use his library but could not figure out how to code myself out of a simple error. I was given a ton of grace and returned the favor of the maintainers' patience that unblocked me by shipping a few documentation pull requests to make sure future developers could benefit. &lt;/p&gt;

&lt;p&gt;I have been involved in open source either directly or adjacently since that first PR. During my tenure in open source I kicked off the open source curriculum at a bootcamp where students would make legit contributions projects and learn from the experiences I lived through. Today the need for developers and bootcamps graduates looking for opportunities for contribution to open source projects has risen. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;The U.S. Bureau of Labor Statistics (BLS) projects that there will be roughly 162,900 vacancies for software engineers over the decade between 2021 to 2031.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The challenge is that these opportunities can be hard to come by and we are now seeing the industry asking, “Should I contribute to open source to level up my resume?” I will answer that and more in this blog post, but first let’s break down this opportunity.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Opportunities You Make
&lt;/h2&gt;

&lt;p&gt;Based a &lt;a href="https://twitter.com/t3dotgg/status/1739833869724160352" rel="noopener noreferrer"&gt;recent Twitter thread&lt;/a&gt;, finding open source opportunities for the sake of leveling up one’s resume proved to be a hot topic. Thanks to the recent record number of layoffs in 2022 and 2023, I see a trend for more folks looking to make contributions. The 6-figure salary question is now, “Where are the best places to find good first issues?” I recently saw that due to some contributor frustration in normal subreddits, folks are considering &lt;a href="https://www.reddit.com/r/opensource/comments/197yymt/is_there_interest_in_a_subredit_named/" rel="noopener noreferrer"&gt;making a subreddit to share insider knowledge to get contributions into open source&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;In a previous post, I mentioned that good first issues do not exist and the best way to contribute is by creating an issue. I believe that contributors find more opportunities for contribution when they find a bug or issue for a project. They are in a better place to make a contribution than if one is handed to them. &lt;/p&gt;

&lt;p&gt;As Dax says, “Contributing to oss is a side effect of using OSS.” If you are looking for the hand out or a good first issue, you are approaching the problem backwards. Opportunities in open source are the ones you make by using open source. Try your hand at using the project and challenge yourself to be a power user. &lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1739837931127284121-539" src="https://platform.twitter.com/embed/Tweet.html?id=1739837931127284121"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1739837931127284121-539');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1739837931127284121&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;h2&gt;
  
  
  The Best Contributors Are Power Users
&lt;/h2&gt;

&lt;p&gt;When chatting with JJ from the Next.js core team, I learned about his interest in the project during the early days. His curiosity was met with opportunity as he leveled up his own skills by taking the opportunity to work on the framework issues. This opportunity only presented itself thanks to his desire to learn more about React, JJ chose Next.js for every project while working on consulting projects. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://www.youtube.com/watch?v=bpI50u2qxJU&amp;amp;list=PLHyZ0Wz_A44VR4BXl_JOWSecQeWcZ-kS3&amp;amp;index=12" rel="noopener noreferrer"&gt;JJ's story&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;His interest got noticed by the small core team and earned him a job via the DMs. JJ mentions that this experience was the one that earned him the job he has today, maintainer on the Next.js project at Vercel. Though past performance is a predictor of future growth, I chat with contributors and maintainers to learn the secret sauce for finding these opportunities. In this case, the opportunity to build a network from open source contributions.&lt;/p&gt;

&lt;h2&gt;
  
  
  Building a Strong Network Through Open Source Contributions
&lt;/h2&gt;

&lt;p&gt;Contributing to open source projects not only helps you level up your skills but also allows you to build a strong network within the developer community. As you work on various projects, you'll have the opportunity to collaborate with other developers, maintainers, and users. This collaboration fosters a sense of camaraderie and helps you establish connections with like-minded individuals.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/TL7pUROYEIk"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;By actively participating in discussions, submitting pull requests, and providing valuable feedback, you demonstrate your expertise and commitment to the project. This can lead to recognition within the community, which can open doors to new opportunities, such as speaking engagements, job offers, or even invitations to join other projects.&lt;/p&gt;

&lt;p&gt;Moreover, your contributions to open source projects are visible to potential employers and collaborators, showcasing your skills and experience in a tangible way. This can help you stand out in the job market and make it easier for others to reach out to you for collaboration or mentorship.&lt;/p&gt;

&lt;p&gt;Contributing to open source projects not only enhances your resume but also helps you build a strong network within the developer community, leading to new opportunities and connections that can propel your career forward.&lt;/p&gt;

&lt;h2&gt;
  
  
  Should you contribute to open source to level up the resume?
&lt;/h2&gt;

&lt;p&gt;Now back to the question at hand. If you are looking for a good first issue, then you have already missed out. The best contribution is the one who understands and lives to tell the story. When interviewing candidates for OpenSauced, I like to hear about the hard problems engineers face and hear stories about how they can persevere. OpenSauced is unique, we are open sourced and appreciate a good contribution story. But what is not unique is there are a bunch of engineers not doing open source and getting jobs. So if you want to leverage open source as your unfair advantage, make it an advantage by showing that you care about the success of the project and have a story to share. &lt;/p&gt;

&lt;p&gt;If you are not interested enough to become a power user, my recommendation is submit the resume and leave the open source for others to contribute to. &lt;/p&gt;

&lt;p&gt;But if you truly want to stand out in the hiring pool, stand out as a contributor. Try using open source projects with a critical eye for fixing problems for thousands of developers. Open source is not a necessity for getting a job, and should never be. Open source is an opportunity to try new things and approach new problems.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://app.opensauced.pizza/feed/948" rel="noopener noreferrer"&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%2Fd43xkzijepz7dko41r9y.png" alt="nick's opensauced highlight" width="800" height="822"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you are interested in discovering opportunities in open source and properly highlight your success in open source, then I encourage you to try OpenSauced.    &lt;/p&gt;

</description>
      <category>career</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Moneyball for engineers</title>
      <dc:creator>Brian Douglas</dc:creator>
      <pubDate>Wed, 06 Sep 2023 17:22:15 +0000</pubDate>
      <link>https://forem.com/opensauced/moneyball-for-engineers-4ki9</link>
      <guid>https://forem.com/opensauced/moneyball-for-engineers-4ki9</guid>
      <description>&lt;p&gt;A social post that went viral recently stated that if you are junior and not contributing to your green squares, you have no chance of getting a job. The tweet forced many developers with jobs to respond, but they need to respond to how hard it is to get a job today as a junior or laid-off mid-level developer. &lt;/p&gt;

&lt;p&gt;Right now, green squares represent someone's work in open source. Squares are not a representation of a developer's resume, and to further make the point, it is also confirmed by the defunkt co-creator of the contribution graph himself.&lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1687944148949811200-732" src="https://platform.twitter.com/embed/Tweet.html?id=1687944148949811200"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1687944148949811200-732');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1687944148949811200&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;So if the contribution graph is not a measurement of one's skill, are we left to become Creator X influencers in hopes of a giant paycheck from Elon instead of that sweet 6-figure engineering money? &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%2Fpbs.twimg.com%2Fmedia%2FF2_FbdYXsAAXlcQ%3Fformat%3Dpng%26name%3Dsmall" 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%2Fpbs.twimg.com%2Fmedia%2FF2_FbdYXsAAXlcQ%3Fformat%3Dpng%26name%3Dsmall" alt="Image" width="500" height="659"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;image credit &lt;a href="https://twitter.com/devagrawal09/status/1688785540286382080" rel="noopener noreferrer"&gt;devagrawal09 on x.com&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Building influence is a beautiful way to stand out, but in a market trending towards more layoffs, we can agree that an X following is not an excellent measurement of a developer's skill.&lt;/p&gt;

&lt;p&gt;I suggest we shift focus to Moneyball, a term popular because of Brad Pitt.&lt;/p&gt;

&lt;h2&gt;
  
  
  Moneyball for Engineers
&lt;/h2&gt;

&lt;p&gt;The concept of Moneyball emphasizes the use of advanced statistical analysis, particularly sabermetrics, to identify undervalued and overlooked players in Major League Baseball. The Oakland Athletics popularized this concept in 2002 to win 103 games.&lt;/p&gt;

&lt;p&gt;Like baseball, programming can apply frameworks to speed up the paths to success, ultimately leading to a sooner endgame. Developers looking at contribution graphs with a lot of green squares to one without a lot of greens is simply pattern matching. For a while, that was a great way to hire for your startup until it wasn't. &lt;/p&gt;

&lt;p&gt;The problem is that green squares are like home runs; the more you have, the more you are noticed, but once anyone looks closely, the deepest green of squares could be nothing but performance-enhancing cron jobs. &lt;/p&gt;

&lt;p&gt;&lt;iframe class="tweet-embed" id="tweet-1687912460848939008-963" src="https://platform.twitter.com/embed/Tweet.html?id=1687912460848939008"&gt;
&lt;/iframe&gt;

  // Detect dark theme
  var iframe = document.getElementById('tweet-1687912460848939008-963');
  if (document.body.className.includes('dark-theme')) {
    iframe.src = "https://platform.twitter.com/embed/Tweet.html?id=1687912460848939008&amp;amp;theme=dark"
  }



&lt;/p&gt;

&lt;p&gt;Green squares are a framework and they no longer hold value because they encourage the wrong metrics. Just like the introduction of the pitch clock, players need to adapt to stay relevant. Open source continually adapts and shifts with industry trends. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For those not aware, &lt;em&gt;In September 2022, Major League Baseball announced a new pitch timer that would significantly increase the speed at which the game is played.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;With new tools, languages, and frameworks coming out all the time—even the newest developers are months from achieving greatness with mentorship from suitable project veterans. &lt;/p&gt;

&lt;h2&gt;
  
  
  What's better than green squares?
&lt;/h2&gt;

&lt;p&gt;At OpenSauced, we have been working on a way to highlight a developer's skill and expertise. Just like looking at the back of the baseball card for stats, you should see the highlights of the developer pretty quickly. This is only our first pitch at this, but it is broader way to showcase your contributions (in open source). &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%2Fsdns0c3r81n5pf8zs2t4.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%2Fsdns0c3r81n5pf8zs2t4.png" alt="oss.fyi/bougie" width="800" height="561"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At this point, we can say that the data helps to show where people are participating, but the highlights show what they’re most proud of. &lt;/p&gt;

&lt;p&gt;Highlights allow contributors to share:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The work they’re most proud of.&lt;/li&gt;
&lt;li&gt;Their ability to clearly communicate their work and accomplishments.&lt;/li&gt;
&lt;li&gt;The ability to identify their most impactful work. &lt;/li&gt;
&lt;li&gt;They variety of work they’re doing. (Do you need a utility player? Someone that can write, create good issues, and PR like a boss? Or do you want someone who swings for the fences and is dependable for creating features in high-stakes situations?)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;em&gt;If you find your profile lacks contribution, get some quick hits by checking our&lt;/em&gt; &lt;a href="https://oss.fyi/100days" rel="noopener noreferrer"&gt;&lt;em&gt;#100daysofOSS&lt;/em&gt;&lt;/a&gt; &lt;em&gt;challenge to level yourself up quick&lt;/em&gt;&lt;em&gt;ly&lt;/em&gt;&lt;em&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;We’ve seen it time and again. Open source is more than code—it's a journey of growth and opportunity. Your contributions reverberate far beyond lines of code; they forge connections, foster mentorship, and move you towards new and unexpected pathways. So, keep collaborating, innovating, and contributing—because the world of open source is not just about code but the opportunities it unlocks for your personal and professional journey. For example, Sunday’s open source journey that led to his role at OpenSauced.&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%2Fozadw8zyz77yvvlw1nb1.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%2Fozadw8zyz77yvvlw1nb1.png" width="800" height="833"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Events like Hacktoberfest emphasize getting enough contributions within the month to earn a reward, but we need to develop the idea of a tangible reward. Part of it is the career, but it takes the journey to get there. You grow in skills, have the opportunity to learn together, build your reputation, and expand your network so that you’re never without a chance, support, and personal fulfillment.&lt;/p&gt;

&lt;p&gt;Look beyond the fences of open source and put yourself in a place to knock it out of the park. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://oss.fyi/100days" rel="noopener noreferrer"&gt;oss.fyi/100days&lt;/a&gt;&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>100daysofoss</category>
    </item>
    <item>
      <title>Practical advice for finding GitHub issues to work on</title>
      <dc:creator>Brian Douglas</dc:creator>
      <pubDate>Wed, 19 Jul 2023 16:53:41 +0000</pubDate>
      <link>https://forem.com/opensauced/practical-advice-for-finding-github-issues-to-work-on-2g4o</link>
      <guid>https://forem.com/opensauced/practical-advice-for-finding-github-issues-to-work-on-2g4o</guid>
      <description>&lt;p&gt;There is countless advice on finding projects and, eventually, GitHub Issues to work on, but it's mainly repeated content. I want to approach this with a new lens and focus on practical advice to make your next meaningful contribution to open source. &lt;/p&gt;

&lt;p&gt;Though prevalent advice, never look for good first issues first. Instead, connect with people. &lt;/p&gt;

&lt;p&gt;The best first contribution is saying "hello" in Discord. So for the sake of this guide, I'd recommend working on projects where you can chat with the maintainers and contributors. This cuts out a lot of noise and gets you focused on projects where you can get meaningful mentorship. Some small projects don't have discords and communities, and that's ok. I suggest focusing efforts on areas you can contribute, so if you are looking for projects to contribute, look at places with many active contributors and note what they are actively working on. &lt;/p&gt;

&lt;p&gt;In OpenSauced, you can create a custom insight page for projects you want to connect to. Check out that guide &lt;a href="https://youtu.be/w4qOfEzZzHw" rel="noopener noreferrer"&gt;here&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/w4qOfEzZzHw"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Practical Steps to Find Your Next Contribution
&lt;/h2&gt;

&lt;p&gt;Now if you already have the context of the project and the community, you are in a great place to start contributing. For the rest of this article, we will focus on practical advice on finding what to work on next. For those who want to know the context up front, below are the contribution areas I will recommend:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Running the project locally&lt;/li&gt;
&lt;li&gt;Improving the developer experience&lt;/li&gt;
&lt;li&gt;Establishing Credibility by Enhancing Documentation&lt;/li&gt;
&lt;li&gt;Considering performance &amp;amp; accessibility &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For the sake of providing practical advice, my examples will use the Astro project, but you should choose a project you are interested in for this exercise. &lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/withastro" rel="noopener noreferrer"&gt;
        withastro
      &lt;/a&gt; / &lt;a href="https://github.com/withastro/astro" rel="noopener noreferrer"&gt;
        astro
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      The web framework for content-driven websites. ⭐️ Star to support our work!
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Running the project locally
&lt;/h2&gt;

&lt;p&gt;This is a crucial step for anyone making code contributions or updating documentation about how to run and use the project and is often overlooked. It is impressive to meet a vegan butcher, but that is the outlier, not the norm. Be normal and try using the project first. By running the project locally, you learn more about the project, experience, and any challenges or surprises you might face.&lt;/p&gt;

&lt;p&gt;Make it a challenge to clone the project and run the test suite. Astro provides an "Open in Codespaces" button in the CONTRIBUTING.md, which gets there as fast as possible. If you get stuck or do not have context on a concept from that experience, find a person in the contributor community to share that context. &lt;/p&gt;

&lt;p&gt;The core project can be daunting, which is fine as well. There are countless Astro examples that you can perform the same tasks in. &lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/MicroWebStacks" rel="noopener noreferrer"&gt;
        MicroWebStacks
      &lt;/a&gt; / &lt;a href="https://github.com/MicroWebStacks/astro-examples" rel="noopener noreferrer"&gt;
        astro-examples
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Astro design patterns examples, client-server state management, markdown, caching
    &lt;/h3&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Improving the Developer Experience
&lt;/h2&gt;

&lt;p&gt;By using the project you're more likely to be able to improve the developer experience. Find any and every way to use Astro in a side project and run through the examples in the docs guide section. Astro already has a great guide and tutorials section that has been developed after months of feedback from folks like you. But the thing there is that after months things change. &lt;/p&gt;

&lt;p&gt;Try walking through the guides to gain knowledge about building an Astro project. If you learn something, share those insights with the community via DEV post. Your experience is unique, and it can be very hard to know what it's like learning a new technology the first time. &lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/opensauced" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__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%2Forganization%2Fprofile_image%2F2498%2Fa16cc27c-33f9-40b6-92a8-4a43f70a96ef.png" alt="OpenSauced" width="500" height="500"&gt;
      &lt;div class="ltag__link__user__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%2F345658%2Fa72b6b8b-b954-47fb-8919-ab380905f26b.jpg" alt="" width="800" height="1058"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/opensauced/devex-and-oss-elevating-developer-experience-through-open-source-collaboration-46j8" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;DevEx and OSS- Elevating Developer Experience through Open Source Collaboration&lt;/h2&gt;
      &lt;h3&gt;BekahHW for OpenSauced ・ Jul 3 '23&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#devex&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#career&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#opensource&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#devrel&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;Very few beginner guides for projects exist because many beginners believe that experienced community members already possess their insights. But the  beginner experience can only be shared once, making it the most valuable insight a new community member can provide.&lt;/p&gt;

&lt;p&gt;Most maintainers need more time for community support as the project grows. Community support and triage is one of the best ways to level up and learn ways to improve the developer experience for the project.&lt;/p&gt;

&lt;h2&gt;
  
  
  Establishing Credibility by Enhancing Documentation
&lt;/h2&gt;

&lt;p&gt;In the case of Astro, they have a docs site that includes instructions on how to use the project. There are two approaches to documentation that I'll cover here, documentation that improves how the information is shared and the necessary context provided and documentation that has to do with running and using the code.&lt;/p&gt;

&lt;p&gt;If you're adding to or revising the documentation that doesn't require you to have knowledge of the codebase, make sure you provide a clear reason for the revision or introduction to new information in the documentation. The maintainer should be able to see from the issue your write or your Pull Request description, which this is an important update to the documentation. &lt;/p&gt;

&lt;p&gt;For example, if you're reorganizing the documentation, provide a clear description of why the reorganization is necessary and will improve the developer experience. &lt;/p&gt;

&lt;p&gt;If you're making a contribution, I strongly suggest using the project first. If you haven't used due to a lack of context limitation, consider leveling yourself with context through a conversation with a community member or contributor. &lt;/p&gt;

&lt;p&gt;While using the project, note any unclear installation steps and weirdness in your environment. If you are running into errors, this is an opportunity to open an issue to confirm if this is isolated to you and your environment or impacting others. &lt;/p&gt;

&lt;p&gt;Search the issues for existing conversations before opening any new issues. Read through merged pull requests to understand the project's history and why some decisions were made. This is a great way to learn who are the decision makers too. &lt;/p&gt;

&lt;p&gt;Some issues regarding developer experience would be enhancements for the docs sites—one regarding improving Firebase Deploy.&lt;/p&gt;

&lt;p&gt;Stop looking at large projects and starting in a place that needs your help even more, smaller projects. Starting in a smaller project's README will likely lead to you finding areas for providing value much faster than searching endlessly through open issues in a large project. Support the little projects with your time if you have it. &lt;/p&gt;

&lt;p&gt;&lt;em&gt;note: If you say you will do something, provide an update at the end of the week. If you can't complete it, unassign yourself and provide an update for why.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If you do not experience issues, that is great. There are several technologies that Astro works alongside, and only some cases are covered in the documentation. Using the technology will eventually lead to discovering issues and perhaps good first issues you can approach.&lt;/p&gt;

&lt;p&gt;When writing this article, the Astro docs site has a recipe section, which includes instructions on how to deploy to various services. There is no section on how to deploy to Digital Ocean within that recipe section. &lt;/p&gt;

&lt;p&gt;I'll leave this for the reader's exercise, but that would be where I'd start: building a project in Astro,&lt;br&gt;
deploying the project to a production cloud host, and&lt;br&gt;&lt;br&gt;
leaving notes for the next person in a findable location-probably the documentation.&lt;/p&gt;
&lt;h2&gt;
  
  
  Considering performance &amp;amp; accessibility
&lt;/h2&gt;

&lt;p&gt;Once you have established credibility through content and building with Astro, I'd consider a meaningful change. I recommend not trying to add any new features but instead showing you care by looking into ways to improve the project's performance and accessibility. &lt;/p&gt;

&lt;p&gt;Astro has some integrations in accessibility and performance. Similar to the previous sections, the tool is the best way to understand. &lt;/p&gt;

&lt;p&gt;This requires time and even gives you a deeper understanding of the project without adding any new libraries, audit pages, and boot speeds. Identify if the project meets all standards in its documentation pages. Be genuinely helpful in places most others overlook. &lt;/p&gt;

&lt;p&gt;The goal here is to be intentional and not simply run a lighthouse audit with any practical or actionable advice. I suggest running an audit through an Astro example site or one you have built. Look for places for improvement where individuals learn how to use Astro. &lt;/p&gt;

&lt;p&gt;The documentation also has a section on &lt;a href="https://docs.astro.build/en/reference/integrations-reference/" rel="noopener noreferrer"&gt;how to build Astro integrations&lt;/a&gt;. Integrations and add-ons are a great place to explore providing value. Often, these enhancements live outside the repo you are trying to contribute, which makes for a great place to experiment and find things to work on. &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%2Fo089q0cky4tzlmpqaip2.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%2Fo089q0cky4tzlmpqaip2.png" alt="performance and accessibility integrations" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://astro.build/integrations?search=&amp;amp;categories%5B%5D=performance%2Bseo&amp;amp;categories%5B%5D=accessibility" rel="noopener noreferrer"&gt;https://astro.build/integrations&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Find an existing Astro example and leverage integration to identify areas of improvement by running a quick audit to provide that actionable insight.&lt;/p&gt;

&lt;p&gt;That wraps up this guide, but let's continue. You should look for ways to make an impact in open source beyond the green square. Consider pledging 100 days to this path and check out the &lt;code&gt;#100daysOfOSS&lt;/code&gt;. &lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/opensauced" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__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%2Forganization%2Fprofile_image%2F2498%2Fa16cc27c-33f9-40b6-92a8-4a43f70a96ef.png" alt="OpenSauced" width="500" height="500"&gt;
      &lt;div class="ltag__link__user__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%2F345658%2Fa72b6b8b-b954-47fb-8919-ab380905f26b.jpg" alt="" width="800" height="1058"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/opensauced/100daysofoss-growing-skills-and-real-world-experience-3o5k" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;#100DaysOfOSS: Growing Skills and Real-World Experience&lt;/h2&gt;
      &lt;h3&gt;BekahHW for OpenSauced ・ Jul 12 '23&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#opensource&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#github&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#career&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#challenge&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;If you have any other tips for how to start contributing. Leave a comment with them below.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>github</category>
    </item>
    <item>
      <title>Highlight Your Open Source Contributions</title>
      <dc:creator>Brian Douglas</dc:creator>
      <pubDate>Thu, 29 Jun 2023 15:07:58 +0000</pubDate>
      <link>https://forem.com/opensauced/highlight-your-open-source-contribution-4chd</link>
      <guid>https://forem.com/opensauced/highlight-your-open-source-contribution-4chd</guid>
      <description>&lt;p&gt;Having a portfolio of work to lean on is critical in this job market. The challenge folks face is highlighting their work on projects showcasing their ability to work successfully within organizations. &lt;/p&gt;

&lt;p&gt;I share practical ways to showcase your skills and open-source contributions in this post. &lt;/p&gt;

&lt;h2&gt;
  
  
  Make open-source contributions
&lt;/h2&gt;

&lt;p&gt;Open-source projects provide a public way to showcase your technical skills and expertise. Some guides and articles provide a path to contributing already. If you need an introduction to contributing, please check out this post from Bekah below:&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/opensauced" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__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%2Forganization%2Fprofile_image%2F2498%2Fa16cc27c-33f9-40b6-92a8-4a43f70a96ef.png" alt="OpenSauced" width="500" height="500"&gt;
      &lt;div class="ltag__link__user__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%2F345658%2Fa72b6b8b-b954-47fb-8919-ab380905f26b.jpg" alt="" width="800" height="1058"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/opensauced/open-source-101-a-beginners-guide-to-getting-started-37fb" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Open Source 101: A Beginner's Guide to Getting Started&lt;/h2&gt;
      &lt;h3&gt;BekahHW for OpenSauced ・ Jun 21 '23&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#opensource&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#beginners&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#codenewbie&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#learning&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;Years ago, I worked at a boot camp, crafted an apprenticeship for finding open-source projects to work on, and even mentored students to contribute to projects for the first time. I learned from that experience that finding good first issues and projects to work on takes most of the energy when contributing. &lt;/p&gt;

&lt;p&gt;I suggest following a different path entirely. &lt;strong&gt;Find someone who has contributed to open source&lt;/strong&gt; and talk to them directly. In fields requiring technical skill, an apprenticeship is the best setup for learning a trade. If you want to contribute to TypeScript projects, find someone who contributes to TypeScript projects and ask them questions. &lt;/p&gt;

&lt;p&gt;OpenSauced provides a &lt;a href="https://bit.ly/opensaucedai" rel="noopener noreferrer"&gt;chrome extension&lt;/a&gt; to discover GitHub users making contributions, and we are working on features to make those connections more accessible in the future. For now, reach out to folks for a quick DM or Zoom call, but I caution you to be intentional. I cannot overstate this enough; human interaction can take so much further beyond endless repo spelunking.&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%2Fbugikql3gre28srscr8l.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%2Fbugikql3gre28srscr8l.png" alt="Chrome extension" width="450" height="775"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you've already contributed to an open-source project, congrats. You are the perfect person for a new contributor to chat with. Please do us a favor and comment in the reply with your contribution. Please share your story so that we can highlight it with you. &lt;/p&gt;

&lt;h2&gt;
  
  
  Summarize your contribution with a pull request description.
&lt;/h2&gt;

&lt;p&gt;Your opportunity to shine is highlighting the knowledge you learned while solving a problem. I have seen a lot of first-time contributions, and I have also done a lot of technical screens for engineering candidates. My ask is always, “Please tell me about your approach.” The explanation is not for me but for you. We can confirm that code works thanks to AI and automated testing libraries, but I can’t ensure you know why and how the code works unless you explain it in the description. &lt;/p&gt;

&lt;p&gt;Most contributions happen in a vacuum, and after all that effort and work, you may never mention or reference it again—what a loss! &lt;/p&gt;

&lt;p&gt;Green squares eventually fade, and the contribution calendar looks hella empty on January 1st every year. Instead of forgetting your good prune git history, please share it. There is a way to highlight that contribution that makes you more discoverable and quickly recalled when presenting your accomplishments in a job interview or reciting commits during a conference talk. &lt;/p&gt;

&lt;p&gt;If you do not know what to put in your PR description, consider checking out Sunday's post:&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/opensauced" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__org__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%2Forganization%2Fprofile_image%2F2498%2Fa16cc27c-33f9-40b6-92a8-4a43f70a96ef.png" alt="OpenSauced" width="500" height="500"&gt;
      &lt;div class="ltag__link__user__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%2F990945%2F23f68e29-be5b-40fd-85b0-4e246fabda19.jpeg" alt="" width="460" height="460"&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/opensauced/leveraging-opensauced-ai-to-generate-compelling-pr-descriptions-5h85" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Leveraging OpenSauced AI to Generate Compelling PR Descriptions&lt;/h2&gt;
      &lt;h3&gt;OGBONNA SUNDAY for OpenSauced ・ Jun 7 '23&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#opensource&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#openai&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#github&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#productivity&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;p&gt;There is a belief that the code is the best description, and there is no real need for a pr description. As developers, we sometimes must remember to celebrate wins and share stories about code merging. From my experience, the best developers I have worked with are the ones that educate me about the code they write. I get better, and the team gets better because of it. &lt;/p&gt;

&lt;h2&gt;
  
  
  Share your highlights with the world.
&lt;/h2&gt;

&lt;p&gt;After the contribution is merged, consider writing a DEV post about the experience. In the OpenSauced platform, we offer a feature called highlights, which you can consider the step before you DEV post. &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%2Fj5n9ds35obko8iuh5bwy.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%2Fj5n9ds35obko8iuh5bwy.png" alt="Brandon's highlight" width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;a href="https://insights.opensauced.pizza/feed/199" rel="noopener noreferrer"&gt;https://insights.opensauced.pizza/feed/199&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I also mentioned reaching out to folks who have contributed already. The &lt;a href="https://insights.opensauced.pizza/feed" rel="noopener noreferrer"&gt;Highlights feed&lt;/a&gt; is that list for you. You filter based on a project today, but we hope to have an updated experience for sourcing top contributors soon. &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%2F0krz8akcppxgokvvvv3i.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%2F0krz8akcppxgokvvvv3i.png" alt="Highlights feed" width="800" height="725"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(&lt;a href="https://github.com/open-sauced/insights/issues/1289" rel="noopener noreferrer"&gt;the updated experience&lt;/a&gt;)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;At OpenSauced, we are looking to break the barrier for contributors in open source with our newest feature, Open Sauced Highlights, ushering in a new phase of Social Coding.&lt;/p&gt;

&lt;p&gt;Where an average contributor may contribute to one project during their career, we see an opportunity to highlight those contributions and share your experience with others. We would love to see your highlights, whether you are starting in open-source or the core maintainer of &lt;a href="https://github.com/analogjs/analog" rel="noopener noreferrer"&gt;analog&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Start by linking them below. &lt;/p&gt;

</description>
      <category>opensource</category>
      <category>github</category>
      <category>beginners</category>
    </item>
    <item>
      <title>A Rounded Solution to Image Handling on the OpenSauced Dashboard</title>
      <dc:creator>Brian Douglas</dc:creator>
      <pubDate>Wed, 17 May 2023 21:46:54 +0000</pubDate>
      <link>https://forem.com/opensauced/a-rounded-solution-to-image-handling-on-the-opensauced-dashboard-4n34</link>
      <guid>https://forem.com/opensauced/a-rounded-solution-to-image-handling-on-the-opensauced-dashboard-4n34</guid>
      <description>&lt;p&gt;&lt;em&gt;This post is about the journey we took to improve the OpenSauced Dashboard, which provides valuable insights on open-source contributions.&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;Last October, we had an alpha launch of the new OpenSauced Insights dashboard. This launch was to coincide with the biggest open-source hackathon, Hacktoberfest. Our goal was to provide insights and reports on the number of contributions accepted, merged, and even spam. Since then, the dashboard has evolved beyond Hacktoberfest data and now includes GitHub avatars representing active and open GitHub Pull Requests in the last 30 days.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;If you’d like to see your open source contributions &lt;a href="https://insights.opensauced.pizza?utm=dev" rel="noopener noreferrer"&gt;connect your GitHub account to OpenSauced&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenges Faced
&lt;/h2&gt;

&lt;p&gt;At the beginning, our team encountered challenges in sourcing and manipulating GitHub avatars to display a scatter plot e-chart on the dashboard. We struggled to find a suitable solution, especially when it came to handling a large number of images efficiently.&lt;/p&gt;

&lt;p&gt;As part of this challenge, GitHub has an aggressive rate limit when you're not authenticated when requesting resources, like avatars from a URL. We needed to fetch the avatar, manipulate them, and then cache them. Because our product was meant to be public, we would attract a lot of usage, and it could cost real money quickly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Solution: Leveraging nivo and Cloudinary
&lt;/h2&gt;

&lt;p&gt;To overcome these challenges, the team turned to the &lt;strong&gt;nivo chart library&lt;/strong&gt; for visualizations and &lt;strong&gt;Cloudinary&lt;/strong&gt; for image manipulation and caching 271k images. We successfully integrated nivo charts into our dashboard, thanks to its rich set of data visualization components built on top of d3 and React.&lt;/p&gt;

&lt;p&gt;By leveraging Cloudinary's image manipulation capabilities and caching strategy, we were able to round the avatars and seamlessly integrate them into the dashboard.&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%2Fu425gz6xkwdztzg2ucsj.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%2Fu425gz6xkwdztzg2ucsj.png" alt="dashboard screenshot" width="800" height="528"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Today this works thanks to &lt;a href="https://nivo.rocks/" rel="noopener noreferrer"&gt;nivo&lt;/a&gt; and &lt;a href="https://cloudinary.com/" rel="noopener noreferrer"&gt;Cloudinary&lt;/a&gt;, but that journey included a lot of trials and testing for the perfect solution.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Nivo is an open-source library that provides a rich set of data visualization components built on top of the awesome d3 and React libraries.&lt;/em&gt;&lt;/p&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/plouc" rel="noopener noreferrer"&gt;
        plouc
      &lt;/a&gt; / &lt;a href="https://github.com/plouc/nivo" rel="noopener noreferrer"&gt;
        nivo
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      nivo provides a rich set of dataviz components, built on top of the awesome d3 and React libraries
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;p&gt;&lt;a href="https://nivo.rocks" rel="nofollow noopener noreferrer"&gt;&lt;img alt="nivo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fplouc%2Fnivo%2Fmaster%2Fnivo.png" width="216" height="68"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/plouc/nivo#backers" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/9c582fc5476e91c1bc23ccd1fbb67f65093966773c9581a75b056c8d1265f8e4/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f6e69766f2f6261636b6572732f62616467652e7376673f7374796c653d666c61742d737175617265" alt="Backers on Open Collective"&gt;&lt;/a&gt;
&lt;a href="https://github.com/plouc/nivo#sponsors" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/71f5ea8d024ce99a86e9a9bd88b00ad69f916625ff7b06f40c90db3a3a3f6f9d/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f6e69766f2f73706f6e736f72732f62616467652e7376673f7374796c653d666c61742d737175617265" alt="Sponsors on Open Collective"&gt;&lt;/a&gt;
&lt;a href="https://github.com/plouc/nivo/blob/master/LICENSE.md" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/dbb89917deaedccb22386a7cca78d5643524c7ce7de34c82e5b83ce5d834f34b/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f706c6f75632f6e69766f2e7376673f7374796c653d666c61742d737175617265" alt="License"&gt;&lt;/a&gt;
&lt;a href="https://github.com/plouc/nivo/actions" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/b4407802f45eab5a7b3e57a26461a4aa48935b0500e28b3cd7b416b0328f08df/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f706c6f75632f6e69766f2f63692e796d6c3f6272616e63683d6d6173746572267374796c653d666c61742d737175617265" alt="GitHub Actions"&gt;&lt;/a&gt;
&lt;a href="https://www.npmjs.com/~nivo" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/f9c9c7cac58347c94edac46f01d4b5490b0d32d3c5c927bc08289f428b3f2275/68747470733a2f2f696d672e736869656c64732e696f2f6e706d2f762f406e69766f2f636f72652e7376673f7374796c653d666c61742d737175617265" alt="NPM version"&gt;&lt;/a&gt;
&lt;a href="https://discord.gg/n7Ft74f" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/263ce0d09f921cae21fcc41e01c26f12a0f368377938b5d6bb73d52b9ebd724f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f646973636f72642d6e69766f2d3631646166622e7376673f7374796c653d666c61742d737175617265" alt="nivo channel on discord"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;nivo&lt;/strong&gt; provides supercharged React components to easily build dataviz apps
it's built on top of d3.&lt;/p&gt;
&lt;p&gt;Several libraries already exist for React d3 integration
but just a few provide server side rendering ability and fully declarative charts.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Installation&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;In order to use nivo, you have to install the &lt;code&gt;@nivo/core&lt;/code&gt; package and then choose
some of the scoped &lt;code&gt;@nivo&lt;/code&gt; packages according to the charts you wish to use:&lt;/p&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;yarn add @nivo/core @nivo/bar
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Features&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Highly Customizable&lt;/li&gt;
&lt;li&gt;Motion/Transitions, powered by &lt;a href="https://react-spring.io" rel="nofollow noopener noreferrer"&gt;react-spring&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nivo.rocks/" rel="nofollow noopener noreferrer"&gt;Interactive Components Playground&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nivo.rocks/" rel="nofollow noopener noreferrer"&gt;Exhaustive Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nivo.rocks/components/?filter=svg" rel="nofollow noopener noreferrer"&gt;SVG Charts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nivo.rocks/components/?filter=html" rel="nofollow noopener noreferrer"&gt;HTML Charts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nivo.rocks/components/?filter=canvas" rel="nofollow noopener noreferrer"&gt;Canvas Charts&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Server Side Rendering and HTTP API&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://nivo.rocks/guides/patterns/" rel="nofollow noopener noreferrer"&gt;Patterns&lt;/a&gt; &amp;amp; &lt;a href="http://nivo.rocks/guides/gradients/" rel="nofollow noopener noreferrer"&gt;Gradients&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nivo.rocks/guides/theming/" rel="nofollow noopener noreferrer"&gt;Theming&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Responsive Charts&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Discussion&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Join the &lt;a href="https://discord.gg/n7Ft74f" rel="nofollow noopener noreferrer"&gt;nivo discord community&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Packages &amp;amp; components&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;nivo&lt;/strong&gt; is comprised of several packages/components, for a full list,
please use the &lt;a href="http://nivo.rocks/components/" rel="nofollow noopener noreferrer"&gt;Components Explorer&lt;/a&gt;.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Guides&lt;/h2&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="http://nivo.rocks/guides/axes/" rel="nofollow noopener noreferrer"&gt;Axes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nivo.rocks/guides/colors/" rel="nofollow noopener noreferrer"&gt;Colors&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nivo.rocks/guides/legends/" rel="nofollow noopener noreferrer"&gt;Legends&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nivo.rocks/guides/gradients/" rel="nofollow noopener noreferrer"&gt;Gradients&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nivo.rocks/guides/patterns/" rel="nofollow noopener noreferrer"&gt;Patterns&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://nivo.rocks/guides/theming/" rel="nofollow noopener noreferrer"&gt;Theming&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Backers&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Donations are welcome to help improving &lt;strong&gt;nivo&lt;/strong&gt; [&lt;a href="https://opencollective.com/nivo#backer" rel="nofollow noopener noreferrer"&gt;Become a backer&lt;/a&gt;]&lt;/p&gt;
&lt;p&gt;&lt;a href="https://opencollective.com/nivo#backers" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/d7fed6c905d6ca6d628b328006abac987319e7749ab89f8a32460ff8c4fcf301/68747470733a2f2f6f70656e636f6c6c6563746976652e636f6d2f6e69766f2f6261636b6572732e7376673f77696474683d383930"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Open Collective Sponsors&lt;/h2&gt;…&lt;/div&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/plouc/nivo" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;&lt;em&gt;Cloudinary is a hosted solution to manipulate and cache images for reuse.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Handling Image Processing with Apache E-charts
&lt;/h2&gt;

&lt;p&gt;Before adopting nivo and Cloudinary, we initially used Apache E-charts (specifically a React wrapper called &lt;a href="https://github.com/hustcc/echarts-for-react" rel="noopener noreferrer"&gt;echarts-for-react&lt;/a&gt;) to handle image processing and loading. This approach proved extremely slow, and it was quite the process in figuring out a better solution while we had a real-time constraint.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Journey to Finding Solutions
&lt;/h2&gt;

&lt;p&gt;We faced a challenge being able to provide images on the page that were sourced directly from GitHub. The avatars needed could be cached and manipulated to match our rounded image design. The total number of displayed contributors during the event was around 150k, and today close to 300k contributors are represented as contributions in the most popular open source repositories on OpenSauced.&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%2Fdl5oeh1g6u1xufwxku4y.jpg" 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%2Fdl5oeh1g6u1xufwxku4y.jpg" alt="dashboard image" width="800" height="291"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The e-charts for React solution gave us no access to the images when rendered, and provided limited options to edit the chart after it was displayed. We built our product in Figma designs first and were excited at the opportunity to have rounded images. Still, our e-chart library would only allow plain &amp;amp; squared images, and also any manipulation of the image was the challenge. &lt;/p&gt;

&lt;p&gt;[design]&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%2F8s9lcqb7qt3uuittb26r.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%2F8s9lcqb7qt3uuittb26r.png" alt="Rounded image design" width="800" height="254"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[reality]&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%2F8i8oaapjzsdjgvsfa6d3.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%2F8i8oaapjzsdjgvsfa6d3.png" alt="harsh square image design" width="712" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There comes a time in every developer's career where you are presented a design that may be just out of reach or out of scope. The simplest request around the images broke our charts and required the entire team to brainstorm solutions. &lt;/p&gt;

&lt;p&gt;You can see that brainstorming in our now closed issues. &lt;/p&gt;


&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/open-sauced/insights/issues/373#issuecomment-1249618915" rel="noopener noreferrer"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
        Comment for
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#373&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/bdougie" rel="noopener noreferrer"&gt;
        &lt;img class="github-liquid-tag-img" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F5713670%3Fv%3D4" alt="bdougie avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/bdougie" rel="noopener noreferrer"&gt;bdougie&lt;/a&gt;
        &lt;/strong&gt; commented on &lt;a href="https://github.com/open-sauced/insights/issues/373#issuecomment-1249618915" rel="noopener noreferrer"&gt;&lt;time&gt;Sep 16, 2022&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      &lt;p&gt;Hey another thought here. What if we add &lt;a href="https://cloudinary.com/home-91222" rel="nofollow noopener noreferrer"&gt;cloudinary&lt;/a&gt; processing the images and pass those urls? This would give us the ability transform (border and round) the images, as well as cache them some where.&lt;/p&gt;
&lt;p&gt;Alternatively, we could use &lt;a href="https://imagemagick.org/index.php" rel="nofollow noopener noreferrer"&gt;imagemagick&lt;/a&gt; (cli tool for image transforms) + &lt;a href="https://supabase.com/docs/guides/storage" rel="nofollow noopener noreferrer"&gt;supabase storage&lt;/a&gt; to do the same for free.&lt;/p&gt;
&lt;p&gt;@brandonroberts have you done anything like this before?&lt;/p&gt;

    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/open-sauced/insights/issues/373#issuecomment-1249618915" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Solution 1: JavaScript Approach
&lt;/h2&gt;

&lt;p&gt;Our first attempt was manually rounding the images using a quick lib function I threw together.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;applyBorderRadius&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;imageElement&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;imageElement&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;style&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;borderRadius&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;50%&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Get the image element&lt;/span&gt;
&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;image&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;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;myImage&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Apply the 50% border radius&lt;/span&gt;
&lt;span class="nf"&gt;applyBorderRadius&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;image&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;It's always good to start with an approach, even if it is wrong. &lt;/p&gt;

&lt;p&gt;This first solution needed to be corrected and didn't work because the images were limiting the e-chart with images on a scattered chart. We could not get direct access to the elements to manipulate after the fact. &lt;/p&gt;

&lt;p&gt;We needed a way to manipulate the images before sending to the chart.&lt;/p&gt;
&lt;h2&gt;
  
  
  Solution 2: Imagemagick for Rounding Images
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://imagemagick.org/index.php" rel="noopener noreferrer"&gt;ImageMagick&lt;/a&gt; is a fun open-source platform for displaying, creating, converting, modifying, and editing images. I had some experience working with ImageMagick at a previous employer and quickly found a solution to round the images before sending to the chart. &lt;/p&gt;

&lt;p&gt;But when I found a &lt;a href="https://stackoverflow.com/questions/67342758/displaying-rounded-images-in-github-pages-for-profile-image-using-markdown" rel="noopener noreferrer"&gt;stackoverflow answer&lt;/a&gt; doing something similar, I opted to use that instead.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://images.weserv.nl/?url=https://www.github.com/bdougie.png?size=60?v=4&amp;amp;h=300&amp;amp;w=300&amp;amp;fit=cover&amp;amp;mask=circle&amp;amp;maxage=7d
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://images.weserv.nl/?url=https://www.github.com/bdougie.png?size=60?v=4&amp;amp;h=300&amp;amp;w=300&amp;amp;fit=cover&amp;amp;mask=circle&amp;amp;maxage=7d" rel="noopener noreferrer"&gt;Link to this solution&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This was working, but we still needed to solve the caching issue.  &lt;/p&gt;

&lt;p&gt;I really wanted to try out building a service to use ImageMagick + the new &lt;a href="https://supabase.com/storage" rel="noopener noreferrer"&gt;Supabase storage&lt;/a&gt; to do this, but I wasn't willing to maintain that solution and we only had a little time to explore more unique tools. &lt;/p&gt;

&lt;p&gt;(&lt;em&gt;If you want to build a service like this, find me, and I would love to be a beta tester.&lt;/em&gt;)&lt;/p&gt;

&lt;p&gt;We needed a way to cache the images before sending to the chart and started looking at tools or services to make this easier.&lt;/p&gt;
&lt;h2&gt;
  
  
  Solution 3: Leveraging Cloudinary for Image Manipulation and Caching
&lt;/h2&gt;

&lt;p&gt;To solve the caching issue and optimize image processing, we explored different tools and services. &lt;/p&gt;

&lt;p&gt;Cloudinary offers image manipulation and a caching strategy. They also have a generous free tier--but for full transparency, I'll point out that our initial amount of data for Hacktoberfest was pushed up to the paid tier immediately.&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://res.cloudinary.com/bdougie/image/fetch/f_auto,q_auto/w_400,h_400,c_crop,r_400,g_auto/v1/https://avatars.githubusercontent.com/u/5713670
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://res.cloudinary.com/bdougie/image/fetch/f_auto,q_auto/w_400,h_400,c_crop,r_400,g_auto/v1/https://avatars.githubusercontent.com/u/5713670" rel="noopener noreferrer"&gt;Link to Cloudinary solution&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can see the PR with the solution live as well.&lt;/p&gt;


&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/open-sauced/insights/pull/467" rel="noopener noreferrer"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
        feat: Leverage cloudinary for round images
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#467&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/bdougie" rel="noopener noreferrer"&gt;
        &lt;img class="github-liquid-tag-img" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F5713670%3Fv%3D4" alt="bdougie avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/bdougie" rel="noopener noreferrer"&gt;bdougie&lt;/a&gt;
        &lt;/strong&gt; posted on &lt;a href="https://github.com/open-sauced/insights/pull/467" rel="noopener noreferrer"&gt;&lt;time&gt;Sep 30, 2022&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      
&lt;h2&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;What type of PR is this? (check all applicable)&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[x] 🍕 Feature&lt;/li&gt;
&lt;li&gt;[ ] 🐛 Bug Fix&lt;/li&gt;
&lt;li&gt;[ ] 📝 Documentation Update&lt;/li&gt;
&lt;li&gt;[ ] 🎨 Style&lt;/li&gt;
&lt;li&gt;[ ] 🧑‍💻 Code Refactor&lt;/li&gt;
&lt;li&gt;[ ] 🔥 Performance Improvements&lt;/li&gt;
&lt;li&gt;[ ] ✅ Test&lt;/li&gt;
&lt;li&gt;[ ] 🤖 Build&lt;/li&gt;
&lt;li&gt;[ ] 🔁 CI&lt;/li&gt;
&lt;li&gt;[ ] 📦 Chore (Release)&lt;/li&gt;
&lt;li&gt;[ ] ⏩ Revert&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;Description&lt;/h2&gt;

&lt;p&gt;This PR is intentionally set up to replace cloudinary in the future. As Vortex has point out this solution will eventually cost real money. The trade off is that we will eventually make real money from this product and using that to pay for this, balance out.&lt;/p&gt;
&lt;p&gt;Details&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Adds cloudinary url to edit and cache avatars on the fly.&lt;/li&gt;
&lt;li&gt;Only github.com urls can be edited. I am enforcing this on the cloudinary side.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;Related Tickets &amp;amp; Documents&lt;/h2&gt;

&lt;p&gt;fixes #373&lt;/p&gt;
&lt;h2&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;Mobile &amp;amp; Desktop Screenshots/Recordings&lt;/h2&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://user-images.githubusercontent.com/5713670/193367742-4708590e-055a-44f5-81f3-5c2f3cbbc7cb.png"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fuser-images.githubusercontent.com%2F5713670%2F193367742-4708590e-055a-44f5-81f3-5c2f3cbbc7cb.png" alt="Screen Shot 2022-09-30 at 4 07 18 PM"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;Added tests?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[ ] 👍 yes&lt;/li&gt;
&lt;li&gt;[x] 🙅 no, because they aren't needed&lt;/li&gt;
&lt;li&gt;[ ] 🙋 no, because I need help&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;Added to documentation?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;[ ] 📜 README.md&lt;/li&gt;
&lt;li&gt;[ ] 📓 docs.opensauced.pizza&lt;/li&gt;
&lt;li&gt;[ ] 🍕 dev.to/opensauced&lt;/li&gt;
&lt;li&gt;[ ] 📕 storybook&lt;/li&gt;
&lt;li&gt;[x] 🙅 no documentation needed&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;[optional] Are there any post-deployment tasks we need to perform?&lt;/h2&gt;
&lt;p&gt;Complete this issue &lt;a href="https://github.com/open-sauced/insights/issues/468" rel="noopener noreferrer"&gt;https://github.com/open-sauced/insights/issues/468&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
&lt;span class="octicon octicon-link"&gt;&lt;/span&gt;[optional] What gif best describes this PR or how it makes you feel?&lt;/h2&gt;

&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/fbc36e9db4e776a57c02a3e03e79d51af9b7d255bbf14ee345b88fa1e150e0d4/68747470733a2f2f6d65646961322e67697068792e636f6d2f6d656469612f546a6754494d3152497867755076487a54322f67697068792e676966"&gt;&lt;img src="https://camo.githubusercontent.com/fbc36e9db4e776a57c02a3e03e79d51af9b7d255bbf14ee345b88fa1e150e0d4/68747470733a2f2f6d65646961322e67697068792e636f6d2f6d656469612f546a6754494d3152497867755076487a54322f67697068792e676966"&gt;&lt;/a&gt;&lt;/p&gt;

    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/open-sauced/insights/pull/467" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;The solution was building a wrapper around using the GitHub avatar as the &lt;code&gt;imageUrl&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// lib/utils/roundedImages&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;roundedImage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;imageUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;cloudName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;string&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;cloudName&lt;/span&gt;
    &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="s2"&gt;`https://res.cloudinary.com/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;cloudName&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/image/fetch/c_fill,g_face,h_300,w_300,bo_20px_solid_white,r_max/f_auto,e_shadow/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;imageUrl&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;
    &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;imageUrl&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="c1"&gt;// components/organisms/Dashboard/dashboard.tsx&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;roundedImage&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;lib/utils/roundedImages&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;scatterChartData&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;prs&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(({&lt;/span&gt; &lt;span class="nx"&gt;updated_at&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;linesCount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;author_login&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;author_image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;author_login&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;includes&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;[bot]&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;octocat&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;author_login&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;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="na"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;calcDaysFromToday&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;updated_at&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;
        &lt;span class="na"&gt;y&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;linesCount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;contributor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;author_login&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="na"&gt;image&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nf"&gt;roundedImage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`https://www.github.com/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;author_image&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.png?size=60`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;NEXT_PUBLIC_CLOUD_NAME&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;};&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;em&gt;&lt;a href="[components/organisms/Dashboard/dashboard.tsx](https://github.com/open-sauced/insights/blob/beta/components/organisms/Dashboard/dashboard.tsx)"&gt;Link to code&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The interaction with Cloudinary is all URL based, allowing us to pass the GitHub user id as an option on the fly. The same id is also used to recall the cached image, meaning we have had caching by default. We also did not need to build any new infrastructure for this. &lt;/p&gt;

&lt;p&gt;With the initial 150k user profiles cached, we immediately needed to pay $90 per month for the pro tier, which we felt is reasonable and predictable for us. &lt;/p&gt;

&lt;p&gt;We are still on the same Cloudinary plan today, mainly due to the inertia and the fact that we still need to be ready to build and maintain something not core to our product. So far, Cloudinary is caching 271k image transforms for us.&lt;/p&gt;

&lt;p&gt;This scenario is a classic build vs buy scenario where we could build our own caching and image storage on S3, but the tech debt imposed on a solution like that was not our priority. The $90 was also not going to put us into debt either. &lt;/p&gt;
&lt;h2&gt;
  
  
  Migration to nivo Charts
&lt;/h2&gt;

&lt;p&gt;In December, we made the switch from Apache E-charts to nivo charts due to its modern features and active community. The decision was driven by the outdated state of E-charts and the limited contributions it received. We plan to contribute upstream to nivo to improve its integration and interaction with images.&lt;/p&gt;

&lt;p&gt;We have an active conversation in the nivo discussions about this and other feature enhancements. The maintainer has been really responsive, and we look forward to contributing upstream to support the project. &lt;/p&gt;


&lt;div class="ltag_github-liquid-tag"&gt;
  &lt;h1&gt;
    &lt;a href="https://github.com/plouc/nivo/issues/2201" rel="noopener noreferrer"&gt;
      &lt;img class="github-logo" alt="GitHub logo" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg"&gt;
      &lt;span class="issue-title"&gt;
        Support a popover like behavior for tooltips
      &lt;/span&gt;
      &lt;span class="issue-number"&gt;#2201&lt;/span&gt;
    &lt;/a&gt;
  &lt;/h1&gt;
  &lt;div class="github-thread"&gt;
    &lt;div class="timeline-comment-header"&gt;
      &lt;a href="https://github.com/OgDev-01" rel="noopener noreferrer"&gt;
        &lt;img class="github-liquid-tag-img" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Favatars.githubusercontent.com%2Fu%2F62995161%3Fv%3D4" alt="OgDev-01 avatar"&gt;
      &lt;/a&gt;
      &lt;div class="timeline-comment-header-text"&gt;
        &lt;strong&gt;
          &lt;a href="https://github.com/OgDev-01" rel="noopener noreferrer"&gt;OgDev-01&lt;/a&gt;
        &lt;/strong&gt; posted on &lt;a href="https://github.com/plouc/nivo/issues/2201" rel="noopener noreferrer"&gt;&lt;time&gt;Dec 15, 2022&lt;/time&gt;&lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
    &lt;div class="ltag-github-body"&gt;
      &lt;p&gt;&lt;strong&gt;Is your feature request related to a problem? Please describe.&lt;/strong&gt;
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]&lt;/p&gt;
&lt;p&gt;Currently working on a project and making use of the scatterplot chart. But discovered some limitations with the tooltip provided&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tooltip can't be hovered on&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a href="https://user-images.githubusercontent.com/62995161/207777072-97967a39-3b3c-4507-b978-2164cc2df77c.mov" rel="nofollow noopener noreferrer"&gt;https://user-images.githubusercontent.com/62995161/207777072-97967a39-3b3c-4507-b978-2164cc2df77c.mov&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Describe the solution you'd like&lt;/strong&gt;
A clear and concise description of what you want to happen.&lt;/p&gt;
&lt;p&gt;A behavior similar to GitHub hovercard where we can hiver on the tooltip itself&lt;/p&gt;
&lt;p&gt;&lt;a href="https://user-images.githubusercontent.com/62995161/207776852-7d605c29-e78c-459f-b99f-f5a1b83e2fde.mov" rel="nofollow noopener noreferrer"&gt;https://user-images.githubusercontent.com/62995161/207776852-7d605c29-e78c-459f-b99f-f5a1b83e2fde.mov&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Describe alternatives you've considered&lt;/strong&gt;
A clear and concise description of any alternative solutions or features you've considered.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Additional context&lt;/strong&gt;
Add any other context or screenshots about the feature request here.&lt;/p&gt;

    &lt;/div&gt;
    &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/plouc/nivo/issues/2201" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;



&lt;p&gt;If you have any thoughts or comments about our approach or have alternative solutions to share, we welcome your input. Let's continue learning from each other and enhancing our open-source projects.&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>cloudinary</category>
      <category>github</category>
    </item>
  </channel>
</rss>
