<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://mmarhin.github.io/gsoc2026blog/feed.xml" rel="self" type="application/atom+xml" /><link href="https://mmarhin.github.io/gsoc2026blog/" rel="alternate" type="text/html" /><updated>2026-07-05T16:21:11+00:00</updated><id>https://mmarhin.github.io/gsoc2026blog/feed.xml</id><title type="html">Mario’s Blog - GSoC 2026</title><subtitle>Exclusive blog documenting my journey through GSoC 2026 with openSUSE. I will be sharing my progress, developments, and everything I learn along the way.</subtitle><entry><title type="html">GSoC Update 1: Can SVG Build Badges Update Themselves?</title><link href="https://mmarhin.github.io/gsoc2026blog/gsoc/opensuse/svg/javascript/2026/07/05/update-1-svg-javascript-limitations.html" rel="alternate" type="text/html" title="GSoC Update 1: Can SVG Build Badges Update Themselves?" /><published>2026-07-05T16:00:00+00:00</published><updated>2026-07-05T16:00:00+00:00</updated><id>https://mmarhin.github.io/gsoc2026blog/gsoc/opensuse/svg/javascript/2026/07/05/update-1-svg-javascript-limitations</id><content type="html" xml:base="https://mmarhin.github.io/gsoc2026blog/gsoc/opensuse/svg/javascript/2026/07/05/update-1-svg-javascript-limitations.html"><![CDATA[<p>One of the initial goals of the project was to explore whether the SVG build
results generated by <code class="language-plaintext highlighter-rouge">obs-status-service</code> could become interactive and update
in real time. In particular, I wanted to determine whether an SVG embedded in a
Gitea README or comment in a PR could use JavaScript to request fresh OBS
results without requiring the user to reload the page.</p>

<h2 id="testing-javascript-inside-svg">Testing JavaScript Inside SVG</h2>

<p>To verify the browser behavior, I created a
<a href="https://src.opensuse.org/mmarhin/test-js">small test repository</a> containing an
SVG clock. The file includes a JavaScript timer that updates the displayed date
and time every second, making it immediately clear whether the script has been
executed.</p>

<p>I tested the same SVG in several embedding contexts:</p>

<table>
  <thead>
    <tr>
      <th>Context</th>
      <th>JavaScript</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>SVG opened directly</td>
      <td>Runs</td>
    </tr>
    <tr>
      <td>SVG embedded with <code class="language-plaintext highlighter-rouge">&lt;object&gt;</code></td>
      <td>Runs</td>
    </tr>
    <tr>
      <td>SVG embedded with <code class="language-plaintext highlighter-rouge">&lt;iframe&gt;</code></td>
      <td>Runs</td>
    </tr>
    <tr>
      <td>SVG embedded with <code class="language-plaintext highlighter-rouge">&lt;img&gt;</code></td>
      <td>Does not run</td>
    </tr>
    <tr>
      <td>SVG included with Markdown and rendered as <code class="language-plaintext highlighter-rouge">&lt;img&gt;</code></td>
      <td>Does not run</td>
    </tr>
    <tr>
      <td>SVG included with Markdown and rendered as <code class="language-plaintext highlighter-rouge">&lt;object&gt;</code></td>
      <td>Runs</td>
    </tr>
  </tbody>
</table>

<p>The important distinction is not whether SVG supports JavaScript, because it
does. The restriction depends on how the browser loads the file.</p>

<p>When SVG is used as an image, browsers apply a restricted processing mode for
security and privacy reasons. In this context, scripts and external resources
are disabled. This behavior is documented by
<a href="https://developer.mozilla.org/en-US/docs/Web/SVG/Guides/SVG_as_an_image">MDN’s guide to SVG as an image</a>
and by the
<a href="https://www.w3.org/TR/SVG/conform.html">SVG 2 conformance rules</a>, which
describe the secure image processing modes.</p>

<h2 id="giteas-rendering-makes-the-difference">Gitea’s Rendering Makes the Difference</h2>

<p>The <a href="https://spec.commonmark.org/0.31.2/#images">CommonMark image specification</a>
defines Markdown images as HTML <code class="language-plaintext highlighter-rouge">img</code> elements. My first test used an SVG stored
in the same repository, and Gitea kept it as <code class="language-plaintext highlighter-rouge">img</code>, so the script did not run.</p>

