<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: f4ban</title>
    <description>The latest articles on DEV Community by f4ban (@f4ban).</description>
    <link>https://dev.to/f4ban</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3798459%2Fdcd0efcf-6c60-45ed-90a0-400e64571889.png</url>
      <title>DEV Community: f4ban</title>
      <link>https://dev.to/f4ban</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/f4ban"/>
    <language>en</language>
    <item>
      <title>Why Your Vue.js Site Isn't Ranking on Google</title>
      <dc:creator>f4ban</dc:creator>
      <pubDate>Tue, 30 Jun 2026 16:01:31 +0000</pubDate>
      <link>https://dev.to/f4ban/why-your-vuejs-site-isnt-ranking-on-google-16p3</link>
      <guid>https://dev.to/f4ban/why-your-vuejs-site-isnt-ranking-on-google-16p3</guid>
      <description>&lt;p&gt;You built a beautiful Vue.js SPA. Smooth transitions. Reactive components. Elegant code.&lt;/p&gt;

&lt;p&gt;Then you launched it ... aaaaand Google ignored it.&lt;/p&gt;

&lt;p&gt;The problem isn't your code. It's that Googlebot doesn't run JavaScript the way a browser does. Your carefully crafted SPA delivers an empty &lt;code&gt;&amp;lt;div id="app"&amp;gt;&lt;/code&gt; to crawlers. No content, no headings, no links.&lt;/p&gt;

&lt;p&gt;If Google can't read it, nobody finds it.&lt;/p&gt;




&lt;h2&gt;
  
  
  The Problem: JavaScript-Framed Content Is Invisible
&lt;/h2&gt;

&lt;p&gt;When you ship a client-side rendered Vue app, this is what Googlebot sees:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;My App&lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"app"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;script &lt;/span&gt;&lt;span class="na"&gt;src=&lt;/span&gt;&lt;span class="s"&gt;"app.js"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Everything is generated inside &lt;code&gt;app.js&lt;/code&gt;. &lt;/p&gt;

&lt;p&gt;For a business website, this is a nightmare. If your content isn't in the initial HTML, you're almost invisible to crawlers.&lt;/p&gt;




&lt;h2&gt;
  
  
  Nuxt Static Generation: Ship Real HTML
&lt;/h2&gt;

&lt;p&gt;Nuxt (the framework built on top of Vue) can pre-render every page at build time. The output is plain &lt;code&gt;.html&lt;/code&gt; files.&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;// nuxt.config.ts&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nf"&gt;defineNuxtConfig&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;nitro&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;preset&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;static&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="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's the core config. Run &lt;code&gt;nuxi generate&lt;/code&gt;, and Nuxt crawls every route, executes your components, and writes out static HTML files. What Googlebot sees is identical to what a user sees.&lt;/p&gt;

&lt;p&gt;This is the exact setup I use for &lt;a href="https://fm-netz.de" rel="noopener noreferrer"&gt;fm-netz.de&lt;/a&gt; - my own hosting and webdesign business for small German companies.&lt;/p&gt;

</description>
      <category>vue</category>
      <category>nuxt</category>
      <category>seo</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Introducing codespaces.el: The Best Way to Use GitHub Codespaces</title>
      <dc:creator>f4ban</dc:creator>
      <pubDate>Sat, 28 Feb 2026 15:41:09 +0000</pubDate>
      <link>https://dev.to/f4ban/introducing-codespacesel-the-best-way-to-use-github-codespaces-1cd</link>
      <guid>https://dev.to/f4ban/introducing-codespacesel-the-best-way-to-use-github-codespaces-1cd</guid>
      <description>&lt;p&gt;If you're an Emacs user and a fan of GitHub Codespaces, I have great news for you! I've taken over maitenance of:&lt;/p&gt;

&lt;p&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://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/f4ban" rel="noopener noreferrer"&gt;
        f4ban
      &lt;/a&gt; / &lt;a href="https://github.com/f4ban/codespaces.el" rel="noopener noreferrer"&gt;
        codespaces.el
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Emacs support for easy access to GitHub Codespaces.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="org"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;codespaces.el&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a href="https://github.com/F4ban/codespaces.el/actions/workflows/check.yml" rel="noopener noreferrer"&gt;&lt;img src="https://github.com/F4ban/codespaces.el/actions/workflows/check.yml/badge.svg" alt="https://github.com/F4ban/codespaces.el/actions/workflows/check.yml/badge.svg"&gt;&lt;/a&gt;
  &lt;a href="https://melpa.org/#/codespaces" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/217877c52ed8837c5bf8409ae81b182a59323b9e152d0ab7dba35637111e2f2f/68747470733a2f2f6d656c70612e6f72672f7061636b616765732f636f64657370616365732d62616467652e737667" alt="https://melpa.org/packages/codespaces-badge.svg"&gt;&lt;/a&gt;
  &lt;a href="https://raw.githubusercontent.com/F4ban/codespaces.el/main/LICENSE" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/238cbfe2e606294d92e655a1df301d7a3e0fbd3f3f439053a7e66f667de4e5f1/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f463462616e2f636f64657370616365732e656c2e737667" alt="https://img.shields.io/github/license/F4ban/codespaces.el.svg"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;About&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;This package provides support for managing &lt;a href="https://github.com/features/codespaces" rel="noopener noreferrer"&gt;GitHub Codespaces&lt;/a&gt; in Emacs and connecting to them via &lt;a href="https://www.gnu.org/software/tramp/" rel="nofollow noopener noreferrer"&gt;TRAMP&lt;/a&gt;. It provides a handy &lt;code&gt;completing-read&lt;/code&gt; UI that lets you choose from all your created codespaces.&lt;/p&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://github.com/f4ban/codespaces.el/./demo.gif"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fgithub.com%2Ff4ban%2Fcodespaces.el%2F.%2Fdemo.gif" alt="./demo.gif"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Here is an example &lt;code&gt;use-package&lt;/code&gt; declaration:&lt;/p&gt;
