<?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 Core: Ben Halpern</title>
    <description>The latest articles on Forem Core by Ben Halpern (@ben).</description>
    <link>https://core.forem.com/ben</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%2F1%2Fbabb96d0-9cd2-49bc-a412-2dc4caf94c2a.png</url>
      <title>Forem Core: Ben Halpern</title>
      <link>https://core.forem.com/ben</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://core.forem.com/feed/ben"/>
    <language>en</language>
    <item>
      <title>How we're using Gemini Embeddings to build a smarter, community-driven feed on DEV</title>
      <dc:creator>Ben Halpern</dc:creator>
      <pubDate>Fri, 22 May 2026 16:27:19 +0000</pubDate>
      <link>https://core.forem.com/devteam/how-were-using-gemini-embeddings-to-build-a-smarter-community-driven-feed-on-dev-1b9f</link>
      <guid>https://core.forem.com/devteam/how-were-using-gemini-embeddings-to-build-a-smarter-community-driven-feed-on-dev-1b9f</guid>
      <description>&lt;p&gt;Big improvements incoming 👋&lt;/p&gt;

&lt;p&gt;Finding the right balance for a feed algorithm is historically really hard. If you optimize purely for clicks and comments, you end up with a clickbait echo chamber. But if you just sort by recency, it's a firehose where great discussions disappear in hours. &lt;/p&gt;

&lt;p&gt;We've wrestled with this tension at DEV for a long time. We want a feed that feels alive, but actually surfaces high-quality, intellectually stimulating stuff.&lt;/p&gt;

&lt;p&gt;So, we're trying something new. We are combining standard community signals—like who you follow and what you react to—with &lt;a href="https://docs.cloud.google.com/gemini-enterprise-agent-platform/models/gemini/embedding-2" rel="noopener noreferrer"&gt;Gemini Embeddings 2&lt;/a&gt; and &lt;code&gt;pgvector&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;Here is a look under the hood at how we are putting this together.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Keeping things flexible and auditable
&lt;/h2&gt;

&lt;p&gt;Instead of duct-taping API calls all over the codebase, we built a flexible foundation using wrapper classes, mostly centered around &lt;code&gt;Ai::Base&lt;/code&gt; and &lt;code&gt;Ai::Embedding&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;When a service needs the API, it just passes &lt;code&gt;wrapper: self&lt;/code&gt; to the client. This lets &lt;code&gt;Ai::Base&lt;/code&gt; look at the calling object, grab its class name, and check its &lt;code&gt;VERSION&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight ruby"&gt;&lt;code&gt;&lt;span class="no"&gt;Ai&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Base&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;wrapper: &lt;/span&gt;&lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;This pattern gives us a really clean audit trail via our &lt;code&gt;AiAudit&lt;/code&gt; model. Every single time we generate a vector or analyze a trend, we automatically log the model used, the caller's class, payloads, latency, and token counts. &lt;/p&gt;

&lt;p&gt;It makes debugging and tracking costs so much easier, without muddying up our core business logic.&lt;/p&gt;


&lt;h2&gt;
  
  
  2. A more personalized feed
&lt;/h2&gt;

&lt;p&gt;Our main feed is powered by &lt;code&gt;FeedConfig&lt;/code&gt;. It compiles custom SQL to score and rank articles for you.&lt;/p&gt;

&lt;p&gt;Historically, this was all hardcoded math based on things like tags and whether you follow the author. Now, we've introduced a semantic feedback loop. &lt;/p&gt;