<p>Daniel later observed a different case on <code class="language-plaintext highlighter-rouge">src.opensuse.org</code>: an HTTPS SVG
badge served from the openSUSE infrastructure was embedded as an <code class="language-plaintext highlighter-rouge">object</code> and
did update after its 30-second timer. That distinction matters because scripts
are disabled in <code class="language-plaintext highlighter-rouge">img</code>, but can run when the SVG is loaded as an <code class="language-plaintext highlighter-rouge">object</code>.</p>

<p>The live
<a href="https://gitexplorer.opensuse.org/badge/devel:languages:python:Factory/python313.svg"><code class="language-plaintext highlighter-rouge">obs-git-explorer</code> badge</a>
confirms the second case. It is served as <code class="language-plaintext highlighter-rouge">image/svg+xml</code>, contains a
<code class="language-plaintext highlighter-rouge">setInterval</code> that runs every 30 seconds, fetches fresh results from the same
<code class="language-plaintext highlighter-rouge">gitexplorer.opensuse.org</code> origin, and updates its text and colors.</p>

<p>This also limits theme integration. An SVG image may use
<code class="language-plaintext highlighter-rouge">prefers-color-scheme</code> to follow the browser or operating-system preference, but
an externally loaded SVG still cannot directly reuse Gitea’s page CSS.</p>

<h2 id="implications-for-obs-status-service">Implications for <code class="language-plaintext highlighter-rouge">obs-status-service</code></h2>

<p>This means live updates may be possible for <code class="language-plaintext highlighter-rouge">obs-status-service</code>, but only if
Gitea embeds the generated badge as <code class="language-plaintext highlighter-rouge">object</code>.</p>

<p>The practical approach would be simple:</p>

<ul>
  <li>Serve the visible badge as SVG.</li>
  <li>Let the SVG JavaScript fetch the equivalent <code class="language-plaintext highlighter-rouge">.json</code> URL.</li>
  <li>Update the badge text and colors from that JSON response.</li>
</ul>

<p>If Gitea keeps the badge as <code class="language-plaintext highlighter-rouge">img</code>, the SVG remains static and server-side
rendering is still the fallback. The key conclusion is that Markdown syntax is
not enough to decide this; the final DOM matters: <code class="language-plaintext highlighter-rouge">img</code> is static, while
<code class="language-plaintext highlighter-rouge">object</code> can support a self-updating SVG.</p>]]></content><author><name></name></author><category term="gsoc" /><category term="opensuse" /><category term="svg" /><category term="javascript" /><summary type="html"><![CDATA[One of the initial goals of the project was to explore whether the SVG build results generated by obs-status-service could become interactive and update in real time. In particular, I wanted to determine whether an SVG embedded in a Gitea README or comment in a PR could use JavaScript to request fresh OBS results without requiring the user to reload the page.]]></summary></entry><entry><title type="html">Preparing for GSoC: My First Contributions to Autogits</title><link href="https://mmarhin.github.io/gsoc2026blog/gsoc/opensuse/autogits/2026/06/18/pre-gsoc-contributions.html" rel="alternate" type="text/html" title="Preparing for GSoC: My First Contributions to Autogits" /><published>2026-06-18T08:00:00+00:00</published><updated>2026-06-18T08:00:00+00:00</updated><id>https://mmarhin.github.io/gsoc2026blog/gsoc/opensuse/autogits/2026/06/18/pre-gsoc-contributions</id><content type="html" xml:base="https://mmarhin.github.io/gsoc2026blog/gsoc/opensuse/autogits/2026/06/18/pre-gsoc-contributions.html"><![CDATA[<p>Before the official GSoC coding period started, I began contributing to the
<a href="https://src.opensuse.org/git-workflow/autogits"><code class="language-plaintext highlighter-rouge">autogits</code></a> repository. These
initial tasks focused on making <code class="language-plaintext highlighter-rouge">obs-status-service</code> easier to develop, test,
and use.</p>

<p><code class="language-plaintext highlighter-rouge">obs-status-service</code> exposes Open Build Service (OBS) build results as SVG,
JSON, or XML so they can be integrated into the openSUSE Git workflow. Before
working on the issues, I studied the service, the surrounding repository, and
the connection between Gitea, Redis, and OBS.</p>

<h2 id="local-test-mode">Local Test Mode</h2>

<p>My first contribution addressed
<a href="https://src.opensuse.org/git-workflow/autogits/issues/113"><code class="language-plaintext highlighter-rouge">autogits</code> issue #113</a>,
which requested a way to run <code class="language-plaintext highlighter-rouge">obs-status-service</code> locally without requiring a
real Redis server.</p>

<p>The implementation included:</p>