&lt;div class="highlight highlight-source-emacs-lisp notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;(&lt;span class="pl-c1"&gt;use-package&lt;/span&gt; codespaces
  &lt;span class="pl-c1"&gt;:config&lt;/span&gt; (codespaces-setup)
  &lt;span class="pl-c1"&gt;:bind&lt;/span&gt; (&lt;span class="pl-s"&gt;&lt;span class="pl-pds"&gt;"&lt;/span&gt;C-c S&lt;span class="pl-pds"&gt;"&lt;/span&gt;&lt;/span&gt; &lt;span class="pl-k"&gt;.&lt;/span&gt; &lt;span class="pl-c1"&gt;#&lt;span class="pl-c1"&gt;'codespaces-connect&lt;/span&gt;&lt;/span&gt;))&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;You will need to:&lt;/p&gt;
&lt;ol&gt;
  &lt;li&gt;Have the GitHub &lt;a href="https://cli.github.com" rel="noopener noreferrer"&gt;command line tools&lt;/a&gt; (&lt;code&gt;gh&lt;/code&gt;) installed
    &lt;ul&gt;
      &lt;li&gt;If you use &lt;code&gt;use-package-ensure-system-package&lt;/code&gt;, Emacs can install this for you automatically:&lt;/li&gt;
    &lt;/ul&gt;
    &lt;div class="highlight highlight-source-emacs-lisp notranslate position-relative overflow-auto js-code-highlight"&gt;
&lt;pre&gt;(&lt;span class="pl-c1"&gt;use-package&lt;/span&gt; use-package-ensure-system-package &lt;span class="pl-c1"&gt;:ensure&lt;/span&gt; &lt;span class="pl-c1"&gt;t&lt;/span&gt;)
(&lt;span class="pl-c1"&gt;use-package&lt;/span&gt; codespaces
  &lt;span class="pl-c1"&gt;:ensure-system-package&lt;/span&gt; gh
  &lt;span class="pl-c1"&gt;:config&lt;/span&gt; (codespaces-setup))
    &lt;/pre&gt;

&lt;/div&gt;
  &lt;/li&gt;
  &lt;li&gt;Authorize &lt;code&gt;gh&lt;/code&gt; to access your codespaces:
    &lt;ul&gt;
      &lt;li&gt;Running &lt;code&gt;gh codespace list&lt;/code&gt; will verify if permissions are correctly set.&lt;/li&gt;
      &lt;li&gt;You can grant the required permission by running &lt;code&gt;gh auth refresh -h github.com -s codespace&lt;/code&gt;.&lt;/li&gt;
    &lt;/ul&gt;
  &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Because the TRAMP package, which underpins this package’s functionality, connects to remote servers over SSH, your codespace needs to have an SSH server…&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/f4ban/codespaces.el" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;




&lt;p&gt;&lt;strong&gt;What is codespaces.el?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;codespaces.el is an Emacs package that enables seamless interaction with GitHub Codespaces. If you're unfamiliar Learn more about codespaces &lt;a href="https://github.com/features/codespaces" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;With this package, you can interact with your Codespaces directly from within Emacs, whether it's creating a new one or connecting to a existing codespace, all from the comfort of your favorite editor.&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%2Fovagpu2m6o0z2n5hicy9.gif" 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%2Fovagpu2m6o0z2n5hicy9.gif" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Features:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Connect to Codespaces via Emacs TRAMP&lt;/li&gt;
&lt;li&gt;Create new and delete old Codespaces&lt;/li&gt;
&lt;li&gt;Start and stop Codespaces&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Contributing&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you’d like to contribute to the project, feel free to create issues and submit a pull request! I’m always open to new ideas and improvements.&lt;/p&gt;

&lt;p&gt;Links:&lt;br&gt;
&lt;a href="https://melpa.org/#/codespaces" rel="noopener noreferrer"&gt;Melpa&lt;/a&gt;&lt;br&gt;
&lt;a href="https://github.com/f4ban/codespaces.el" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;&lt;/p&gt;

</description>
      <category>emacs</category>
      <category>devops</category>
      <category>github</category>
      <category>programming</category>
    </item>
  </channel>
</rss>