&lt;p&gt;As you interact with the platform, we compile a dynamic &lt;code&gt;interest_embedding&lt;/code&gt; that represents what you actually care about. We use the &lt;code&gt;pgvector&lt;/code&gt; extension in PostgreSQL to inject your interests directly into the SQL query:&lt;br&gt;
&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="k"&gt;CASE&lt;/span&gt;
    &lt;span class="k"&gt;WHEN&lt;/span&gt; &lt;span class="n"&gt;articles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;semantic_embedding&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;
      &lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;articles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;published_at&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;published_since&lt;/span&gt;
    &lt;span class="k"&gt;THEN&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;articles&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;semantic_embedding&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;interest_embedding&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;semantic_similarity_weight&lt;/span&gt;
    &lt;span class="k"&gt;ELSE&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
  &lt;span class="k"&gt;END&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;By using &lt;code&gt;1 - (embedding &amp;lt;=&amp;gt; user_interest)&lt;/code&gt;, we get a cosine similarity score. We scale that up and mix it in with standard social signals (like who you follow), post quality, and time decay.&lt;/p&gt;

&lt;p&gt;This means a highly relevant post can rise to the top of your feed, but so can a globally trending post from a community member you love. It’s all about balance.&lt;/p&gt;


&lt;h2&gt;
  
  
  3. What the heck is an embedding anyway? (And why v2 matters)
&lt;/h2&gt;

&lt;p&gt;If you're new to the concept, an embedding is basically taking a piece of content—like an article text—and turning it into a long string of numbers (a vector). These numbers map the content into a "semantic space." If two posts are talking about the exact same conceptual ideas, their numbers will look very similar mathematically, even if they use completely different wording.&lt;/p&gt;

&lt;p&gt;We've upgraded this pipeline to use Google's newly released &lt;strong&gt;Gemini Embeddings 2&lt;/strong&gt; model. &lt;/p&gt;

&lt;p&gt;A standard text embedding model only looks at words. But Gemini Embeddings 2 compiles into massive 3,072-dimensional vectors and maps everything into a single, unified semantic space. &lt;/p&gt;
&lt;h3&gt;
  
  
  Future-proofing for a multi-modal DEV
&lt;/h3&gt;

&lt;p&gt;The coolest part about moving to Embeddings 2 is that it isn't just restricted to text. It natively accepts multimodal inputs—meaning text, code, images, audio, and video. &lt;/p&gt;

&lt;p&gt;Right now, we're using it to analyze written DEV posts. But because the underlying math maps everything into the exact same vector space, we are completely future-proofing our infrastructure. As the DEV platform evolves, we can easily feed images, podcast audio, or video posts into the exact same database architecture[. &lt;/p&gt;

&lt;p&gt;A user's &lt;code&gt;interest_embedding&lt;/code&gt; will be able to effortlessly surface an open-source video tutorial or a technical podcast episode based entirely on conceptual relevance, without us needing to rewrite our feed logic from scratch.&lt;/p&gt;


&lt;h2&gt;
  
  
  4. Catching nuanced trends 📈
&lt;/h2&gt;

&lt;p&gt;Tags are great for high-level sorting, but they miss the highly specific, timely conversations. If Ruby 3.4 drops, a &lt;code&gt;#ruby&lt;/code&gt; tag search won't distinguish between a "Hello World" tutorial and a deep debate about the new parser.&lt;/p&gt;

&lt;p&gt;To fix this, we are in the process of building a clustering service powered by &lt;code&gt;TrendDetector&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Every 6 hours, a background job runs a Leader Clustering algorithm in pure Ruby:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Quality first:&lt;/strong&gt; We only look at recent articles scoring at least 15 points above our homepage minimum.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Clustering:&lt;/strong&gt; We measure the cosine distance between articles. If a post is close enough (&lt;code&gt;0.15&lt;/code&gt; or less) to an existing cluster, it joins it. If not, it starts a new one.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Labeling:&lt;/strong&gt; Once a cluster hits 10 or more articles, we ask the Gemini API to label the trend and summarize the core debate.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We store all of this in &lt;code&gt;TrendMembership&lt;/code&gt;, which lets us sort articles in the UI based on how close they are to the core topic.&lt;/p&gt;