<ul>
  <li>Creating a mock Redis client for local development.</li>
  <li>Providing a test mode that runs without an external Redis instance.</li>
  <li>Loading realistic OBS test data from a compressed JSON file.</li>
</ul>

<p>I submitted these changes in
<a href="https://src.opensuse.org/git-workflow/autogits/pulls/118">pull request #118</a>.
This reduces the infrastructure required to start contributing. Developers can
run the service locally, inspect realistic project and package results, and
test changes without first configuring access to an OBS Redis server.</p>

<h2 id="default-service-page">Default Service Page</h2>

<p>My second contribution worked on
<a href="https://src.opensuse.org/git-workflow/autogits/issues/114"><code class="language-plaintext highlighter-rouge">autogits</code> issue #114</a>.
Previously, visiting the root URL of <code class="language-plaintext highlighter-rouge">obs-status-service</code> only returned a 404
response. The goal was to provide a useful landing page for the service.</p>

<p>I created a small interface where users can enter an OBS project, package,
repository, and architecture. The page builds the corresponding status URL,
shows an SVG preview, and generates a Markdown snippet that can be copied into a
README. This makes the available endpoints easier to discover and avoids
requiring users to construct their URLs manually. I also separated the static
assets and used
<a href="https://picocss.com/">Pico CSS</a> for lightweight styling.</p>

<p>This work was submitted in
<a href="https://src.opensuse.org/git-workflow/autogits/pulls/119">pull request #119</a>.</p>

<h2 id="preparing-the-project">Preparing the Project</h2>

<p>Both contributions improve the entry points to the project: one makes the
development environment more accessible, while the other makes the service
more understandable for its users. They also established a useful foundation
for the main GSoC work on improving how OBS build results are generated,
displayed, and integrated into the Git workflow.</p>]]></content><author><name></name></author><category term="gsoc" /><category term="opensuse" /><category term="autogits" /><summary type="html"><![CDATA[Before the official GSoC coding period started, I began contributing to the autogits repository. These initial tasks focused on making obs-status-service easier to develop, test, and use.]]></summary></entry><entry><title type="html">Accepted into Google Summer of Code 2026 with openSUSE!</title><link href="https://mmarhin.github.io/gsoc2026blog/gsoc/opensuse/2026/05/26/accepted-into-gsoc.html" rel="alternate" type="text/html" title="Accepted into Google Summer of Code 2026 with openSUSE!" /><published>2026-05-26T08:30:00+00:00</published><updated>2026-05-26T08:30:00+00:00</updated><id>https://mmarhin.github.io/gsoc2026blog/gsoc/opensuse/2026/05/26/accepted-into-gsoc</id><content type="html" xml:base="https://mmarhin.github.io/gsoc2026blog/gsoc/opensuse/2026/05/26/accepted-into-gsoc.html"><![CDATA[<p>I am extremely excited to announce that I have been selected to participate in <strong>Google Summer of Code (GSoC) 2026</strong>! I will be contributing to the <strong>openSUSE Project</strong>.</p>

<h3 id="the-project-enhancing-opensuse-git-workflow">The Project: Enhancing openSUSE Git Workflow</h3>

<p>During the next 12 weeks, I will be working on improving the <code class="language-plaintext highlighter-rouge">obs-status-service</code>. Under the mentorship of <strong>Daniel García Moreno (dgarcia)</strong> and <strong>Doug</strong>, my main objectives include:</p>

<ul>
  <li><strong>Improving Visualizations:</strong> Extending the Go tool to generate better SVG images with new CSS styles and making them interactive with JavaScript.</li>
  <li><strong>Gitea Bot Integration:</strong> Implementing a new bot for Gitea that provides useful build information directly inside Pull Requests.</li>
  <li><strong>AI Integration (Stretch Goal):</strong> Exploring the use of AI through <a href="https://www.logdetective.com/">Log Detective</a> to analyze and assist with PRs that fail to build.</li>
</ul>

<h3 id="moving-forward">Moving Forward</h3>

<p>Given the dynamic nature of the GSoC program and software development itself, it’s very likely that these initial goals will adapt and change slightly as the weeks go by.</p>

<p>I’m ready to learn, face new challenges, and contribute to the open-source community. Stay tuned, as I will be posting my weekly progress right here!</p>]]></content><author><name></name></author><category term="gsoc" /><category term="opensuse" /><summary type="html"><![CDATA[I am extremely excited to announce that I have been selected to participate in Google Summer of Code (GSoC) 2026! I will be contributing to the openSUSE Project.]]></summary></entry></feed>