<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>DevOps on Junian Dev</title>
    <link>https://www.junian.dev/tags/devops/</link>
    <description>Recent content in DevOps on Junian Dev</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <managingEditor>author@junian.dev (Junian Triajianto)</managingEditor>
    <webMaster>author@junian.dev (Junian Triajianto)</webMaster>
    <copyright>Copyright &amp;copy; 2014 - 2026 Junian.dev</copyright>
    
	    <atom:link href="https://www.junian.dev/tags/devops/index.xml" rel="self" type="application/rss+xml" />
    
    <item>
      <title>How to Create an Empty Orphan Git Branch</title>
      <link>https://www.junian.dev/dev/git-create-orphan-branch/</link>
      <pubDate>Fri, 06 Feb 2026 19:00:00 +0700</pubDate>
      <author>author@junian.dev (Junian Triajianto)</author>
      <guid>https://www.junian.dev/dev/git-create-orphan-branch/</guid>
      <description>&lt;p&gt;Have you ever wanted to create a new, separate Git branch that doesn’t have any starting point from an existing branch?&lt;/p&gt;
&lt;p&gt;One common use case is from the early days of GitHub, when you needed to create a separate empty branch called &lt;code&gt;gh-pages&lt;/code&gt;. This branch was orphaned, meaning it had no relationship to the &lt;code&gt;master&lt;/code&gt; or &lt;code&gt;main&lt;/code&gt; branch, and was used to publish documentation sites to GitHub Pages.&lt;/p&gt;
&lt;p&gt;This approach makes sense because you don’t want to upload your application source code from the &lt;code&gt;main&lt;/code&gt; branch to GitHub Pages—only the static assets such as HTML, CSS, JavaScript, and other resources required for a static site.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Rotate Video with FFmpeg</title>
      <link>https://www.junian.dev/tech/ffmpeg-rotate-video/</link>
      <pubDate>Sun, 01 Feb 2026 19:00:00 +0700</pubDate>
      <author>author@junian.dev (Junian Triajianto)</author>
      <guid>https://www.junian.dev/tech/ffmpeg-rotate-video/</guid>
      <description>&lt;p&gt;Sometimes after recording a video using my iPhone, I notice that the orientation is wrong.
For example, when I intend to record a vertical video, the final result ends up being horizontal.
This happens because the Camera app uses the accelerometer to detect the video orientation at the moment recording starts.&lt;/p&gt;
&lt;p&gt;Of course, with the built-in Photos app, I can rotate the video easily.
But what if I need to do this on another machine, such as a Raspberry Pi?&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to Deploy a Blazor WebAssembly Standalone App to GitHub Pages</title>
      <link>https://www.junian.dev/dev/deploy-blazor-webassembly-standalone-to-github-pages/</link>
      <pubDate>Fri, 30 Jan 2026 19:00:00 +0700</pubDate>
      <author>author@junian.dev (Junian Triajianto)</author>
      <guid>https://www.junian.dev/dev/deploy-blazor-webassembly-standalone-to-github-pages/</guid>
      <description>&lt;p&gt;If you have ever built a .NET Blazor WebAssembly app, you may have separated the frontend and backend.
Since Blazor WASM is essentially just the frontend, you can deploy it to most static site hosting services, including GitHub Pages.&lt;/p&gt;
&lt;p&gt;Let’s get straight to the point. Follow these steps to create, publish, and deploy your standalone Blazor WebAssembly app.&lt;/p&gt;
&lt;p&gt;Install the latest &lt;a href=&#34;https://dotnet.microsoft.com/en-us/download&#34;&gt;.NET SDK&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Create a new Blazor WebAssembly standalone app project. Let’s name it &lt;code&gt;BlazorApp&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Deploy a .NET 10 Blazor WebAssembly App to Cloudflare Pages</title>
      <link>https://www.junian.dev/dev/deploy-blazor-to-cloudflare-pages/</link>
      <pubDate>Wed, 28 Jan 2026 07:06:56 +0700</pubDate>
      <author>author@junian.dev (Junian Triajianto)</author>
      <guid>https://www.junian.dev/dev/deploy-blazor-to-cloudflare-pages/</guid>
      <description>&lt;p&gt;Blazor is a modern way to build web applications.
Instead of relying on JavaScript, it allows you to use C#.
That’s the dream!
In this guide, you’ll learn how to create a web application using Blazor and deploy it online using Cloudflare Pages.&lt;/p&gt;
&lt;p&gt;Enough introduction. Let’s get started!&lt;/p&gt;
&lt;h2 id=&#34;install-net-10&#34;&gt;Install .NET 10&lt;/h2&gt;
&lt;p&gt;Blazor works with C#.
To start a Blazor project, you need to install the .NET SDK.
Simply &lt;a href=&#34;https://dotnet.microsoft.com/download&#34;&gt;download it&lt;/a&gt; and follow the installation instructions from the &lt;a href=&#34;https://dotnet.microsoft.com/download&#34;&gt;official website&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>GitHub Actions Bot Username and Email Address</title>
      <link>https://www.junian.dev/dev/github-actions-bot-username-email-address/</link>
      <pubDate>Mon, 29 Sep 2025 06:09:12 +0700</pubDate>
      <author>author@junian.dev (Junian Triajianto)</author>
      <guid>https://www.junian.dev/dev/github-actions-bot-username-email-address/</guid>
      <description>&lt;p&gt;When writing a GitHub workflow, you may want it to automatically commit changes.&lt;/p&gt;