&lt;p&gt;All of this can be tracked via our open source codebase Forem:&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/forem" rel="noopener noreferrer"&gt;
        forem
      &lt;/a&gt; / &lt;a href="https://github.com/forem/forem" rel="noopener noreferrer"&gt;
        forem
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      For empowering community 🌱
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div&gt;
  &lt;br&gt;
  &lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Forem 🌱&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;For Empowering Community&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;br&gt;
&lt;br&gt;

&lt;p&gt;
  &lt;a href="https://github.com/forem/forem/actions/workflows/ci.yml" rel="noopener noreferrer"&gt;
    &lt;img src="https://github.com/forem/forem/actions/workflows/ci.yml/badge.svg" alt="Build Status"&gt;
  &lt;/a&gt;
  &lt;a href="https://github.com/forem/forem/actions/workflows/cd.yml" rel="noopener noreferrer"&gt;
    &lt;img src="https://github.com/forem/forem/actions/workflows/cd.yml/badge.svg" alt="Build Status"&gt;
  &lt;/a&gt;
  &lt;a rel="noopener noreferrer nofollow" href="https://camo.githubusercontent.com/8ff45d4371c6a841fba51a46b5839394d54073200ca437804873b8ad9dda0223/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6d6d69742d61637469766974792f772f666f72656d2f666f72656d"&gt;&lt;img src="https://camo.githubusercontent.com/8ff45d4371c6a841fba51a46b5839394d54073200ca437804873b8ad9dda0223/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f636f6d6d69742d61637469766974792f772f666f72656d2f666f72656d" alt="GitHub commit activity"&gt;&lt;/a&gt;
  &lt;a href="https://github.com/forem/forem/issues?q=is%3Aissue+is%3Aopen+label%3A%22ready+for+dev%22" rel="noopener noreferrer"&gt;
    &lt;img src="https://camo.githubusercontent.com/1aceedd769bf7ab14522fe26fda6c0f714b7742980e78da6546df416e3c560d9/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732f666f72656d2f666f72656d2f7265616479253230666f72253230646576" alt="GitHub issues ready for dev"&gt;
  &lt;/a&gt;
  &lt;a href="https://gitpod.io/#https://github.com/forem/forem" rel="nofollow noopener noreferrer"&gt;
    &lt;img src="https://camo.githubusercontent.com/fa445e63ae38a91a2c8f8bc1cd6842f48216c4a57a114b07484225f3bdc7528c/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f73657475702d6175746f6d617465642d626c75653f6c6f676f3d676974706f64" alt="GitPod badge"&gt;
  &lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Welcome to the &lt;a href="https://forem.com" rel="nofollow noopener noreferrer"&gt;Forem&lt;/a&gt; codebase, the platform that powers
&lt;a href="https://dev.to" rel="nofollow"&gt;dev.to&lt;/a&gt;. We are so excited to have you. With your help, we can
build out Forem’s usability, scalability, and stability to better serve our
communities.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;What is Forem?&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Forem is open source software for building communities. Communities for your
peers, customers, fanbases, families, friends, and any other time and space
where people need to come together to be part of a collective
&lt;a href="https://dev.to/devteam/for-empowering-community-2k6h" rel="nofollow"&gt;See our announcement post&lt;/a&gt;
for a high-level overview of what Forem is.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://dev.to" rel="nofollow"&gt;dev.to&lt;/a&gt; (or just DEV) is hosted by Forem. It is a community of
software developers who write articles, take part in discussions, and build
their professional profiles. We value supportive and constructive dialogue in
the pursuit of great code and career growth for all members. The ecosystem spans
from beginner to advanced developers, and all are welcome to find their place…&lt;/p&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/forem/forem" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;





&lt;h2&gt;
  
  
  5. Putting the community first ❤️
&lt;/h2&gt;

&lt;p&gt;Human curation, both from the broader community and our editorial perspective, is still the backbone of the system. &lt;/p&gt;

&lt;p&gt;We are using Gemini Embeddings to amplify what the community is already doing. It’s about mixing the raw utility of vector search with the human spirit of developer-voted scores and relationships. &lt;/p&gt;

&lt;p&gt;We want DEV to be the best place on the internet to share code and talk about software. We think this is a big step in that direction.&lt;/p&gt;

&lt;p&gt;What do you think? Let me know in the comments.&lt;/p&gt;

&lt;p&gt;Happy coding!&lt;/p&gt;

</description>
      <category>gemini</category>
      <category>ai</category>
      <category>googlecloud</category>
      <category>postgres</category>
    </item>
    <item>
      <title>Pretty normal</title>
      <dc:creator>Ben Halpern</dc:creator>
      <pubDate>Thu, 21 May 2026 14:30:16 +0000</pubDate>
      <link>https://core.forem.com/ben/pretty-normal-1893</link>
      <guid>https://core.forem.com/ben/pretty-normal-1893</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/harsh2644/i-used-to-get-excited-about-new-tools-now-i-feel-tired-1e18" class="crayons-story__hidden-navigation-link"&gt;I Used to Get Excited About New Tools Now I Feel Tired.&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
      &lt;a href="https://dev.to/harsh2644/i-used-to-get-excited-about-new-tools-now-i-feel-tired-1e18" class="crayons-article__context-note crayons-article__context-note__feed"&gt;&lt;p&gt;Staying updated as unpaid homework&lt;/p&gt;

&lt;/a&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="/harsh2644" 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%2F3735796%2Fb533ba06-7693-48b5-ace8-63923f5d2d0a.jpg" alt="harsh2644 profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/harsh2644" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Harsh 
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Harsh 
                
              
              &lt;div id="story-author-preview-content-3716518" 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="/harsh2644" 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%2F3735796%2Fb533ba06-7693-48b5-ace8-63923f5d2d0a.jpg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Harsh &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/harsh2644/i-used-to-get-excited-about-new-tools-now-i-feel-tired-1e18" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;May 21&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/harsh2644/i-used-to-get-excited-about-new-tools-now-i-feel-tired-1e18" id="article-link-3716518"&gt;
          I Used to Get Excited About New Tools Now I Feel Tired.
        &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/mentalhealth"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;mentalhealth&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/career"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;career&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/harsh2644/i-used-to-get-excited-about-new-tools-now-i-feel-tired-1e18" 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/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.svg" width="18" height="18"&gt;
                  &lt;/span&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/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;62&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/harsh2644/i-used-to-get-excited-about-new-tools-now-i-feel-tired-1e18#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              57&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;