&lt;p&gt;To distinguish between commits made by humans and those made by bots, set the committer name and email address to the GitHub Actions Bot.&lt;/p&gt;
&lt;p&gt;Here are the details:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Username: &lt;code&gt;github-actions[bot]&lt;/code&gt;&lt;br&gt;
Email: &lt;code&gt;41898282+github-actions[bot]@users.noreply.github.com&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;You can configure these details for &lt;code&gt;git&lt;/code&gt; with:&lt;/p&gt;

&lt;figure class=&#34;highlight&#34;&gt;
    &lt;button class=&#34;btn-clipboard chroma&#34; title=&#34;Copy to clipboard&#34;&gt;&lt;i class=&#34;fa icon-clipboard&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 24 24&#34; class=&#34;feather feather-copy&#34;&gt;&lt;rect x=&#34;9&#34; y=&#34;9&#34; width=&#34;13&#34; height=&#34;13&#34; rx=&#34;2&#34; ry=&#34;2&#34;/&gt;&lt;path d=&#34;M5 15H4a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h9a2 2 0 0 1 2 2v1&#34;/&gt;&lt;/svg&gt;&lt;/i&gt;&lt;span class=&#34;msg-clipboard&#34;&gt;&lt;/span&gt;&lt;/button&gt;
    &lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git config --global user.name &lt;span class=&#34;s2&#34;&gt;&amp;#34;github-actions[bot]&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;git config --global user.email &lt;span class=&#34;s2&#34;&gt;&amp;#34;41898282+github-actions[bot]@users.noreply.github.com&amp;#34;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
    
&lt;/figure&gt;&lt;p&gt;Here is an example workflow step that commits and pushes changes if any files have been modified:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Automating Git Cleanup Across Multiple Directories with a Shell Script</title>
      <link>https://www.junian.dev/dev/multiple-git-repos-cleanup/</link>
      <pubDate>Tue, 17 Dec 2024 15:42:26 +0700</pubDate>
      <author>author@junian.dev (Junian Triajianto)</author>
      <guid>https://www.junian.dev/dev/multiple-git-repos-cleanup/</guid>
      <description>&lt;p&gt;Managing multiple Git repositories can be a tedious task.
One task I often perform is ensuring each repository is clean and reset to its original state.
Instead of manually navigating into each directory and running Git commands, I like to automate the process with a simple shell script.&lt;/p&gt;
&lt;h2 id=&#34;objective-of-the-script&#34;&gt;Objective of the Script&lt;/h2&gt;
&lt;p&gt;This script automates two key tasks for all Git repositories in the current working directory:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;git clean -fdx&lt;/code&gt;&lt;/strong&gt;: Removes untracked files, directories, and ignored files.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;git reset --hard HEAD&lt;/code&gt;&lt;/strong&gt;: Resets the repository to the last commit, discarding all local changes.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The script loops through each directory, checks if it’s a Git repository, and then performs the cleanup operations.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Simple OpenVPN Server Set Up with Docker</title>
      <link>https://www.junian.dev/dev/docker-openvpn-server/</link>
      <pubDate>Thu, 22 Aug 2019 11:02:53 +0700</pubDate>
      <author>author@junian.dev (Junian Triajianto)</author>
      <guid>https://www.junian.dev/dev/docker-openvpn-server/</guid>
      <description>&lt;p&gt;When I was doing some works, there was a requirement to whitelist development machine by IP Address from the United States.
Since I was located in one of South East Asia countries, obviously I didn&amp;rsquo;t have a connection with US IP Address.
So it would be reasonable to buy a VPN service for this.&lt;/p&gt;
&lt;p&gt;But why buy a VPN service if we could use the existing VPS and set up a VPN server on it?&lt;/p&gt;</description>
    </item>
    <item>
      <title>Xamarin Mobile Apps Continuous Integration and Delivery with Jenkins and HockeyApp</title>
      <link>https://www.junian.dev/dev/xamarin-jenkins-hockeyapp/</link>
      <pubDate>Tue, 30 May 2017 09:38:00 +0000</pubDate>
      <author>author@junian.dev (Junian Triajianto)</author>
      <guid>https://www.junian.dev/dev/xamarin-jenkins-hockeyapp/</guid>
      <description>&lt;p&gt;Laziness is probably the middle name of every programmer, especially when it comes to doing repetitive (usually) boring stuff, again and again. One of them is building app from latest source code.&lt;/p&gt;
&lt;p&gt;Traditionally, we commit our work, pull our colleague&amp;rsquo;s code, merge them, build the binary file, and send it to testers. Not sure how many times we do that stuff every day.&lt;/p&gt;
&lt;p&gt;Luckily, there is always a solution for that kind of repetitive task, by using Continuous Integration (CI) and Continuous Delivery (CD).&lt;/p&gt;</description>
    </item>
    
  </channel>
</rss>