</description>
      <category>career</category>
      <category>devjournal</category>
      <category>discuss</category>
      <category>mentalhealth</category>
    </item>
    <item>
      <title>Definitely looking forward to using Antigravity 2.0</title>
      <dc:creator>Ben Halpern</dc:creator>
      <pubDate>Tue, 19 May 2026 17:27:33 +0000</pubDate>
      <link>https://core.forem.com/ben/definitely-looking-forward-to-using-antigravity-20-6ob</link>
      <guid>https://core.forem.com/ben/definitely-looking-forward-to-using-antigravity-20-6ob</guid>
      <description></description>
      <category>productivity</category>
      <category>softwaredevelopment</category>
      <category>tooling</category>
      <category>vibecoding</category>
    </item>
    <item>
      <title>Meme Monday</title>
      <dc:creator>Ben Halpern</dc:creator>
      <pubDate>Mon, 18 May 2026 12:47:35 +0000</pubDate>
      <link>https://core.forem.com/ben/meme-monday-47g6</link>
      <guid>https://core.forem.com/ben/meme-monday-47g6</guid>
      <description>&lt;p&gt;&lt;strong&gt;Meme Monday!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Today's cover image comes from &lt;a href="https://dev.to/ben/meme-monday-55e2"&gt;the last thread&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;DEV is an inclusive space! Humor in poor taste will be downvoted by mods.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>jokes</category>
      <category>watercooler</category>
    </item>
    <item>
      <title>Meme Monday</title>
      <dc:creator>Ben Halpern</dc:creator>
      <pubDate>Mon, 11 May 2026 10:06:48 +0000</pubDate>
      <link>https://core.forem.com/ben/meme-monday-55e2</link>
      <guid>https://core.forem.com/ben/meme-monday-55e2</guid>
      <description>&lt;p&gt;&lt;strong&gt;Meme Monday!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Today's cover image comes from &lt;a href="https://dev.to/ben/meme-monday-1lm6"&gt;the last thread&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;DEV is an inclusive space! Humor in poor taste will be downvoted by mods.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>watercooler</category>
      <category>jokes</category>
    </item>
    <item>
      <title>Meme Monday</title>
      <dc:creator>Ben Halpern</dc:creator>
      <pubDate>Mon, 04 May 2026 12:44:01 +0000</pubDate>
      <link>https://core.forem.com/ben/meme-monday-1lm6</link>
      <guid>https://core.forem.com/ben/meme-monday-1lm6</guid>
      <description>&lt;p&gt;&lt;strong&gt;Meme Monday!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Today's cover image comes from &lt;a href="https://dev.to/ben/meme-monday-98e"&gt;the last thread&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;DEV is an inclusive space! Humor in poor taste will be downvoted by mods.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>watercooler</category>
      <category>jokes</category>
    </item>
    <item>
      <title>me_irl</title>
      <dc:creator>Ben Halpern</dc:creator>
      <pubDate>Fri, 01 May 2026 22:58:54 +0000</pubDate>
      <link>https://core.forem.com/ben/meirl-5g6i</link>
      <guid>https://core.forem.com/ben/meirl-5g6i</guid>
      <description></description>
      <category>watercooler</category>
    </item>
    <item>
      <title>My LLM assistant's new buzzword is starting responses with "be completely candid". Very grating.</title>
      <dc:creator>Ben Halpern</dc:creator>
      <pubDate>Fri, 01 May 2026 15:53:12 +0000</pubDate>
      <link>https://core.forem.com/ben/my-llm-assistants-new-buzzword-is-starting-responses-with-be-completely-candid-very-grating-11df</link>
      <guid>https://core.forem.com/ben/my-llm-assistants-new-buzzword-is-starting-responses-with-be-completely-candid-very-grating-11df</guid>
      <description></description>
      <category>ai</category>
      <category>discuss</category>
      <category>llm</category>
      <category>watercooler</category>
    </item>
    <item>
      <title>Same for me at the moment</title>
      <dc:creator>Ben Halpern</dc:creator>
      <pubDate>Wed, 29 Apr 2026 14:43:43 +0000</pubDate>
      <link>https://core.forem.com/ben/same-for-me-at-the-moment-1c2j</link>
      <guid>https://core.forem.com/ben/same-for-me-at-the-moment-1c2j</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/higangssh/i-dont-want-to-give-claude-ssh-access-to-my-home-server-2gjl" class="crayons-story__hidden-navigation-link"&gt;I don't want to give Claude SSH access to my home server&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="/higangssh" 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%2F3797790%2Fc91a91fc-1512-418c-ab40-25d0b9078ab4.jpeg" alt="higangssh profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/higangssh" class="crayons-story__secondary fw-medium m:hidden"&gt;
              SangheeSon
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                SangheeSon
                
              
              &lt;div id="story-author-preview-content-3586994" 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="/higangssh" 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%2F3797790%2Fc91a91fc-1512-418c-ab40-25d0b9078ab4.jpeg" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;SangheeSon&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/higangssh/i-dont-want-to-give-claude-ssh-access-to-my-home-server-2gjl" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Apr 29&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/higangssh/i-dont-want-to-give-claude-ssh-access-to-my-home-server-2gjl" id="article-link-3586994"&gt;
          I don't want to give Claude SSH access to my home server
        &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/selfhosted"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;selfhosted&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/opensource"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;opensource&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/go"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;go&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/higangssh/i-dont-want-to-give-claude-ssh-access-to-my-home-server-2gjl" 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/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/multi-unicorn-b44d6f8c23cdd00964192bedc38af3e82463978aa611b4365bd33a0f1f4f3e97.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;10&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/higangssh/i-dont-want-to-give-claude-ssh-access-to-my-home-server-2gjl#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>claude</category>
      <category>discuss</category>
      <category>security</category>
    </item>
    <item>
      <title>https://github.blog/news-insights/company-news/an-update-on-github-availability/</title>
      <dc:creator>Ben Halpern</dc:creator>
      <pubDate>Tue, 28 Apr 2026 21:18:01 +0000</pubDate>
      <link>https://core.forem.com/ben/httpsgithubblognews-insightscompany-newsan-update-on-github-availability-1p2m</link>
      <guid>https://core.forem.com/ben/httpsgithubblognews-insightscompany-newsan-update-on-github-availability-1p2m</guid>
      <description>&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://github.blog/news-insights/company-news/an-update-on-github-availability/" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.blog%2Fwp-content%2Fuploads%2F2025%2F07%2Fwallpaper-generic-blue.png" height="450" class="m-0" width="800"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://github.blog/news-insights/company-news/an-update-on-github-availability/" rel="noopener noreferrer" class="c-link"&gt;
            An update on GitHub availability - The GitHub Blog
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Here’s what we’ve done—and what we’re still doing—to improve our availability and reliability.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.githubassets.com%2Ffavicon.ico" width="32" height="32"&gt;
          github.blog
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
      <category>devops</category>
      <category>github</category>
      <category>news</category>
      <category>sre</category>
    </item>
    <item>
      <title>Meme Monday</title>
      <dc:creator>Ben Halpern</dc:creator>
      <pubDate>Mon, 27 Apr 2026 13:11:07 +0000</pubDate>
      <link>https://core.forem.com/ben/meme-monday-98e</link>
      <guid>https://core.forem.com/ben/meme-monday-98e</guid>
      <description>&lt;p&gt;&lt;strong&gt;Meme Monday!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Today's cover image comes from &lt;a href="https://dev.to/ben/meme-monday-5ee"&gt;the last thread&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;DEV is an inclusive space! Humor in poor taste will be downvoted by mods.&lt;/p&gt;

</description>
      <category>discuss</category>
      <category>jokes</category>
      <category>watercooler</category>
    </item>
    <item>
      <title>This is pretty exciting!

https://github.com/matz/spinel</title>
      <dc:creator>Ben Halpern</dc:creator>
      <pubDate>Fri, 24 Apr 2026 14:39:33 +0000</pubDate>
      <link>https://core.forem.com/ben/this-is-pretty-excitinghttpsgithubcommatzspinel-4bjl</link>
      <guid>https://core.forem.com/ben/this-is-pretty-excitinghttpsgithubcommatzspinel-4bjl</guid>
      <description>&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://github.com/matz/spinel" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fopengraph.githubassets.com%2F8e73af76c12a20711fed13815b6de4a7b17f7e55a532d31d58b656c64d8f8ad1%2Fmatz%2Fspinel" height="600" class="m-0" width="1200"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://github.com/matz/spinel" rel="noopener noreferrer" class="c-link"&gt;
            GitHub - matz/spinel · GitHub
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            Contribute to matz/spinel development by creating an account on GitHub.
          &lt;/p&gt;
        &lt;div class="color-secondary fs-s flex items-center"&gt;
            &lt;img alt="favicon" class="c-embed__favicon m-0 mr-2 radius-0" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.githubassets.com%2Ffavicons%2Ffavicon.svg" width="32" height="32"&gt;
          github.com
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;


</description>
    </item>
  </channel>
</rss>
